<?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>76770</bug_id>
          
          <creation_ts>2012-01-20 22:26:33 -0800</creation_ts>
          <short_desc>Loop invariant code motion in JSC DFG</short_desc>
          <delta_ts>2012-03-06 06:23:22 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></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>
          <dependson>79899</dependson>
    
    <dependson>80415</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yuqiang Xian">yuqiang.xian</reporter>
          <assigned_to name="Yuqiang Xian">yuqiang.xian</assigned_to>
          <cc>barraclough</cc>
    
    <cc>fpizlo</cc>
    
    <cc>rakuco</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>540059</commentid>
    <comment_count>0</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-01-20 22:26:33 -0800</bug_when>
    <thetext>Current JSC DFG JIT lacks the optimization of loop invariant code motion. Here&apos;s an attempt to see the feasibility.
Some WIP patch have been made, but it definitely has many problems to be solved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>540069</commentid>
    <comment_count>1</comment_count>
      <attachid>123434</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-01-20 23:07:19 -0800</bug_when>
    <thetext>Created attachment 123434
WIP

WIP patch. NOT ready for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545848</commentid>
    <comment_count>2</comment_count>
      <attachid>124682</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-01-31 01:16:57 -0800</bug_when>
    <thetext>Created attachment 124682
WIP patch

This patch passes the tests (tested on Linux IA32), and demonstrates performance benefit on several benchmark cases. While on some cases (especially SunSpider) some obvious regressions are observed. Further investigation is ongoing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546903</commentid>
    <comment_count>3</comment_count>
      <attachid>124904</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-01 01:37:36 -0800</bug_when>
    <thetext>Created attachment 124904
WIP patch

This patch fixed the performance regression on the SunSpider benchmark, which was caused by that LICM revealed some CFA analysis problems and caused OSR failures. With this fix also no obvious performance regression is observed on Kraken or V8. But seems two cases having correctness problem: v8-crypto and kraken imaging-gaussian-blur. Still under investigation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547049</commentid>
    <comment_count>4</comment_count>
      <attachid>124942</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-01 06:28:06 -0800</bug_when>
    <thetext>Created attachment 124942
WIP patch

Fixed the OSR entry problem as we adjusted the entry point to the loop preHeader, we need to rearrange the place of op_loop_hint which is used to trigger loop optimizations and code replacement. This fix passed the v8-crypto case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547730</commentid>
    <comment_count>5</comment_count>
      <attachid>125098</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-02 01:26:08 -0800</bug_when>
    <thetext>Created attachment 125098
WIP patch

Fixed OSR exit issues after LICM. The hoisted loop invariant operations should not impact OSR exit inside the loop. Some tweaks are made to ensure the state is correct at OSR exit.
Also fixed some issues related to nested loops. We have to copy the loop invariants of the outer loops to the inner loops as the inner loop can be the OSR entry, the hoisted nodes of the outer loop should be evaluated as well when we perform OSR at the inner loop. This, however, makes the LICM for non-leaf (non-innermost) loops meaningless but wasteful, unless we figure out a better solution in the future. So currently we only perform LICM for the innermost loops.

This passes the JavaScriptCore tests and the 3 standard benchmarks. Here&apos;s the performance result tested on Linux IA32 (5% improvement on Kraken):

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                               ToT                     LICM
SunSpider:
   3d-cube                                6.7024+-0.0844          6.6755+-0.0673
   3d-morph                              11.3632+-0.0167    ^    11.2263+-0.0446       ^ definitely 1.0122x faster
   3d-raytrace                            9.5948+-0.0627    ?     9.5970+-0.0621       ?
   access-binary-trees                    1.8342+-0.0272    ?     1.8512+-0.0423       ?
   access-fannkuch                       10.6713+-0.0564    ?    10.7571+-0.0341       ?
   access-nbody                           5.4339+-0.0592          5.4261+-0.0802
   access-nsieve                          3.9822+-0.0382    ?     4.0274+-0.0529       ? might be 1.0113x slower
   bitops-3bit-bits-in-byte               1.1977+-0.0334    ?     1.2104+-0.0367       ? might be 1.0107x slower
   bitops-bits-in-byte                    4.6181+-0.0481    ?     4.6247+-0.0422       ?
   bitops-bitwise-and                     4.2526+-0.0515    ?     4.2663+-0.0442       ?
   bitops-nsieve-bits                     6.7337+-0.1113    ?     6.7368+-0.1024       ?
   controlflow-recursive                  2.8045+-0.0335          2.7933+-0.0401
   crypto-aes                             9.3455+-0.1455    !     9.6886+-0.1714       ! definitely 1.0367x slower
   crypto-md5                             3.0062+-0.0348    !     3.0934+-0.0524       ! definitely 1.0290x slower
   crypto-sha1                            2.6093+-0.0355    !     2.7390+-0.0361       ! definitely 1.0497x slower
   date-format-tofte                     12.2485+-0.0833         12.1951+-0.0920
   date-format-xparb                     11.6320+-0.1265         11.6023+-0.1296
   math-cordic                            9.1956+-0.0535          9.1807+-0.0562
   math-partial-sums                     13.9002+-0.0539         13.8929+-0.0490
   math-spectral-norm                     2.6203+-0.0485    ?     2.6545+-0.0430       ? might be 1.0131x slower
   regexp-dna                             8.6963+-0.1054    ?     8.7113+-0.0790       ?
   string-base64                          5.6049+-0.1043    !     5.9174+-0.0527       ! definitely 1.0558x slower
   string-fasta                           9.0395+-0.0556    ?     9.0681+-0.0532       ?
   string-tagcloud                       15.5883+-0.0835    ?    15.6098+-0.0709       ?
   string-unpack-code                    24.9881+-0.0437    !    25.1207+-0.0666       ! definitely 1.0053x slower
   string-validate-input                  7.2133+-0.0404    !     7.5982+-0.0787       ! definitely 1.0534x slower

   &lt;arithmetic&gt; *                         7.8799+-0.0311    ?     7.9332+-0.0308       ? might be 1.0068x slower
   &lt;geometric&gt;                            6.2946+-0.0264    !     6.3572+-0.0291       ! definitely 1.0099x slower
   &lt;harmonic&gt;                             4.8063+-0.0290    ?     4.8670+-0.0343       ? might be 1.0126x slower

                                               ToT                     LICM
V8:
   crypto                                95.9089+-0.4916    ?    96.6358+-0.3024       ?
   deltablue                            161.3032+-1.3059    !   169.7393+-0.6635       ! definitely 1.0523x slower
   earley-boyer                         111.0482+-0.1805    !   111.5194+-0.2230       ! definitely 1.0042x slower
   raytrace                              53.5053+-0.3817    ?    53.8410+-0.4282       ?
   regexp                               101.7867+-0.7919        101.7171+-0.5630
   richards                             178.0875+-0.3938        176.8360+-0.8624
   splay                                 79.9467+-0.3718    ?    80.1138+-0.5397       ?
 
   &lt;arithmetic&gt;                         111.6552+-0.2536    !   112.9146+-0.1850       ! definitely 1.0113x slower
   &lt;geometric&gt; *                        104.1782+-0.2344    !   105.1263+-0.2347       ! definitely 1.0091x slower
   &lt;harmonic&gt;                            96.8544+-0.2634    !    97.5583+-0.3083       ! definitely 1.0073x slower

                                               ToT                     LICM
Kraken:
   ai-astar                             782.8823+-1.0568    ^   633.1314+-0.8283       ^ definitely 1.2365x faster
   audio-beat-detection                 239.2905+-0.9386    !   244.7953+-0.2533       ! definitely 1.0230x slower
   audio-dft                            367.3076+-5.3766    ^   334.5632+-1.9583       ^ definitely 1.0979x faster
   audio-fft                            156.4270+-1.7812    ^   152.5042+-0.2279       ^ definitely 1.0257x faster
   audio-oscillator                     344.2403+-1.5722    ^   340.8509+-1.6079       ^ definitely 1.0099x faster
   imaging-darkroom                     381.9911+-8.0960        381.6292+-8.9160
   imaging-desaturate                   304.5713+-0.6926    ?   304.8006+-0.7142       ?
   imaging-gaussian-blur                591.3785+-3.0221    ^   585.7728+-1.4615       ^ definitely 1.0096x faster
   json-parse-financial                  68.3235+-0.5355    !    69.5250+-0.3486       ! definitely 1.0176x slower
   json-stringify-tinderbox             103.2334+-1.0090        103.1331+-1.0498
   stanford-crypto-aes                  115.8342+-0.3116        115.7750+-0.5165
   stanford-crypto-ccm                  117.2265+-0.7123    ?   117.2419+-0.6766       ?
   stanford-crypto-pbkdf2               231.5518+-0.2709    !   233.3329+-0.6611       ! definitely 1.0077x slower
   stanford-crypto-sha256-iterative     100.2526+-0.1269    ?   100.3860+-0.2462       ?

   &lt;arithmetic&gt; *                       278.8936+-1.2346    ^   265.5315+-0.8722       ^ definitely 1.0503x faster
   &lt;geometric&gt;                          218.5252+-0.9039    ^   213.8505+-0.6057       ^ definitely 1.0219x faster
   &lt;harmonic&gt;                           173.1445+-0.6771        172.3007+-0.4488         might be 1.0049x faster

                                               ToT                     LICM
All benchmarks:
   &lt;arithmetic&gt;                         104.0633+-0.3907    ^   100.3002+-0.2844       ^ definitely 1.0375x faster
   &lt;geometric&gt;                           27.5025+-0.0963    ?    27.5131+-0.0953       ? might be 1.0004x slower
   &lt;harmonic&gt;                             8.4492+-0.0499    ?     8.5531+-0.0588       ? might be 1.0123x slower

                                               ToT                     LICM
Geomean of preferred means:
   &lt;scaled-result&gt;                       61.1753+-0.1828    ^    60.5004+-0.1703       ^ definitely 1.0112x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548565</commentid>
    <comment_count>6</comment_count>
      <attachid>125286</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-03 01:27:29 -0800</bug_when>
    <thetext>Created attachment 125286
WIP patch

Updated patch.

Generate new Phi nodes for the new GetLocals created by LICM, and update the block variable information as well. Also this requires Phi stack processing after LICM, so moved the Phi stack processing logic from DFGByteCodeParser to DFGGraph. With this we can correctly propagate abstract values through blocks.

Performance result is here (tested on Linux ia32). Still 5% on Kraken but ~1% loss on V8 (mostly due to 5% regression on deltablue, under investigation).

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                               ToT                     LICM
SunSpider:
   3d-cube                                6.7185+-0.0922          6.6918+-0.0762
   3d-morph                              11.3808+-0.0780         11.2993+-0.1254
   3d-raytrace                            9.5044+-0.0562    ?     9.5743+-0.0985       ?
   access-binary-trees                    1.9286+-0.0692          1.9212+-0.0414
   access-fannkuch                       10.7387+-0.0590    ?    10.8040+-0.0870       ?
   access-nbody                           5.4588+-0.0946          5.4444+-0.0900
   access-nsieve                          3.9970+-0.0378    ?     4.0700+-0.0391       ? might be 1.0183x slower
   bitops-3bit-bits-in-byte               1.1835+-0.0353    ?     1.2043+-0.0374       ? might be 1.0176x slower
   bitops-bits-in-byte                    4.6397+-0.0533    ?     4.6637+-0.0567       ?
   bitops-bitwise-and                     4.2493+-0.0640    ?     4.3000+-0.0913       ? might be 1.0119x slower
   bitops-nsieve-bits                     6.8605+-0.0976          6.8071+-0.1341
   controlflow-recursive                  2.8164+-0.0562          2.7959+-0.0489
   crypto-aes                             9.3053+-0.1653    !     9.6577+-0.1640       ! definitely 1.0379x slower
   crypto-md5                             3.0033+-0.0699    ?     3.0361+-0.0668       ? might be 1.0109x slower
   crypto-sha1                            2.6658+-0.0808    ?     2.7173+-0.0983       ? might be 1.0193x slower
   date-format-tofte                     12.2253+-0.1308         12.1408+-0.0981
   date-format-xparb                     11.8267+-0.1292    ?    11.9841+-0.1144       ? might be 1.0133x slower
   math-cordic                            9.2232+-0.0671          9.2085+-0.0893
   math-partial-sums                     13.9079+-0.0590         13.8841+-0.0717
   math-spectral-norm                     2.6601+-0.0649          2.6535+-0.0245
   regexp-dna                             8.6890+-0.0961    ?     8.7138+-0.1023       ?
   string-base64                          5.5912+-0.1123    ?     5.6279+-0.1022       ?
   string-fasta                           9.0830+-0.0981          9.0396+-0.0898
   string-tagcloud                       15.6098+-0.1030         15.5510+-0.0992
   string-unpack-code                    25.1136+-0.1364    ?    25.3173+-0.1788       ?
   string-validate-input                  7.1972+-0.0982    !     7.3726+-0.0725       ! definitely 1.0244x slower

   &lt;arithmetic&gt; *                         7.9068+-0.0292    ?     7.9416+-0.0340       ? might be 1.0044x slower
   &lt;geometric&gt;                            6.3250+-0.0232    ?     6.3579+-0.0324       ? might be 1.0052x slower
   &lt;harmonic&gt;                             4.8379+-0.0248    ?     4.8711+-0.0402       ? might be 1.0069x slower

                                               ToT                     LICM
V8:
   crypto                                96.5485+-0.4716    ?    97.1088+-0.3119       ?
   deltablue                            161.8844+-1.1480    !   169.9394+-0.6498       ! definitely 1.0498x slower
   earley-boyer                         110.8333+-0.2826    ?   111.4147+-0.3258       ?
   raytrace                              53.8090+-0.3647    ?    54.4755+-0.8030       ? might be 1.0124x slower
   regexp                               102.4384+-0.5489        101.6221+-0.3126
   richards                             178.8249+-0.6137    ^   177.3008+-0.6436       ^ definitely 1.0086x faster
   splay                                 80.6917+-0.8164         80.3112+-0.4530

   &lt;arithmetic&gt;                         112.1472+-0.1864    !   113.1675+-0.1549       ! definitely 1.0091x slower
   &lt;geometric&gt; *                        104.6812+-0.2472    !   105.4402+-0.2689       ! definitely 1.0073x slower
   &lt;harmonic&gt;                            97.3662+-0.3320    ?    97.9646+-0.4274       ? might be 1.0061x slower

                                               ToT                     LICM
Kraken:
   ai-astar                             788.3627+-1.2834    ^   638.5571+-1.1142       ^ definitely 1.2346x faster
   audio-beat-detection                 240.0238+-1.4097    ^   238.3298+-0.2238       ^ definitely 1.0071x faster
   audio-dft                            368.1261+-3.4572    ^   331.3670+-3.5713       ^ definitely 1.1109x faster
   audio-fft                            154.1395+-0.1606    ^   153.0288+-0.1039       ^ definitely 1.0073x faster
   audio-oscillator                     347.4398+-2.4043    ^   339.9551+-1.3986       ^ definitely 1.0220x faster
   imaging-darkroom                     378.8966+-9.4751        377.5207+-8.5424
   imaging-desaturate                   305.9519+-0.7818    ?   307.2358+-1.8061       ?
   imaging-gaussian-blur                593.0994+-1.0883    ^   591.0285+-0.7286       ^ definitely 1.0035x faster
   json-parse-financial                  67.7004+-0.4985    !    69.3780+-0.6205       ! definitely 1.0248x slower
   json-stringify-tinderbox             102.5560+-0.5984        101.4284+-0.5632         might be 1.0111x faster
   stanford-crypto-aes                  115.9111+-0.4111    ^   114.9546+-0.1903       ^ definitely 1.0083x faster
   stanford-crypto-ccm                  116.3800+-0.8529    ?   116.6237+-1.0234       ?
   stanford-crypto-pbkdf2               234.4627+-1.4396    ?   235.7790+-1.5338       ?
   stanford-crypto-sha256-iterative     100.5601+-0.0904    !   101.0498+-0.2687       ! definitely 1.0049x slower

   &lt;arithmetic&gt; *                       279.5436+-1.0670    ^   265.4454+-0.9724       ^ definitely 1.0531x faster
   &lt;geometric&gt;                          218.5138+-0.7245    ^   213.3139+-0.7691       ^ definitely 1.0244x faster
   &lt;harmonic&gt;                           172.6914+-0.5036        171.6888+-0.6281         might be 1.0058x faster

                                               ToT                     LICM
All benchmarks:
   &lt;arithmetic&gt;                         104.3451+-0.3442    ^   100.3168+-0.3114       ^ definitely 1.0402x faster
   &lt;geometric&gt;                           27.5953+-0.0789         27.5063+-0.1031         might be 1.0032x faster
   &lt;harmonic&gt;                             8.5033+-0.0422    ?     8.5600+-0.0688       ? might be 1.0067x slower

                                               ToT                     LICM
Geomean of preferred means:
   &lt;scaled-result&gt;                       61.3911+-0.1767    ^    60.5751+-0.1816       ^ definitely 1.0135x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548570</commentid>
    <comment_count>7</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-03 01:30:47 -0800</bug_when>
    <thetext>CC JSC experts. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548842</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-03 10:41:46 -0800</bug_when>
    <thetext>This looks awesome!  I&apos;ll dive in to try to understand the details shortly...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548943</commentid>
    <comment_count>9</comment_count>
      <attachid>125286</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-03 12:23:49 -0800</bug_when>
    <thetext>Comment on attachment 125286
WIP patch

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

This is a really awesome piece of work.  But I have the following concerns:

1) The fact that the DFG compiler uses - and relies heavily on! - indices of nodes and blocks is a flaw that we will probably correct.  We should probably move to a world where blocks have no fixed ordering, and nodes are ordered but not indexed, so that nodes can be interjected between other nodes.  Imagine that the DFG::Graph was a linked list of nodes rather than an array - that would be one way to do it.  In this patch you are adding more code that fiddles with our weird indexing approach, both as a simplification to your approach and as a necessity.  You rely on block indices to find loops, for instance - even though your patch breaks the very indexing that it is relying on.  You then have loads of code to deal with the craziness that is our Node vector - probably that code would have been simpler if you could have just inserted nodes between other nodes.

2) The fact that the DFG compiler has SetLocal/GetLocal nodes and no notion of direct data flow links from one basic block to another is a flaw that we will probably also correct.  The DFG should be an SSA compiler; the fact that it&apos;s not that way yet is reflective of our development strategy (get the tiered compilation and basic code gen right before moving to harver things) rather than our technical vision.  Your patch both relies on, and is made more complicated by, the lack of SSA and the use of these &quot;local variables&quot;.

3) The phase introduced in this patch relies on properties of the DFG graph (like the meaning conveyed by the ordering of blocks) that it then promptly breaks.  Hence I fear that if we were to take this, we would then not be able to implement any other optimizations.

I&apos;ll have to think about this patch more, but right now I&apos;m leaning towards the following suggestion: if would likely be far more valuable if we went to implementing SSA, and got rid of the mess that is SetArgument/SetLocal/GetLocal/Phi/Flush, than trying to teach the current beast these kinds of highly technical optimizations.  My guess is that LICM would be far cleaner, easier to implement, and more maintainable if we could implement it on the DFG *after* we&apos;ve moved to something like SSA.  But maybe I could be convinced otherwise…  it&apos;s a tough call.

&gt; Source/JavaScriptCore/dfg/DFGGraph.cpp:127
&gt; +    bool mustGenerate = refCount &amp;&amp; node.mustGenerate();

Is this change necessary?  We use the mustGenerate bit to print &quot;!&quot; to indicate that regardless of ref count the node must be generated.  Separately, we marked nodes &quot;skipped&quot; if their refCount is zero.

&gt; Source/JavaScriptCore/dfg/DFGJITCompiler.h:324
&gt; +            if (!basicBlock.cfaHasVisited || basicBlock.variablesAtHead.argument(argument) == NoNode)

This looks very dangerous.  Do we ever want to enter into a block for which there is no CFA information?  Do loop pre headers do all speculation checks that the CFA assumes would have been performed?

&gt; Source/JavaScriptCore/dfg/DFGPropagator.cpp:2091
&gt; +                if (replacement &lt; m_graph.size() - 1 &amp;&amp; m_graph[replacement + 1].op == SetLocal)

It is not reliable to assume that the next node being a SetLocal means something.  Examples where this might go wrong include, but are not limited to, unsigned bit shits or post-inc and post-dec.

&gt; Source/JavaScriptCore/dfg/DFGPropagator.cpp:2304
&gt; +                    performHoist(m_compileIndex, preHeaderBlock, hoisted);
&gt; +                else if (shouldGenerate &amp;&amp; !hoistedChildren.isEmpty()) {
&gt; +                    // This node cannot be hoisted but it contains some references to the hoisted nodes.
&gt; +                    // Adjust such references by utilizing SetLocal/GetLocal for cross block references.
&gt; +                    for (unsigned i = 0; i &lt; hoistedChildren.size(); ++i)
&gt; +                        handleHoistedChild(blockIndex, hoistedChildren[i], loopInfo);

Let me try to understand: you are either hoisting (which just copies the node) or you are fixing references from the node to its children.  The latter case may effectively &quot;unhoist&quot; previously hoisted nodes, if you find that they did not have SetLocal nodes that you could easily find.  Right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549408</commentid>
    <comment_count>10</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-04 01:59:36 -0800</bug_when>
    <thetext>(In reply to comment #9)

Filip,

Thanks a lot for the comments. Yes actually I totally agree with you on the first two major concerns, and they did trouble me a lot, but I was just not as aggressive to try to change the IR form, so I tried to live with current DFG IR, which makes the optimization not as clean and easy to understand as it should be. And this is the reason why I want to have you guys notice this work at current stage, and to discuss how we should proceed.
For the 3rd major concern, I guess I don&apos;t fully understand it and maybe I need to think about it more carefully.

The responses to the specific code change concerns are inlined below.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGGraph.cpp:127
&gt; &gt; +    bool mustGenerate = refCount &amp;&amp; node.mustGenerate();
&gt; 
&gt; Is this change necessary?  We use the mustGenerate bit to print &quot;!&quot; to indicate that regardless of ref count the node must be generated.  Separately, we marked nodes &quot;skipped&quot; if their refCount is zero.
&gt; 

Because the hoisted loop invariants can have 0 refcount even if they&apos;re marked as &quot;MustGenerate&quot;, which means we&apos;re not going to generate code for them. This is, actually, caused by the &quot;unhoist&quot; as you mentioned in the last comment.

&gt; &gt; Source/JavaScriptCore/dfg/DFGJITCompiler.h:324
&gt; &gt; +            if (!basicBlock.cfaHasVisited || basicBlock.variablesAtHead.argument(argument) == NoNode)
&gt; 
&gt; This looks very dangerous.  Do we ever want to enter into a block for which there is no CFA information?  Do loop pre headers do all speculation checks that the CFA assumes would have been performed?
&gt; 

This is mainly to fix the performance regression of SunSpider. Actually we sometimes do enter into a block without CFA information (due to loop OSR). A typical case is bitops-bitwise-and in SunSpider where CFA is terminated before the loop because of a ForceOSRExit. And yes I think the speculation checks should have been performed in codegen. Please correct me if I have something missed.

&gt; &gt; Source/JavaScriptCore/dfg/DFGPropagator.cpp:2091
&gt; &gt; +                if (replacement &lt; m_graph.size() - 1 &amp;&amp; m_graph[replacement + 1].op == SetLocal)
&gt; 
&gt; It is not reliable to assume that the next node being a SetLocal means something.  Examples where this might go wrong include, but are not limited to, unsigned bit shits or post-inc and post-dec.
&gt; 

Sorry I&apos;m not very sure of the specific concern here. I check the next node (a hoisted node in the pre header) for a SetLocal simply to find a slot for saving the result of current node, which will be used by a node in the loop body.

&gt; &gt; Source/JavaScriptCore/dfg/DFGPropagator.cpp:2304
&gt; &gt; +                    performHoist(m_compileIndex, preHeaderBlock, hoisted);
&gt; &gt; +                else if (shouldGenerate &amp;&amp; !hoistedChildren.isEmpty()) {
&gt; &gt; +                    // This node cannot be hoisted but it contains some references to the hoisted nodes.
&gt; &gt; +                    // Adjust such references by utilizing SetLocal/GetLocal for cross block references.
&gt; &gt; +                    for (unsigned i = 0; i &lt; hoistedChildren.size(); ++i)
&gt; &gt; +                        handleHoistedChild(blockIndex, hoistedChildren[i], loopInfo);
&gt; 
&gt; Let me try to understand: you are either hoisting (which just copies the node) or you are fixing references from the node to its children.  The latter case may effectively &quot;unhoist&quot; previously hoisted nodes, if you find that they did not have SetLocal nodes that you could easily find.  Right?

Exactly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549754</commentid>
    <comment_count>11</comment_count>
      <attachid>125578</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-05 23:12:42 -0800</bug_when>
    <thetext>Created attachment 125578
WIP patch

Updated patch.

Fixed a performance issue on 64bit. And below is current performance result on 64bit (Mac OS X x64): 6% on Kraken, neutral on SunSpider and V8. While a regression on bitops-bitwise-and is observed.

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.

                                                1                       2
SunSpider:
   3d-cube                                5.8913+-0.0639          5.7923+-0.0798         might be 1.0171x faster
   3d-morph                               9.0526+-0.1103          8.8874+-0.0843         might be 1.0186x faster
   3d-raytrace                            8.2938+-0.0847          8.2594+-0.0928
   access-binary-trees                    1.9285+-0.0400    ?     1.9730+-0.1197       ? might be 1.0231x slower
   access-fannkuch                        7.3069+-0.2342    ?     7.3645+-0.1027       ?
   access-nbody                           3.9577+-0.0472          3.9405+-0.0286
   access-nsieve                          3.6470+-0.1076          3.6145+-0.0584
   bitops-3bit-bits-in-byte               1.2537+-0.0261    ^     1.1556+-0.0041       ^ definitely 1.0850x faster
   bitops-bits-in-byte                    5.0807+-0.0462    ?     5.1419+-0.0429       ? might be 1.0120x slower
   bitops-bitwise-and                     3.1656+-0.0106    !     3.6648+-0.0345       ! definitely 1.1577x slower
   bitops-nsieve-bits                     5.5132+-0.0480          5.5014+-0.0275
   controlflow-recursive                  2.2947+-0.0261          2.2853+-0.0230
   crypto-aes                             8.3225+-0.0566    !     8.6046+-0.0619       ! definitely 1.0339x slower
   crypto-md5                             2.5425+-0.0281    ?     2.5443+-0.0252       ?
   crypto-sha1                            2.6004+-0.3497          2.3593+-0.0270         might be 1.1022x faster
   date-format-tofte                     11.6510+-0.0687    ^    11.0868+-0.0504       ^ definitely 1.0509x faster
   date-format-xparb                     10.4985+-0.2820         10.2481+-0.3466         might be 1.0244x faster
   math-cordic                            7.5448+-0.7898          7.4206+-0.5456         might be 1.0167x faster
   math-partial-sums                     10.5491+-0.0809    ^    10.3707+-0.0560       ^ definitely 1.0172x faster
   math-spectral-norm                     2.6146+-0.0112    !     2.7388+-0.1040       ! definitely 1.0475x slower
   regexp-dna                             8.9686+-0.0631          8.8430+-0.0749         might be 1.0142x faster
   string-base64                          4.9485+-0.0286    ?     4.9680+-0.0241       ?
   string-fasta                           7.8256+-0.0639    ?     7.9127+-0.0954       ? might be 1.0111x slower
   string-tagcloud                       13.2538+-0.1385         13.1118+-0.1419         might be 1.0108x faster
   string-unpack-code                    21.7408+-0.2276    ?    22.1923+-0.5740       ? might be 1.0208x slower
   string-validate-input                  6.2486+-0.0706    ?     6.2526+-0.0283       ?

   &lt;arithmetic&gt; *                         6.7960+-0.0357          6.7782+-0.0337         might be 1.0026x faster
   &lt;geometric&gt;                            5.5197+-0.0369          5.5096+-0.0249         might be 1.0018x faster
   &lt;harmonic&gt;                             4.3784+-0.0444          4.3500+-0.0315         might be 1.0065x faster
                                                1                       2
                                                1                       2
V8:
   crypto                                77.1976+-0.3123    ^    76.6700+-0.1480       ^ definitely 1.0069x faster
   deltablue                            150.1328+-1.1223    !   153.9579+-0.8058       ! definitely 1.0255x slower
   earley-boyer                          96.8689+-3.0327         96.2447+-3.0111
   raytrace                              50.0781+-0.1724    ^    49.7800+-0.1110       ^ definitely 1.0060x faster
   regexp                                96.1729+-0.3955    ?    96.3467+-0.3682       ?
   richards                             133.8968+-0.2056    !   136.5811+-0.7893       ! definitely 1.0200x slower
   splay                                 69.9721+-0.6299         69.4475+-0.7878

   &lt;arithmetic&gt;                          96.3313+-0.4623    ?    97.0040+-0.5518       ? might be 1.0070x slower
   &lt;geometric&gt; *                         90.7276+-0.4666    ?    90.9880+-0.5441       ? might be 1.0029x slower
   &lt;harmonic&gt;                            85.2748+-0.4300         85.2214+-0.4890         might be 1.0006x faster

                                                1                       2
Kraken:
   ai-astar                             795.3290+-0.5676    ^   636.2741+-0.7378       ^ definitely 1.2500x faster
   audio-beat-detection                 193.7537+-9.1111        185.6565+-0.4666         might be 1.0436x faster
   audio-dft                            456.0760+-0.8572    ^   443.2001+-0.8911       ^ definitely 1.0291x faster
   audio-fft                            122.3903+-7.5545        116.6115+-0.1681         might be 1.0496x faster
   audio-oscillator                     281.1231+-3.1010    ^   267.4259+-3.1168       ^ definitely 1.0512x faster
   imaging-darkroom                     295.2771+-6.0876        294.8097+-7.3344
   imaging-desaturate                   228.0868+-0.2582    ?   229.5187+-3.8357       ?
   imaging-gaussian-blur                501.9180+-0.1475    ^   499.6097+-0.2014       ^ definitely 1.0046x faster
   json-parse-financial                  60.5922+-3.3409         59.2392+-0.0472         might be 1.0228x faster
   json-stringify-tinderbox              83.4101+-0.1794    ^    78.7011+-0.2180       ^ definitely 1.0598x faster
   stanford-crypto-aes                   99.6793+-0.4575    ?   101.0411+-1.0317       ? might be 1.0137x slower
   stanford-crypto-ccm                  100.3830+-0.8947    ?   101.0337+-0.5908       ?
   stanford-crypto-pbkdf2               200.0138+-2.1655        199.5086+-3.1952
   stanford-crypto-sha256-iterative     103.3791+-0.5305        103.2712+-0.3110

   &lt;arithmetic&gt; *                       251.5294+-1.3646    ^   236.8501+-0.7498       ^ definitely 1.0620x faster
   &lt;geometric&gt;                          190.7950+-1.5686    ^   184.7663+-0.4824       ^ definitely 1.0326x faster
   &lt;harmonic&gt;                           149.8594+-1.5736    ^   146.7945+-0.2371       ^ definitely 1.0209x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549813</commentid>
    <comment_count>12</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-06 01:11:31 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 125286 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=125286&amp;action=review
&gt; 
&gt; 1) You rely on block indices to find loops, for instance - even though your patch breaks the very indexing that it is relying on.  
&gt; 
&gt; 3) The phase introduced in this patch relies on properties of the DFG graph (like the meaning conveyed by the ordering of blocks) that it then promptly breaks. 
&gt; 

Sorry but I guess I forgot one response. IMHO I&apos;m not breaking the block indexing in the patch. I&apos;m not creating or reordering the blocks, nor changing the control flow. The pre header blocks are preserved at the very beginning, before LICM it contains a single Jump to the loop header. Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549815</commentid>
    <comment_count>13</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-06 01:13:59 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #9)
&gt; &gt; (From update of attachment 125286 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=125286&amp;action=review
&gt; &gt; 
&gt; &gt; 1) You rely on block indices to find loops, for instance - even though your patch breaks the very indexing that it is relying on.  
&gt; &gt; 
&gt; &gt; 3) The phase introduced in this patch relies on properties of the DFG graph (like the meaning conveyed by the ordering of blocks) that it then promptly breaks. 
&gt; &gt; 
&gt; 
&gt; Sorry but I guess I forgot one response. IMHO I&apos;m not breaking the block indexing in the patch. I&apos;m not creating or reordering the blocks, nor changing the control flow. The pre header blocks are preserved at the very beginning, before LICM it contains a single Jump to the loop header. Thanks.

Ah, that&apos;s a good point.  I was confusing node ordering (you add nodes at the end) with block ordering.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549819</commentid>
    <comment_count>14</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-06 01:18:02 -0800</bug_when>
    <thetext>
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGJITCompiler.h:324
&gt; &gt; &gt; +            if (!basicBlock.cfaHasVisited || basicBlock.variablesAtHead.argument(argument) == NoNode)
&gt; &gt; 
&gt; &gt; This looks very dangerous.  Do we ever want to enter into a block for which there is no CFA information?  Do loop pre headers do all speculation checks that the CFA assumes would have been performed?
&gt; &gt; 
&gt; 
&gt; This is mainly to fix the performance regression of SunSpider. Actually we sometimes do enter into a block without CFA information (due to loop OSR). A typical case is bitops-bitwise-and in SunSpider where CFA is terminated before the loop because of a ForceOSRExit. And yes I think the speculation checks should have been performed in codegen. Please correct me if I have something missed.

If we do enter a loop through OSR without CFA information then it is simply a bug.  We should never do that.  If we do it then we should fix it!

Separate bug filed: https://bugs.webkit.org/show_bug.cgi?id=77858</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549831</commentid>
    <comment_count>15</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-06 01:28:32 -0800</bug_when>
    <thetext>The main issue I have with this patch is that it feels premature to implement this optimization given the state of the DFG IR.  It feels to me like we should proceed as follows:

- Fix register allocation and speculation bugs.  For example register allocation and operand speculation will cause terminateSpeculativeExecution() to be called if we use an int-predicted variable in a double context, and then after that try to use it in an int-context.  The double use will convert it to a double and we&apos;ll forget that it was actually an integer!

- Get rid of reference counting of nodes, at least in the early stages of graph building and optimization.  We had *lots* of bugs come in on random web pages because of bad handling of node reference counts in the fixup and CSE phases.  It would be great if we didn&apos;t do any reference counting at all, and instead relied on traditional liveness analysis for DCE.

- Switch to SSA.  This should be easy.  We already have all of the right things in place: we have an IR in which using a value means referring to its definition.  All that this will take is implementing a fast dominator tree builder (I was thinking of just using Lengauer-Tarjan) and then use it to place Phi nodes.

- Get rid of the notion that a basic block consists of a contiguous set of node indices.  This is probably the worst part of our IR, since it means that inserting a node in between nodes is really hard.

- Introduce a CFG simplification pass, probably formulated using sparse conditional constant propagation so that it does two things at once.  We might even be able to fold this into the CFA.

It feels to me like if we accomplish the above - which should not be terribly difficult - then we&apos;d be in a far better position to implement awesome optimizations, particularly since it would be easier to compartmentalize them since the inter-phase invariants of the IR would be crystal clear.

As another thought, I&apos;m kind of curious why you didn&apos;t formulate this using loop peeling rather than LICM.  Peeling is far less error-prone and would likely give you the same speed-ups.  You could even do peeling during bytecode parsing using a similar set of tricks as what we used for inlining...  But even there, I feel like those tricks are too messy.  So many bugs I had to fix because of basic block linking in the parser!  If we had a CFG simplification pass - which we currently can&apos;t do, because the lack of SSA means that we can&apos;t easily slam two blocks together without then having to do painful SetLocal/GetLocal fixup - then several hundred lines of awful code in the parser could be killed off.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550676</commentid>
    <comment_count>16</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-07 00:22:54 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; 
&gt; As another thought, I&apos;m kind of curious why you didn&apos;t formulate this using loop peeling rather than LICM.  Peeling is far less error-prone and would likely give you the same speed-ups.  

I&apos;m not sure if I fully understand it, but IMO w/o global CSE to eliminate the redundant (which means, loop invariant) expressions in the loop body. we cannot get the benefit of LICM but cause code bloat with peeling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550682</commentid>
    <comment_count>17</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-07 00:38:23 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; 
&gt; &gt; As another thought, I&apos;m kind of curious why you didn&apos;t formulate this using loop peeling rather than LICM.  Peeling is far less error-prone and would likely give you the same speed-ups.  
&gt; 
&gt; I&apos;m not sure if I fully understand it, but IMO w/o global CSE to eliminate the redundant (which means, loop invariant) expressions in the loop body. we cannot get the benefit of LICM but cause code bloat with peeling.

You&apos;re mostly right, except loop peeling by itself would buy you more speculation guard eliminations through CFA.  So it might not be a bad first step.  Of course, as with any loop peeling implementation, you&apos;d want to tune it to target loops that were relatively small to begin with.

But also, GCSE is *far* easier to implement that LICM.  Particularly if you tune it right.  You could imagine optimizing for loops whose body consisted of &lt;=N (for some small N) basic blocks.  This makes the control flow really easy to deal with in GCSE - essentially the CSE look-back has to consider, if it gets to the top of the block, whether there is either (a) just one predecessor or (b) one of the predecessors dominates the others.

Moreover, GCSE+peeling would probably give us more wins on other benchmarks that LICM by itself would not benefit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550703</commentid>
    <comment_count>18</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-07 01:12:11 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; But also, GCSE is *far* easier to implement that LICM.  Particularly if you tune it right.  You could imagine optimizing for loops whose body consisted of &lt;=N (for some small N) basic blocks.  This makes the control flow really easy to deal with in GCSE - essentially the CSE look-back has to consider, if it gets to the top of the block, whether there is either (a) just one predecessor or (b) one of the predecessors dominates the others.

If based on current DFG IR, I wonder whether peeling+GCSE is really easier than LICM to implement... But if with the improved IR (e.g., SSA) as you mentioned, GCSE might be easier - and in such case LICM should be simplified as well. :)

&gt; 
&gt; Moreover, GCSE+peeling would probably give us more wins on other benchmarks that LICM by itself would not benefit.

Agree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551102</commentid>
    <comment_count>19</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-07 10:32:02 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; But also, GCSE is *far* easier to implement that LICM.  Particularly if you tune it right.  You could imagine optimizing for loops whose body consisted of &lt;=N (for some small N) basic blocks.  This makes the control flow really easy to deal with in GCSE - essentially the CSE look-back has to consider, if it gets to the top of the block, whether there is either (a) just one predecessor or (b) one of the predecessors dominates the others.
&gt; 
&gt; If based on current DFG IR, I wonder whether peeling+GCSE is really easier than LICM to implement... But if with the improved IR (e.g., SSA) as you mentioned, GCSE might be easier - and in such case LICM should be simplified as well. :)

There are two other issues on my mind:

1) This patch&apos;s reliance on the peculiarities of the current IR will make changing IRs more difficult. And I am working on changing the IR. With any luck I&apos;ll have something that resembles SSA within a month. And then we can do GVN+GCSE+peeling+unrolling. 

2) I find it hard to visualize how to get all of the cases of OSR (both entry and exit but mostly exit) right in the presence of *any* code motion. Moving code means that we no longer have a clear OSR exit target in the old JIT. I&apos;m not sure your patch gets this right, and even if it does get it mostly right, it *will* have a nasty bug tail. Since code motion (and hoisting in particular) are not particularly effective in general for effectful languages that also have loads of safety checks (I remember that in Java it ave you nothing) and since our only LICM wins are in Kraken, which is a questionable and mostly unrealistic benchmark that we already do OK on, Im not sure it would be a wise cost-benefit trade off. 



&gt; &gt; 
&gt; &gt; Moreover, GCSE+peeling would probably give us more wins on other benchmarks that LICM by itself would not benefit.
&gt; 
&gt; Agree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551643</commentid>
    <comment_count>20</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-07 18:07:06 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; 
&gt; 1) And I am working on changing the IR. With any luck I&apos;ll have something that resembles SSA within a month. And then we can do GVN+GCSE+peeling+unrolling. 

That&apos;s cool...

&gt; 
&gt; 2) I find it hard to visualize how to get all of the cases of OSR (both entry and exit but mostly exit) right in the presence of *any* code motion. Moving code means that we no longer have a clear OSR exit target in the old JIT. I&apos;m not sure your patch gets this right, and even if it does get it mostly right, it *will* have a nasty bug tail. 

The patch tries to handle OSR exit as if there&apos;s no hoisted expression being evaluated, if the OSR exit happens in the pre header or in the loop body.

It (supposedly) achieves this by
1) Don&apos;t compileMovHint or set operand value source for the SetLocals in the pre header, which means we&apos;re not changing the value source and lastSetOperand in the pre header;
2) The codeOriginForOSR of *any* DFG node in the pre header is the origin of the original single node in the pre header before LICM - &quot;loop_preheader&quot;;
3) In the loop body, the hoisted nodes are not replaced by others but marked as &quot;NotGenerate&quot; (refcount 0), which means the SetLocals in the loop body are kept for compileMovHint to correctly record the operand value source and lastSetOperand.

These tweaks may result in some &quot;wasteful&quot; operations if OSR exit happens in the pre header (the loop invariants evaluation before OSR exit is useless but on the other hand we&apos;re exiting earlier) or the loop body (some operand values may already in the register file by SetLocal in the pre header but we will  (redundantly) re-store the value of its child node - a &quot;GetLocal&quot; actually, to the register file). But they just *want to* make the OSR exit correct.

But maybe I still have something missed...

&gt; Since code motion (and hoisting in particular) are not particularly effective in general for effectful languages that also have loads of safety checks (I remember that in Java it ave you nothing) and since our only LICM wins are in Kraken, which is a questionable and mostly unrealistic benchmark that we already do OK on, Im not sure it would be a wise cost-benefit trade off. 

I think one reason why we don&apos;t get bigger improvement by LICM is that we have to store the result of the loop invariant expression into memory at first, and then read it from memory in the loop body when used. If we have SSA and get rid of the SetLocal/GetLocals, and then have a global register allocator, the LICM improvement alone might be more promising. Also currently we hoist nodes kind of &quot;conservatively&quot;, if with deeper side effects analysis we may find more loop invariants.

But anyway, I&apos;m open to this. It&apos;s your call. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551649</commentid>
    <comment_count>21</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-07 18:15:55 -0800</bug_when>
    <thetext>
&gt; The patch tries to handle OSR exit as if there&apos;s no hoisted expression being evaluated, if the OSR exit happens in the pre header or in the loop body.
&gt; 
&gt; It (supposedly) achieves this by
&gt; 1) Don&apos;t compileMovHint or set operand value source for the SetLocals in the pre header, which means we&apos;re not changing the value source and lastSetOperand in the pre header;
&gt; 2) The codeOriginForOSR of *any* DFG node in the pre header is the origin of the original single node in the pre header before LICM - &quot;loop_preheader&quot;;
&gt; 3) In the loop body, the hoisted nodes are not replaced by others but marked as &quot;NotGenerate&quot; (refcount 0), which means the SetLocals in the loop body are kept for compileMovHint to correctly record the operand value source and lastSetOperand.
&gt; 
&gt; These tweaks may result in some &quot;wasteful&quot; operations if OSR exit happens in the pre header (the loop invariants evaluation before OSR exit is useless but on the other hand we&apos;re exiting earlier) or the loop body (some operand values may already in the register file by SetLocal in the pre header but we will  (redundantly) re-store the value of its child node - a &quot;GetLocal&quot; actually, to the register file). But they just *want to* make the OSR exit correct.
&gt; 
&gt; But maybe I still have something missed...

It seems like you probably covered everything.

But these mechanisms are already really confusing.  Also you&apos;re adding to the already confusing &quot;code origin&quot; notion for a node: first we just had a bytecode index for a node, then we had bytecode index + inline stack, and then we had bytecode index + bytecode index offset for set operation + inline stack.  

Now we will have bytecode index for debugging + bytecode index for set operation + inline stack + bytecode index for OSR exit target, the latter being conveyed implicitly by whether the node is in the pre header.

Short story: there will be bugs, and awesome ones at that. :-)

&gt; 
&gt; &gt; Since code motion (and hoisting in particular) are not particularly effective in general for effectful languages that also have loads of safety checks (I remember that in Java it ave you nothing) and since our only LICM wins are in Kraken, which is a questionable and mostly unrealistic benchmark that we already do OK on, Im not sure it would be a wise cost-benefit trade off. 
&gt; 
&gt; I think one reason why we don&apos;t get bigger improvement by LICM is that we have to store the result of the loop invariant expression into memory at first, and then read it from memory in the loop body when used. If we have SSA and get rid of the SetLocal/GetLocals, and then have a global register allocator, the LICM improvement alone might be more promising. Also currently we hoist nodes kind of &quot;conservatively&quot;, if with deeper side effects analysis we may find more loop invariants.

I&apos;ve not seen deeper side effect analysis be a win, in the past.

And you&apos;re right - SSA will be a huge benefit for this code.

&gt; 
&gt; But anyway, I&apos;m open to this. It&apos;s your call. :)

Still thinking about it.  It&apos;s a tough call.  This is an awesome patch, I&apos;m just super worried about the bug parade that will ensure. ;-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566363</commentid>
    <comment_count>22</comment_count>
      <attachid>129185</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-27 21:41:00 -0800</bug_when>
    <thetext>Created attachment 129185
Rebase

Don&apos;t worry... simply for back-up purpose. ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566416</commentid>
    <comment_count>23</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-27 23:12:17 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; Created an attachment (id=129185) [details]
&gt; Rebase
&gt; 
&gt; Don&apos;t worry... simply for back-up purpose. ;)

I would be worried if you didn&apos;t back up a rebase! :-)

I&apos;ve been thinking a lot about how to integrate your work while still maintaining my goals: maintainability and not impeding future optimizations.

I think we could do this by making the following specific refactorings, and then landing this patch, with modifications to take advantage of those refactorings:

1) We shouldn&apos;t have to do dominator-based natural loop inference.  That makes sense when the source language is gotos and labels.  In our case the source language is JS, which is structured.  I don&apos;t think it&apos;s even possible to have a back edge that isn&apos;t part of a natural loop.  The bytecode generator always knows when it&apos;s emitting a back edge, always knows what loop it&apos;s part of, and always knows all of the instructions that are part of the loop, and always knows where the header of the loop is.  It would be simpler, I think, if the bytecode generator simply recorded this information in CodeBlock and the DFG could just use it.  Better yet, we should preserve that information in the DFG&apos;s Graph and BasicBlocks and require all passes to preserve it as well.

2) BasicBlocks should not require that their nodes have contiguous indices in the graph.  A BasicBlock should instead have a Vector&lt;NodeIndex&gt; that references all of the block&apos;s nodes, in the order in which they are to be executed.  It should be possible to add nodes to a BasicBlock by (1) appending them to the graph and (2) appending their indices to the Vector&lt;NodeIndex&gt; in BasicBlock.

3) CodeOrigin should be able to say something like &quot;this code originated from X but for OSR exit should be treated as if it was at Y&quot;.  This is in addition to also saying the point Z that corresponds to the code&apos;s value profiling site.  Currently CodeOrigin stores X and Z and assumes Y == X.  But allowing for a differentiation would make hoisting really easy and robust - the OSR exit code for code hoisted by LICM would simply know that the code should exit to the loop header because Y would be set to the loop header.

4) We should at least get rid of the conflation of SetLocal as a hint to OSR and SetLocal as a mechanism for preserving state across basic blocks.  The &quot;ideal&quot; way of doing this would be to go straight to SSA.  But it may be that we don&apos;t need to do something so drastic to adopt this patch.  The main thing I worry about - and let me know if your patch handles this gracefully - is that you could have an expression in the loop like &quot;a:Foo(...); SetLocal(@a, r&lt;blah&gt;)&quot; where @a is loop-invariant but r&lt;blah&gt; is a variable that is live at the loop header because it contained other things.  Hoisting this combination could cause badness.  What we really want is to hoist just @a and have some elegant way of referring to it.  If we really wanted to, we could just create a new temporary and use SetLocal/GetLocal on that.  But that feels yucky.

It may be that (4) really does require SSA.  If so then maybe we should just do it.  It really shouldn&apos;t be that hard! :-)

But (1), (2), and (3) are totally doable.  I was thinking about doing them but I thought I&apos;d throw it out here in case you could get around to it before me.  I&apos;m bogged down with 64-bit LLInt right now, and some bizarre DFG register allocation pathologies. :-|

Please let me know if you like this development plan.  If so, feel free to create bugs for the subtasks I listed above - or any others you can think of - and make them blockers for this bug.

To be clear, I really like your LICM implementation; I just want to make sure that we integrate it in a way that makes it most profitable and least risky! :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566603</commentid>
    <comment_count>24</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-28 05:47:08 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; 
&gt; I would be worried if you didn&apos;t back up a rebase! :-)
&gt; 
&gt; I&apos;ve been thinking a lot about how to integrate your work while still maintaining my goals: maintainability and not impeding future optimizations.

Thanks for taking care of this. :)

&gt; 
&gt; I think we could do this by making the following specific refactorings, and then landing this patch, with modifications to take advantage of those refactorings:
&gt; 
&gt; 1) We shouldn&apos;t have to do dominator-based natural loop inference.  That makes sense when the source language is gotos and labels.  In our case the source language is JS, which is structured.  I don&apos;t think it&apos;s even possible to have a back edge that isn&apos;t part of a natural loop.  The bytecode generator always knows when it&apos;s emitting a back edge, always knows what loop it&apos;s part of, and always knows all of the instructions that are part of the loop, and always knows where the header of the loop is.  It would be simpler, I think, if the bytecode generator simply recorded this information in CodeBlock and the DFG could just use it.  Better yet, we should preserve that information in the DFG&apos;s Graph and BasicBlocks and require all passes to preserve it as well.

Let me try to understand your concern, and please correct me if I mis-understand it... IMHO we&apos;re not doing loop inference. For now we record the loop pre-headers in DFG when parsing the bytecode. The dominator analysis is added only for finding out the dominators of the loop exit - to filter out those blocks which may not be reached in the loop due to branches (we don&apos;t want to hoist any nodes in such blocks).

&gt; 
&gt; 2) BasicBlocks should not require that their nodes have contiguous indices in the graph.  A BasicBlock should instead have a Vector&lt;NodeIndex&gt; that references all of the block&apos;s nodes, in the order in which they are to be executed.  It should be possible to add nodes to a BasicBlock by (1) appending them to the graph and (2) appending their indices to the Vector&lt;NodeIndex&gt; in BasicBlock.
&gt; 
&gt; 3) CodeOrigin should be able to say something like &quot;this code originated from X but for OSR exit should be treated as if it was at Y&quot;.  This is in addition to also saying the point Z that corresponds to the code&apos;s value profiling site.  Currently CodeOrigin stores X and Z and assumes Y == X.  But allowing for a differentiation would make hoisting really easy and robust - the OSR exit code for code hoisted by LICM would simply know that the code should exit to the loop header because Y would be set to the loop header.

Certainly, those two are doable.

&gt; 
&gt; 4) We should at least get rid of the conflation of SetLocal as a hint to OSR and SetLocal as a mechanism for preserving state across basic blocks.  

I can&apos;t agree with you anymore on this...
In fact, I realized a bug related to OSR exit in current LICM implementation some days ago. I must admit that we have to do something with... although some tweaks/workarounds could be made based on current SetLocal mechanism, they look dirty and are really not performance friendly.

&gt;
&gt; The main thing I worry about - and let me know if your patch handles this gracefully - is that you could have an expression in the loop like &quot;a:Foo(...); SetLocal(@a, r&lt;blah&gt;)&quot; where @a is loop-invariant but r&lt;blah&gt; is a variable that is live at the loop header because it contained other things.  Hoisting this combination could cause badness.  What we really want is to hoist just @a and have some elegant way of referring to it.  If we really wanted to, we could just create a new temporary and use SetLocal/GetLocal on that.  But that feels yucky.

For such case, the current implementation will simply (conservatively) _not_ hoist either @a or the SetLocal - We track the live variables in the loop.

&gt; 
&gt; It may be that (4) really does require SSA.  If so then maybe we should just do it.  It really shouldn&apos;t be that hard! :-)
&gt; 
&gt; But (1), (2), and (3) are totally doable.  I was thinking about doing them but I thought I&apos;d throw it out here in case you could get around to it before me.  I&apos;m bogged down with 64-bit LLInt right now, and some bizarre DFG register allocation pathologies. :-|
&gt; 
&gt; Please let me know if you like this development plan.  If so, feel free to create bugs for the subtasks I listed above - or any others you can think of - and make them blockers for this bug.

Sure, I like it. :). And never mind, if you&apos;re busy and I get some time I can start some of the listed items.

&gt; 
&gt; To be clear, I really like your LICM implementation; I just want to make sure that we integrate it in a way that makes it most profitable and least risky! :-)

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567532</commentid>
    <comment_count>25</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 02:26:03 -0800</bug_when>
    <thetext>Bug 79899 is created trying to allow BasicBlocks have non-continuous node indices.

(In reply to comment #24)
&gt; 
&gt; I can&apos;t agree with you anymore on this...
&gt; In fact, I realized a bug related to OSR exit in current LICM implementation some days ago. I must admit that we have to do something with... although some tweaks/workarounds could be made based on current SetLocal mechanism, they look dirty and are really not performance friendly.

Ah... Sorry for a HUGE typo. I tended to mean &quot;I couldn&apos;t agree with you more...&quot; - forgive my poor English please.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567967</commentid>
    <comment_count>26</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 14:44:25 -0800</bug_when>
    <thetext>
&gt; &gt; 1) We shouldn&apos;t have to do dominator-based natural loop inference.  That makes sense when the source language is gotos and labels.  In our case the source language is JS, which is structured.  I don&apos;t think it&apos;s even possible to have a back edge that isn&apos;t part of a natural loop.  The bytecode generator always knows when it&apos;s emitting a back edge, always knows what loop it&apos;s part of, and always knows all of the instructions that are part of the loop, and always knows where the header of the loop is.  It would be simpler, I think, if the bytecode generator simply recorded this information in CodeBlock and the DFG could just use it.  Better yet, we should preserve that information in the DFG&apos;s Graph and BasicBlocks and require all passes to preserve it as well.
&gt; 
&gt; Let me try to understand your concern, and please correct me if I mis-understand it... IMHO we&apos;re not doing loop inference. For now we record the loop pre-headers in DFG when parsing the bytecode. The dominator analysis is added only for finding out the dominators of the loop exit - to filter out those blocks which may not be reached in the loop due to branches (we don&apos;t want to hoist any nodes in such blocks).

Ahhhh yeah you&apos;re at least more than half right. ;-)  We could do this in the bytecode generator, but it might be complicated.  Here&apos;s what I was thinking:

If you&apos;re in a loop the bytecode generator could indicate this in its context.  If it hits a conditional while in a loop, it can indicate that it&apos;s still in the loop but no longer in code that dominates the exit.  Except that this isn&apos;t quite right if you have:

loop {
    if (foo) {
        stuff;
        break;
    }
}

So then you&apos;d have to add additional checks to see if there&apos;s a break statement at the end of the conditional block, but then you&apos;d have to further handle the case of:

loop {
    if (foo) {
        stuff;
        if (bar) {
            other stuff;
            break;
        } else {
            some other stuff;
            break;
        }
    }
}

Or maybe your dominator analysis doesn&apos;t catch this either?

Just something to think about.  I definitely think that if the bytecode generator could give us this information, then it would be cheaper than computing it in the DFG.  On the other hand, having a loop analysis in the DFG carries the benefit that it will work even if it is done after the DFG has already done other control flow changes.

In short, I think you&apos;re right, but I figure I&apos;d throw this out there in case you have ideas on how to make this better.

&gt; &gt;
&gt; &gt; The main thing I worry about - and let me know if your patch handles this gracefully - is that you could have an expression in the loop like &quot;a:Foo(...); SetLocal(@a, r&lt;blah&gt;)&quot; where @a is loop-invariant but r&lt;blah&gt; is a variable that is live at the loop header because it contained other things.  Hoisting this combination could cause badness.  What we really want is to hoist just @a and have some elegant way of referring to it.  If we really wanted to, we could just create a new temporary and use SetLocal/GetLocal on that.  But that feels yucky.
&gt; 
&gt; For such case, the current implementation will simply (conservatively) _not_ hoist either @a or the SetLocal - We track the live variables in the loop.

Right.  That&apos;s probably good enough, but it makes me sad.

&gt; 
&gt; &gt; 
&gt; &gt; It may be that (4) really does require SSA.  If so then maybe we should just do it.  It really shouldn&apos;t be that hard! :-)
&gt; &gt; 
&gt; &gt; But (1), (2), and (3) are totally doable.  I was thinking about doing them but I thought I&apos;d throw it out here in case you could get around to it before me.  I&apos;m bogged down with 64-bit LLInt right now, and some bizarre DFG register allocation pathologies. :-|
&gt; &gt; 
&gt; &gt; Please let me know if you like this development plan.  If so, feel free to create bugs for the subtasks I listed above - or any others you can think of - and make them blockers for this bug.
&gt; 
&gt; Sure, I like it. :). And never mind, if you&apos;re busy and I get some time I can start some of the listed items.

That&apos;s great!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567970</commentid>
    <comment_count>27</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2012-02-29 14:45:42 -0800</bug_when>
    <thetext>(In reply to comment #25)
&gt; Bug 79899 is created trying to allow BasicBlocks have non-continuous node indices.
&gt; 
&gt; (In reply to comment #24)
&gt; &gt; 
&gt; &gt; I can&apos;t agree with you anymore on this...
&gt; &gt; In fact, I realized a bug related to OSR exit in current LICM implementation some days ago. I must admit that we have to do something with... although some tweaks/workarounds could be made based on current SetLocal mechanism, they look dirty and are really not performance friendly.
&gt; 
&gt; Ah... Sorry for a HUGE typo. I tended to mean &quot;I couldn&apos;t agree with you more...&quot; - forgive my poor English please.

I fail at English often as well.  It&apos;s actually not my first language, either (Polish is).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568232</commentid>
    <comment_count>28</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2012-02-29 19:31:26 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; 
&gt; Ahhhh yeah you&apos;re at least more than half right. ;-)  We could do this in the bytecode generator, but it might be complicated.  Here&apos;s what I was thinking:
&gt; 
&gt; If you&apos;re in a loop the bytecode generator could indicate this in its context.  If it hits a conditional while in a loop, it can indicate that it&apos;s still in the loop but no longer in code that dominates the exit.  Except that this isn&apos;t quite right if you have:
&gt; 
&gt; loop {
&gt;     if (foo) {
&gt;         stuff;
&gt;         break;
&gt;     }
&gt; }
&gt; 
&gt; So then you&apos;d have to add additional checks to see if there&apos;s a break statement at the end of the conditional block, but then you&apos;d have to further handle the case of:
&gt; 
&gt; loop {
&gt;     if (foo) {
&gt;         stuff;
&gt;         if (bar) {
&gt;             other stuff;
&gt;             break;
&gt;         } else {
&gt;             some other stuff;
&gt;             break;
&gt;         }
&gt;     }
&gt; }
&gt; 
&gt; Or maybe your dominator analysis doesn&apos;t catch this either?

Right. There&apos;s a bug in the dominator analysis in current implementation regarding this scenario. We should analyze the dominators of the loop exit&apos;s successor instead of the loop exit. I think this catches the breaks.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>123434</attachid>
            <date>2012-01-20 23:07:19 -0800</date>
            <delta_ts>2012-01-31 01:16:57 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>76770.0.patch</filename>
            <type>text/plain</type>
            <size>48067</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA1NTY5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgxIEBA
CisyMDEyLTAxLTIwICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIExvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGluIEpTQyBERkcKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzcwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV29yay1pbi1wcm9ncmVzcy4KKwor
ICAgICAgICBUaGUgZnJhbWV3b3JrIHRvIHN1cHBvcnQgbW92aW5nIGEgREZHIG5vZGUgKGFuZCB0
aGUgbm9kZXMgY2hhaW5lZCB3aXRoCisgICAgICAgIHJlZmVyZW5jZXMpIHRvIGEgZGlmZmVyZW50
IGJhc2ljIGJsb2NrIGlzIHN1cHBvc2VkIHRvIHdvcmssIGFzIHdlbGwgYXMKKyAgICAgICAgdGhl
IG1lY2hhbmlzbSB0byBzdXBwb3J0IGNyb3NzLWJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgIFNv
bWUgcm91Z2ggYW5hbHlzaXMgaXMgbWFkZSB0byBmaW5kIHRoZSBsb29wIGludmFyaWFudHMsIGZv
ciBleGFtcGxlCisgICAgICAgIGZvciB0aGUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICBBIGJh
c2ljIGJsb2NrIGRvbWluYW5jZSBhbmFseXNpcyBhbGdvcml0aG0gaXMgaW50cm9kdWNlZCB0byBk
ZXRlcm1pbmUKKyAgICAgICAgd2hpY2ggbG9vcCBibG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQg
Zm9yIGNvZGUgbW90aW9uOiB0aGUgYmxvY2tzCisgICAgICAgIHRoYXQgZG9taW5hdGUgdGhlIGxv
b3AgZXhpdC4KKyAgICAgICAgVGhlIE9TUiBlbnRyeSBpcyBtb2RpZmllZC4gVGhlcmUncyBhIGRl
ZGljYXRlZCBsb29wIHByZWhlYWRlciBibG9jayBhcworICAgICAgICB0aGUgT1NSIGVudHJ5Lgor
ICAgICAgICBTdGlsbCBkZWVwZXIgYW5hbHlzaXMgaXMgbmVlZGVkIHRvIGRldGVybWluZSB3aGV0
aGVyIGEgREZHIG5vZGUgaXMKKyAgICAgICAgdHJ1bHkgbG9vcCBpbnZhcmlhbnQgb3Igbm90LCBl
c3BlY2lhbGx5IGZvciB0aG9zZSBvcGVyYXRpbmcgb24gSlMKKyAgICAgICAgb2JqZWN0cy4KKwor
ICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAgICAgIChKU0M6OkNvZGVCbG9j
azo6ZHVtcCk6CisgICAgICAgICogYnl0ZWNvZGUvT3Bjb2RlLmg6CisgICAgICAgICogYnl0ZWNv
bXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5l
cmF0b3I6OmVtaXRMb29wUHJlSGVhZGVyKToKKyAgICAgICAgKiBieXRlY29tcGlsZXIvQnl0ZWNv
ZGVHZW5lcmF0b3IuaDoKKyAgICAgICAgKiBieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcDoK
KyAgICAgICAgKEpTQzo6RG9XaGlsZU5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6
OldoaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6Rm9yTm9kZTo6ZW1pdEJ5
dGVjb2RlKToKKyAgICAgICAgKEpTQzo6Rm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAg
ICAqIGRmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFj
dFN0YXRlOjptZXJnZVN0YXRlQXRUYWlsKToKKyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0
YXRlOjptZXJnZVZhcmlhYmxlQmV0d2VlbkJsb2Nrcyk6CisgICAgICAgICogZGZnL0RGR0J5dGVD
b2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2VC
bG9jayk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlKToKKyAgICAg
ICAgKiBkZmcvREZHQ2FwYWJpbGl0aWVzLmg6CisgICAgICAgIChKU0M6OkRGRzo6Y2FuQ29tcGls
ZU9wY29kZSk6CisgICAgICAgICogZGZnL0RGR0dyYXBoLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpHcmFwaDo6ZHVtcCk6CisgICAgICAgICogZGZnL0RGR0dyYXBoLmg6CisgICAgICAgICogZGZn
L0RGR05vZGUuaDoKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlOjpzZXRWYXJpYWJsZUFjY2Vzc0Rh
dGEpOgorICAgICAgICAqIGRmZy9ERkdQcm9wYWdhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpQcm9wYWdhdG9yOjpmaXhwb2ludCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6
cHJvcGFnYXRlTm9kZVByZWRpY3Rpb25zKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
OjpwZXJmb3JtU3Vic3RpdHV0aW9uKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjps
b2NhbENTRSk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6aXNIb2lzdENhbmRpZGF0
ZSk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6bm9kZUNhbkJlSG9pc3RlZCk6Cisg
ICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cmVmZXJlbmNlTWF5QmVTa2lwcGVkTm9kZSk6
CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUhvaXN0KToKKyAgICAgICAg
KEpTQzo6REZHOjpQcm9wYWdhdG9yOjp2YXJpYWJsZURlZmluZWRJbkxvb3ApOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6OmhvaXN0R2V0TG9jYWwpOgorICAgICAgICAoSlNDOjpERkc6
OlByb3BhZ2F0b3I6OmZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbCk6CisgICAgICAgIChKU0M6
OkRGRzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkKToKKyAgICAgICAgKEpTQzo6REZHOjpQ
cm9wYWdhdG9yOjpoYW5kbGVIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3Bh
Z2F0b3I6OmludGVyc2VjdCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Y29tcHV0
ZURvbWluYXRvcnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnBlcmZvcm1MSUNN
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpsb29wSW52YXJpYW50Q29kZU1vdGlv
bik6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6YWxsb2NhdGVWaXJ0dWFsUmVnaXN0
ZXJzKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwOgorICAgICAgICAoSlND
OjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKiBpbnRlcnByZXRlci9J
bnRlcnByZXRlci5jcHA6CisgICAgICAgIChKU0M6OkludGVycHJldGVyOjpwcml2YXRlRXhlY3V0
ZSk6CisgICAgICAgICogaml0L0pJVC5jcHA6CisgICAgICAgIChKU0M6OkpJVDo6SklUKToKKyAg
ICAgICAgKEpTQzo6SklUOjplbWl0T3B0aW1pemF0aW9uQ2hlY2spOgorICAgICAgICAoSlNDOjpK
SVQ6OnByaXZhdGVDb21waWxlTWFpblBhc3MpOgorICAgICAgICAqIGppdC9KSVQuaDoKKyAgICAg
ICAgKEpTQzo6SklUOjplbWl0X29wX2xvb3BfaGludCk6CisgICAgICAgIChKU0M6OkpJVDo6ZW1p
dF9vcF9sb29wX3ByZWhlYWRlcik6CisKIDIwMTItMDEtMjAgIERhdmlkIExldmluICA8bGV2aW5A
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIE1ha2UgT3duUHRyPEhEQz4gd29yayBmb3IgdGhlIENo
cm9taXVtIFdpbmRvd3MgcG9ydC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9Db2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxMDU1NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTEwMiw2ICsx
MTAyLDEwIEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wKEV4ZWNTdGF0ZSogZXhlYywgY28KICAgICAg
ICAgICAgIHByaW50ZigiWyU0ZF0gbG9vcF9oaW50XG4iLCBsb2NhdGlvbik7CiAgICAgICAgICAg
ICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOiB7Cisg
ICAgICAgICAgICBwcmludGYoIlslNGRdIGxvb3BfcHJlaGVhZGVyXG4iLCBsb2NhdGlvbik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIG9wX3N3aXRjaF9pbW06
IHsKICAgICAgICAgICAgIGludCB0YWJsZUluZGV4ID0gKCsraXQpLT51Lm9wZXJhbmQ7CiAgICAg
ICAgICAgICBpbnQgZGVmYXVsdFRhcmdldCA9ICgrK2l0KS0+dS5vcGVyYW5kOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaAkocmV2aXNpb24gMTA1NTY5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTgsNiArMTU4LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIG1hY3JvKG9wX2xvb3Bf
aWZfZ3JlYXRlciwgNCkgXAogICAgICAgICBtYWNybyhvcF9sb29wX2lmX2dyZWF0ZXJlcSwgNCkg
XAogICAgICAgICBtYWNybyhvcF9sb29wX2hpbnQsIDEpIFwKKyAgICAgICAgbWFjcm8ob3BfbG9v
cF9wcmVoZWFkZXIsIDEpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX2ltbSwgNCkgXAogICAg
ICAgICBtYWNybyhvcF9zd2l0Y2hfY2hhciwgNCkgXAogICAgICAgICBtYWNybyhvcF9zd2l0Y2hf
c3RyaW5nLCA0KSBcCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5
dGVjb2RlR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkocmV2aXNpb24gMTA1NTY5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTY4Niw2ICs2ODYsMTMgQEAgdm9pZCBCeXRlY29kZUdlbmVyYXRv
cjo6ZW1pdExvb3BIaW50KCkKICNlbmRpZgogfQogCit2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjpl
bWl0TG9vcFByZUhlYWRlcigpCit7CisjaWYgRU5BQkxFKERGR19KSVQpCisgICAgZW1pdE9wY29k
ZShvcF9sb29wX3ByZWhlYWRlcik7CisjZW5kaWYKK30KKwogdm9pZCBCeXRlY29kZUdlbmVyYXRv
cjo6cmV0cmlldmVMYXN0QmluYXJ5T3AoaW50JiBkc3RJbmRleCwgaW50JiBzcmMxSW5kZXgsIGlu
dCYgc3JjMkluZGV4KQogewogICAgIEFTU0VSVChpbnN0cnVjdGlvbnMoKS5zaXplKCkgPj0gNCk7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJh
dG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5oCShyZXZpc2lvbiAxMDU1NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAg
LTM0Nyw2ICszNDcsNyBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBQYXNzUmVmUHRyPExh
YmVsPiBlbWl0TGFiZWwoTGFiZWwqKTsKICAgICAgICAgdm9pZCBlbWl0TG9vcEhpbnQoKTsKKyAg
ICAgICAgdm9pZCBlbWl0TG9vcFByZUhlYWRlcigpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVs
PiBlbWl0SnVtcChMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1p
dEp1bXBJZlRydWUoUmVnaXN0ZXJJRCogY29uZCwgTGFiZWwqIHRhcmdldCk7CiAgICAgICAgIFBh
c3NSZWZQdHI8TGFiZWw+IGVtaXRKdW1wSWZGYWxzZShSZWdpc3RlcklEKiBjb25kLCBMYWJlbCog
dGFyZ2V0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXND
b2RlZ2VuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBp
bGVyL05vZGVzQ29kZWdlbi5jcHAJKHJldmlzaW9uIDEwNTU2OSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTQ3OCw2ICsxNDc4LDEwIEBAIFJlZ2lzdGVySUQqIERvV2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUo
QnkKIHsKICAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0b3IubmV3TGFiZWxT
Y29wZShMYWJlbFNjb3BlOjpMb29wKTsKIAorICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhlYWRl
ciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFBy
ZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CisKICAg
ICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdl
bmVyYXRvci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdExv
b3BIaW50KCk7CkBAIC0xNTA0LDEyICsxNTA4LDE1IEBAIFJlZ2lzdGVySUQqIFdoaWxlTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGUKIHsKICAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5l
cmF0b3IubmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsKIAorICAgIFJlZlB0cjxMYWJl
bD4gbG9vcFByZUhlYWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5l
bWl0TGFiZWwobG9vcFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJl
SGVhZGVyKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250aW51ZVRhcmdldCgp
KTsKIAogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7
CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkpOwogICAgIGdlbmVyYXRv
ci5lbWl0TG9vcEhpbnQoKTsKLSAgICAKKwogICAgIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1f
c3RhdGVtZW50KTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoc2NvcGUtPmNvbnRpbnVlVGFy
Z2V0KCkpOwpAQCAtMTUzOSw2ICsxNTQ2LDEwIEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRC
eXRlY29kZShCeXRlY28KICAgICBpZiAobV9leHByMSkKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRO
b2RlKGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcjEpOwogCisgICAgUmVmUHRyPExh
YmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9y
LmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQ
cmVIZWFkZXIoKTsKKwogICAgIFJlZlB0cjxMYWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5l
d0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7CiAKQEAg
LTE1ODgsNiArMTU5OSwxMCBAQCBSZWdpc3RlcklEKiBGb3JJbk5vZGU6OmVtaXRCeXRlY29kZShC
eXRlCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNpemUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5
KCk7CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGV4cGVjdGVkU3Vic2NyaXB0OwogICAgIFJlZlB0
cjxSZWdpc3RlcklEPiBpdGVyID0gZ2VuZXJhdG9yLmVtaXRHZXRQcm9wZXJ0eU5hbWVzKGdlbmVy
YXRvci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQoKSwgaS5nZXQoKSwgc2l6ZS5nZXQoKSwgc2Nv
cGUtPmJyZWFrVGFyZ2V0KCkpOworCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0g
Z2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVh
ZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKICAgICBnZW5l
cmF0b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwogCiAgICAgUmVmUHRyPExh
YmVsPiBsb29wU3RhcnQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAkocmV2aXNpb24gMTA1NTY5
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtOTM3LDcgKzkzNyw3IEBAIGlubGluZSBib29sIEFic3RyYWN0U3RhdGU6
Om1lcmdlU3RhdGVBdFQKICAgICBBYnN0cmFjdFZhbHVlKiBzb3VyY2U7CiAgICAgICAgIAogICAg
IE5vZGUmIG5vZGUgPSBtX2dyYXBoW25vZGVJbmRleF07Ci0gICAgaWYgKCFub2RlLnJlZkNvdW50
KCkpCisgICAgaWYgKCFub2RlLmFkanVzdGVkUmVmQ291bnQoKSkKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKQEAg
LTEwNDcsMTEgKzEwNDcsMTEgQEAgaW5saW5lIGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VUb1N1
Y2NlcwogCiBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVZhcmlhYmxlQmV0d2VlbkJs
b2NrcyhBYnN0cmFjdFZhbHVlJiBkZXN0aW5hdGlvbiwgQWJzdHJhY3RWYWx1ZSYgc291cmNlLCBO
b2RlSW5kZXggZGVzdGluYXRpb25Ob2RlSW5kZXgsIE5vZGVJbmRleCBzb3VyY2VOb2RlSW5kZXgp
CiB7Ci0gICAgaWYgKGRlc3RpbmF0aW9uTm9kZUluZGV4ID09IE5vTm9kZSkKKyAgICAvLyBGSVhN
RTogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzb3VyY2UgaXMgTm9Ob2RlIGJ1dCB0aGUgZGVzdCBp
c24ndCwKKyAgICAvLyBiZWNhdXNlIHdlIGRpZCBMSUNNIGFuZCB0aGUgZGVzdCBpcyBpbiBhIGxv
b3AgcHJlSGVhZGVyLgorICAgIGlmIChkZXN0aW5hdGlvbk5vZGVJbmRleCA9PSBOb05vZGUgfHwg
c291cmNlTm9kZUluZGV4ID09IE5vTm9kZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIAot
ICAgIEFTU0VSVF9VTlVTRUQoc291cmNlTm9kZUluZGV4LCBzb3VyY2VOb2RlSW5kZXggIT0gTm9O
b2RlKTsKLSAgICAKICAgICAvLyBGSVhNRTogV2UgY291bGQgZG8gc29tZSBzcGFyc2UgY29uZGl0
aW9uYWwgcHJvcGFnYXRpb24gaGVyZSEKICAgICAKICAgICByZXR1cm4gZGVzdGluYXRpb24ubWVy
Z2Uoc291cmNlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQ
YXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0
ZUNvZGVQYXJzZXIuY3BwCShyZXZpc2lvbiAxMDU1NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIyMSw3ICsy
MjIxLDE3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAg
ICAgfQogCiAgICAgICAgIGNhc2Ugb3BfbG9vcF9oaW50OiB7Ci0gICAgICAgICAgICAvLyBCYXNl
bGluZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxvb3AgaGludHMuIFRoZSBERkcgYXNzdW1lcyB0
aGF0IEJhc2VsaW5lLT5ERkcKKyAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoYmxvY2tCZWdpbiwg
bV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdpbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIEVtaXQgYSBwaGFudG9tIG5vZGUgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBwbGFjZWhv
bGRlciBub2RlIGZvciB0aGlzIGJ5dGVjb2RlCisgICAgICAgICAgICAvLyBvcC4KKyAgICAgICAg
ICAgIGFkZFRvR3JhcGgoUGhhbnRvbSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5FWFRf
T1BDT0RFKG9wX2xvb3BfaGludCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIG9wX2xvb3Bf
cHJlaGVhZGVyOiB7CisgICAgICAgICAgICAvLyBCYXNlbGluZS0+REZHIE9TUiBqdW1wcyBiZXR3
ZWVuIGxvb3AgcHJlaGVhZGVycy4gVGhlIERGRyBhc3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRwog
ICAgICAgICAgICAgLy8gT1NSIGNhbiBvbmx5IGhhcHBlbiBhdCBiYXNpYyBibG9jayBib3VuZGFy
aWVzLiBBc3NlcnQgdGhhdCB0aGVzZSB0d28gc3RhdGVtZW50cwogICAgICAgICAgICAgLy8gYXJl
IGNvbXBhdGlibGUuCiAgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGJsb2NrQmVnaW4sIG1fY3Vy
cmVudEluZGV4ID09IGJsb2NrQmVnaW4pOwpAQCAtMjIzNiw3ICsyMjQ2LDggQEAgYm9vbCBCeXRl
Q29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgLy8gb3AuCiAgICAg
ICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20pOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBO
RVhUX09QQ09ERShvcF9sb29wX2hpbnQpOworICAgICAgICAgICAgbV9ncmFwaC5tX2xvb3BQcmVI
ZWFkZXJCbG9ja3MuYXBwZW5kKG1fZ3JhcGgubV9ibG9ja3Muc2l6ZSgpIC0gMSk7CisgICAgICAg
ICAgICBORVhUX09QQ09ERShvcF9sb29wX3ByZWhlYWRlcik7CiAgICAgICAgIH0KIAogICAgICAg
ICBkZWZhdWx0OgpAQCAtMjY2Nyw2ICsyNjc4LDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFy
c2UoKQogICAgIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzID0gbV9wcmVzZXJ2ZWRWYXJzOwogICAg
IG1fZ3JhcGgubV9sb2NhbFZhcnMgPSBtX251bUxvY2FsczsKICAgICBtX2dyYXBoLm1fcGFyYW1l
dGVyU2xvdHMgPSBtX3BhcmFtZXRlclNsb3RzOworICAgIG1fZ3JhcGgubV9vcmlnaW5hbFNpemUg
PSBtX2dyYXBoLnNpemUoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCShyZXZpc2lvbiAxMDU1NjkpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzAsNiArMTMwLDcgQEAgaW5saW5lIGJvb2wgY2FuQ29tcGlsZU9wY29kZShPcGNv
ZGVJRCBvcAogICAgIGNhc2Ugb3Bfam5ncmVhdGVyOgogICAgIGNhc2Ugb3Bfam5ncmVhdGVyZXE6
CiAgICAgY2FzZSBvcF9sb29wX2hpbnQ6CisgICAgY2FzZSBvcF9sb29wX3ByZWhlYWRlcjoKICAg
ICBjYXNlIG9wX2xvb3BfaWZfbGVzczoKICAgICBjYXNlIG9wX2xvb3BfaWZfbGVzc2VxOgogICAg
IGNhc2Ugb3BfbG9vcF9pZl9ncmVhdGVyOgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdHcmFwaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdHcmFwaC5jcHAJKHJldmlzaW9uIDEwNTU2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHR3JhcGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYsNyArMTI2LDcgQEAgdm9pZCBH
cmFwaDo6ZHVtcChOb2RlSW5kZXggbm9kZUluZGV4LCBDbwogCiAgICAgdW5zaWduZWQgcmVmQ291
bnQgPSBub2RlLnJlZkNvdW50KCk7CiAgICAgYm9vbCBza2lwcGVkID0gIXJlZkNvdW50OwotICAg
IGJvb2wgbXVzdEdlbmVyYXRlID0gbm9kZS5tdXN0R2VuZXJhdGUoKTsKKyAgICBib29sIG11c3RH
ZW5lcmF0ZSA9IHJlZkNvdW50ICYmIG5vZGUubXVzdEdlbmVyYXRlKCk7CiAgICAgaWYgKG11c3RH
ZW5lcmF0ZSkgewogICAgICAgICBBU1NFUlQocmVmQ291bnQpOwogICAgICAgICAtLXJlZkNvdW50
OwpAQCAtMjk0LDcgKzI5NCw3IEBAIHZvaWQgR3JhcGg6OmR1bXAoQ29kZUJsb2NrKiBjb2RlQmxv
Y2spCiAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICB9CiAgICAgcHJpbnRmKCJQaGkgTm9kZXM6
XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBzaXpl
KCk7ICsraSkKKyAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBt
X29yaWdpbmFsU2l6ZTsgKytpKQogICAgICAgICBkdW1wKGksIGNvZGVCbG9jayk7CiB9CiAKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJKHJldmlzaW9uIDEwNTU2OSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAkod29ya2luZyBjb3B5KQpAQCAt
MjM5LDYgKzIzOSw3IEBAIHB1YmxpYzoKICAgICB9CiAKICAgICBWZWN0b3I8IE93blB0cjxCYXNp
Y0Jsb2NrPiAsIDg+IG1fYmxvY2tzOworICAgIFZlY3RvcjxCbG9ja0luZGV4LCA4PiBtX2xvb3BQ
cmVIZWFkZXJCbG9ja3M7CiAgICAgVmVjdG9yPE5vZGVJbmRleCwgMTY+IG1fdmFyQXJnQ2hpbGRy
ZW47CiAgICAgVmVjdG9yPFN0b3JhZ2VBY2Nlc3NEYXRhPiBtX3N0b3JhZ2VBY2Nlc3NEYXRhOwog
ICAgIFZlY3RvcjxSZXNvbHZlR2xvYmFsRGF0YT4gbV9yZXNvbHZlR2xvYmFsRGF0YTsKQEAgLTI0
OSw2ICsyNTAsNyBAQCBwdWJsaWM6CiAgICAgQml0VmVjdG9yIG1fcHJlc2VydmVkVmFyczsKICAg
ICB1bnNpZ25lZCBtX2xvY2FsVmFyczsKICAgICB1bnNpZ25lZCBtX3BhcmFtZXRlclNsb3RzOwor
ICAgIHVuc2lnbmVkIG1fb3JpZ2luYWxTaXplOyAvLyBUaGUgZ3JhcGggc2l6ZSBiZWZvcmUgd2Ug
ZG8gb3B0aW1pemF0aW9ucyB3aGljaCB3aWxsIGV4cGFuZCB0aGUgZ3JhcGguCiBwcml2YXRlOgog
ICAgIAogICAgIC8vIFdoZW4gYSBub2RlJ3MgcmVmQ291bnQgZ29lcyBmcm9tIDAgdG8gMSwgaXQg
bXVzdCAobG9naWNhbGx5KSByZWN1cnNpdmVseSByZWYgYWxsIG9mIGl0cyBjaGlsZHJlbiwgYW5k
IHZpY2UgdmVyc2EuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkocmV2aXNp
b24gMTA1NTY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ5OSw2ICs0OTksMTIgQEAgc3RydWN0IE5vZGUgewogICAgICAgICByZXR1
cm4gdmFyaWFibGVBY2Nlc3NEYXRhKCktPmxvY2FsKCk7CiAgICAgfQogCisgICAgdm9pZCBzZXRW
YXJpYWJsZUFjY2Vzc0RhdGEodm9pZCogZGF0YSkKKyAgICB7CisgICAgICAgIEFTU0VSVChoYXNW
YXJpYWJsZUFjY2Vzc0RhdGEoKSk7CisgICAgICAgIG1fb3BJbmZvID0gcmVpbnRlcnByZXRfY2Fz
dDx1aW50cHRyX3Q+KGRhdGEpOworICAgIH0KKwogI2lmbmRlZiBOREVCVUcKICAgICBib29sIGhh
c0lkZW50aWZpZXIoKQogICAgIHsKQEAgLTEwMzUsNyArMTA0MSw3IEBAIHN0cnVjdCBOb2RlIHsK
ICAgICB7CiAgICAgICAgIHJldHVybiBub2RlQ2FuU3BlY3VsYXRlSW50ZWdlcihhcml0aE5vZGVG
bGFncygpKTsKICAgICB9Ci0gICAgCisKICNpZm5kZWYgTkRFQlVHCiAgICAgdm9pZCBkdW1wQ2hp
bGRyZW4oRklMRSogb3V0KQogICAgIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHUHJvcGFnYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdQcm9wYWdhdG9yLmNwcAkocmV2aXNpb24gMTA1NTY5KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdQcm9wYWdhdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzUsNiArNzUs
MTMgQEAgcHVibGljOgogICAgICAgICBtX2dyYXBoLmR1bXAobV9jb2RlQmxvY2spOwogI2VuZGlm
CiAKKyAgICAgICAgbG9vcEludmFyaWFudENvZGVNb3Rpb24oKTsKKworI2lmIERGR19FTkFCTEUo
REVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCJHcmFwaCBhZnRlciBs
b29wIGludmFyaWFudCBjb2RlIG1vdGlvbjpcbiIpOworICAgICAgICBtX2dyYXBoLmR1bXAobV9j
b2RlQmxvY2spOworI2VuZGlmCisKICAgICAgICAgYWxsb2NhdGVWaXJ0dWFsUmVnaXN0ZXJzKCk7
CiAKICNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCkBAIC0yODksNyAr
Mjk2LDcgQEAgcHJpdmF0ZToKICAgICAKICAgICB2b2lkIHByb3BhZ2F0ZU5vZGVQcmVkaWN0aW9u
cyhOb2RlJiBub2RlKQogICAgIHsKLSAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkp
CisgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpICYmIG5vZGUub3AgIT0gU2V0TG9j
YWwpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAogICAgICAgICBOb2RlVHlwZSBvcCA9
IG5vZGUub3A7CkBAIC0xNDIzLDcgKzE0MzAsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgcGVyZm9y
bVN1YnN0aXR1dGlvbihOb2RlSW5kZXgmIGNoaWxkLCBib29sIGFkZFJlZiA9IHRydWUpCiAgICAg
ewogICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG9wZXJhbmQgaXMgYWN0dWFsbHkgdW51c2VkLgot
ICAgICAgICBpZiAoY2hpbGQgPT0gTm9Ob2RlKQorICAgICAgICBpZiAoY2hpbGQgPT0gTm9Ob2Rl
IHx8IGNoaWxkID49IG1fcmVwbGFjZW1lbnRzLnNpemUoKSkKICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgCiAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFueSByZXBsYWNlbWVudC4K
QEAgLTE0MzUsMTAgKzE0NDIsMTAgQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgICAgIC8vIFRo
ZXJlIGlzIGRlZmluaXRlbHkgYSByZXBsYWNlbWVudC4gQXNzZXJ0IHRoYXQgdGhlIHJlcGxhY2Vt
ZW50IGRvZXMgbm90CiAgICAgICAgIC8vIGhhdmUgYSByZXBsYWNlbWVudC4KLSAgICAgICAgQVNT
RVJUKG1fcmVwbGFjZW1lbnRzW2NoaWxkXSA9PSBOb05vZGUpOworICAgICAgICBBU1NFUlQoY2hp
bGQgPj0gbV9yZXBsYWNlbWVudHMuc2l6ZSgpIHx8IG1fcmVwbGFjZW1lbnRzW2NoaWxkXSA9PSBO
b05vZGUpOwogICAgICAgICAKICAgICAgICAgaWYgKGFkZFJlZikKLSAgICAgICAgICAgIG1fZ3Jh
cGhbY2hpbGRdLnJlZigpOworICAgICAgICAgICAgcmVmZXJlbmNlTWF5QmVTa2lwcGVkTm9kZShj
aGlsZCk7CiAgICAgfQogICAgIAogICAgIHZvaWQgc2V0UmVwbGFjZW1lbnQoTm9kZUluZGV4IHJl
cGxhY2VtZW50KQpAQCAtMTYzOSw2ICsxNjQ2LDY1NyBAQCBwcml2YXRlOgogI2VuZGlmCiAgICAg
ICAgIGZvciAodW5zaWduZWQgYmxvY2sgPSAwOyBibG9jayA8IG1fZ3JhcGgubV9ibG9ja3Muc2l6
ZSgpOyArK2Jsb2NrKQogICAgICAgICAgICAgcGVyZm9ybUJsb2NrQ1NFKCptX2dyYXBoLm1fYmxv
Y2tzW2Jsb2NrXSk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fcmVwbGFj
ZW1lbnRzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbaV0gPSBOb05v
ZGU7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNIb2lzdENhbmRpZGF0ZShOb2RlJiBub2RlKQor
ICAgIHsKKyAgICAgICAgYm9vbCBpc0NhbmRpZGF0ZSA9IGZhbHNlOworCisgICAgICAgIC8vIEZJ
WE1FOiBDdXJyZW50IGhvaXN0IGNhbmRpZGF0ZSBsaXN0IGlzIF92ZXJ5XyByb3VnaCB3aXRob3V0
IGFueSBjb25jZXJucyBzbyBzaG91bGQgYmUgd3JvbmcuCisgICAgICAgIC8vIERlZXBlciBhbmFs
eXNpcyBpcyBuZWVkZWQuCisgICAgICAgIC8vIEUuZy4sIHdlIG5lZWQgdG8gYmUgbW9yZSBjYXJl
ZnVsIG9uIHRoZSBvcGVyYXRpb25zIHdoaWNoIGFjY2VzcyBvYmplY3QgcHJvcGVydGllcy4KKyAg
ICAgICAgLy8gVGhlIG9iamVjdHMgKGNvbnRlbnQpIG1heSBiZSBtb2RpZmllZCBhbmQgdGhvc2Ug
b3BlcmF0aW9ucyBzaG91bGQgbm90IGJlIGhvaXN0ZWQgdG9vIGVhcmx5LgorCisgICAgICAgIHN3
aXRjaCAobm9kZS5vcCkgeworCisgICAgICAgIGNhc2UgQ29udmVydFRoaXM6CisgICAgICAgIGNh
c2UgR2V0Q2FsbGVlOgorICAgICAgICBjYXNlIEdldEJ5VmFsOgorICAgICAgICBjYXNlIFB1dEJ5
VmFsOgorICAgICAgICBjYXNlIFB1dEJ5VmFsQWxpYXM6CisgICAgICAgIGNhc2UgR2V0QnlJZDoK
KyAgICAgICAgY2FzZSBQdXRCeUlkOgorICAgICAgICBjYXNlIFB1dEJ5SWREaXJlY3Q6CisgICAg
ICAgIGNhc2UgQ2hlY2tTdHJ1Y3R1cmU6CisgICAgICAgIGNhc2UgUHV0U3RydWN0dXJlOgorICAg
ICAgICBjYXNlIEdldFByb3BlcnR5U3RvcmFnZToKKyAgICAgICAgY2FzZSBHZXRCeU9mZnNldDoK
KyAgICAgICAgY2FzZSBQdXRCeU9mZnNldDoKKyAgICAgICAgY2FzZSBHZXRBcnJheUxlbmd0aDoK
KyAgICAgICAgY2FzZSBHZXRTdHJpbmdMZW5ndGg6CisgICAgICAgIGNhc2UgR2V0Qnl0ZUFycmF5
TGVuZ3RoOgorICAgICAgICBjYXNlIENoZWNrRnVuY3Rpb246CisgICAgICAgIGNhc2UgU3RyaW5n
Q2hhckNvZGVBdDoKKyAgICAgICAgY2FzZSBTdHJpbmdDaGFyQXQ6CisgICAgICAgIGNhc2UgQ2hl
Y2tIYXNJbnN0YW5jZToKKyAgICAgICAgY2FzZSBJbnN0YW5jZU9mOgorICAgICAgICBjYXNlIExv
Z2ljYWxOb3Q6CisgICAgICAgIGNhc2UgVG9QcmltaXRpdmU6CisgICAgICAgIC8vIGNhc2UgU3Ry
Q2F0OgorICAgICAgICBjYXNlIFNldExvY2FsOgorICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgor
ICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6
CisgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6
CisgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgorICAgICAgICBjYXNlIFZhbHVlVG9OdW1i
ZXI6CisgICAgICAgIGNhc2UgQml0QW5kOgorICAgICAgICBjYXNlIEJpdE9yOgorICAgICAgICBj
YXNlIEJpdFhvcjoKKyAgICAgICAgY2FzZSBCaXRSU2hpZnQ6CisgICAgICAgIGNhc2UgQml0TFNo
aWZ0OgorICAgICAgICBjYXNlIEJpdFVSU2hpZnQ6CisgICAgICAgIGNhc2UgVmFsdWVUb0ludDMy
OgorICAgICAgICBjYXNlIFVJbnQzMlRvTnVtYmVyOgorICAgICAgICBjYXNlIEFyaXRoQWRkOgor
ICAgICAgICBjYXNlIEFyaXRoU3ViOgorICAgICAgICBjYXNlIEFyaXRoTXVsOgorICAgICAgICBj
YXNlIEFyaXRoTW9kOgorICAgICAgICBjYXNlIEFyaXRoRGl2OgorICAgICAgICBjYXNlIEFyaXRo
QWJzOgorICAgICAgICBjYXNlIEFyaXRoTWluOgorICAgICAgICBjYXNlIEFyaXRoTWF4OgorICAg
ICAgICBjYXNlIEFyaXRoU3FydDoKKyAgICAgICAgY2FzZSBWYWx1ZVRvRG91YmxlOgorICAgICAg
ICBjYXNlIFZhbHVlQWRkOgorICAgICAgICBjYXNlIEpTQ29uc3RhbnQ6CisgICAgICAgICAgICBp
c0NhbmRpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlzQ2FuZGlk
YXRlOworICAgIH0KKworICAgIGJvb2wgbm9kZUNhbkJlSG9pc3RlZChOb2RlJiBub2RlLCBCYXNp
Y0Jsb2NrJiB0YXJnZXRCbG9jaywgVmVjdG9yPE5vZGVJbmRleCwgMz4mIGhvaXN0ZWRDaGlsZHJl
bikKKyAgICB7CisgICAgICAgIGJvb2wgY2FuSG9pc3QgPSB0cnVlOworCisgICAgICAgIGlmIChu
b2RlLm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hp
bGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSAr
IG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgIE5vZGVJ
bmRleCBjaGlsZCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07CisgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgICAgICBOb2Rl
SW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07CisgICAgICAgICAgICAg
ICAgICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVu
dCA8IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGls
ZHJlbi5hcHBlbmQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZDEg
PSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgIE5vZGVJbmRleCBjaGls
ZDIgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMjsKKyAgICAgICAgICAgIE5vZGVJbmRleCBj
aGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAgICAgaWYgKGNo
aWxkMSAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQg
PSBtX3JlcGxhY2VtZW50c1tjaGlsZDFdOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVu
dCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVuZCkK
KyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZDEpOworICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlKSB7CisgICAg
ICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGQy
XTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFyZ2V0QmxvY2suYmVnaW4g
JiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAgICAgICAgICAgICAgIGhv
aXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGVJbmRleCBy
ZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkM107CisgICAgICAgICAgICAgICAgaWYg
KHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0
QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW4uYXBwZW5kKGNo
aWxkMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lz
dCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNh
bkhvaXN0OworICAgIH0KKworICAgIHZvaWQgcmVmZXJlbmNlTWF5QmVTa2lwcGVkTm9kZShOb2Rl
SW5kZXggaW5kZXgpCisgICAgeworICAgICAgICBpZiAoaW5kZXggPT0gTm9Ob2RlIHx8ICFtX2dy
YXBoW2luZGV4XS5yZWYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJdCBi
ZWNvbWVzIG1vcmUgY29tcGxleCBpZiB0aGUgcmVmZXJlbmNlIGlzIGEgc2tpcHBlZCBub2RlLgor
ICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSByZWZlcmVuY2UgY2hhaW4gdG8gZml4
IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCA0PiBza2lw
cGVkTm9kZXM7CisgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoaW5kZXgpOworCisgICAgICAg
IHdoaWxlICghc2tpcHBlZE5vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9kZUluZGV4
IHNraXBwZWRJbmRleCA9IHNraXBwZWROb2Rlcy5sYXN0KCk7CisgICAgICAgICAgICBza2lwcGVk
Tm9kZXMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbc2tp
cHBlZEluZGV4XTsKKworICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlTXVzdEdlbmVyYXRl
KQorICAgICAgICAgICAgICAgIG5vZGUucmVmKCk7CisKKyAgICAgICAgICAgIGlmIChub2RlLm9w
ICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxk
SWR4ID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5maXJzdENoaWxkKCkgKyBu
b2RlLm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9k
ZUluZGV4IGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07CisgICAg
ICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkeF0ucmVmKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkeCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQx
ID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDE7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4
IGNoaWxkMiA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyOworICAgICAgICAgICAgICAgIE5v
ZGVJbmRleCBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAg
ICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmIG1fZ3JhcGhbY2hpbGQxXS5yZWYoKSkKKyAg
ICAgICAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFwcGVuZChjaGlsZDEpOworCisgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUgJiYgbV9ncmFwaFtjaGlsZDJdLnJlZigpKQor
ICAgICAgICAgICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkMik7CisKKyAgICAg
ICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSAmJiBtX2dyYXBoW2NoaWxkM10ucmVmKCkp
CisgICAgICAgICAgICAgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoY2hpbGQzKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUhvaXN0KE5vZGVJ
bmRleCBpbmRleCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVuc2lnbmVkJiBob2lzdGVkKQor
ICAgIHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOworCisgICAgICAgIGlm
ICghaG9pc3RlZCkKKyAgICAgICAgICAgIHRhcmdldEJsb2NrLmJlZ2luID0gbV9ncmFwaC5zaXpl
KCk7CisKKyAgICAgICAgbV9ncmFwaC5hcHBlbmQobm9kZSk7CisgICAgICAgIE5vZGUmIHJlcGxh
Y2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgIHJlcGxhY2VtZW50LnNldFJlZkNvdW50
KCFub2RlLmhhc1Jlc3VsdCgpICYmIChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkgPyAxIDog
MCk7CisgICAgICAgIC8vIE9ubHkgcGVyZm9ybSBjaGlsZHJlbiBzdWJzdGl0dXRpb24gZm9yIHRo
ZSByZXBsYWNlbWVudCBub2RlLgorICAgICAgICBpZiAocmVwbGFjZW1lbnQub3AgJiBOb2RlSGFz
VmFyQXJncykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IHJlcGxhY2Vt
ZW50LmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCByZXBsYWNlbWVudC5maXJzdENoaWxkKCkgKyBy
ZXBsYWNlbWVudC5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAgICAgICAgICAgICAgIHBl
cmZvcm1TdWJzdGl0dXRpb24obV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XSwgcmVw
bGFjZW1lbnQucmVmQ291bnQoKSk7IC8vIERvbid0IHJlZmVyZW5jZSB0aGUgbmV3IGNoaWxkIGhl
cmUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJl
cGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7
CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZp
eGVkLmNoaWxkMiwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAgICAgICAgICBwZXJmb3Jt
U3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMywgcmVwbGFjZW1l
bnQucmVmQ291bnQoKSk7CisgICAgICAgIH0KKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FU
SU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBAJXUiLCBp
bmRleCwgbV9ncmFwaC5zaXplKCkgLSAxKTsKKyNlbmRpZgorICAgICAgICBtX3JlcGxhY2VtZW50
c1ttX2NvbXBpbGVJbmRleF0gPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgIE5vZGUmIG5l
d05vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsgLy8gVGhpcyBjYW4gZGlmZmVyIGZyb20g
Im5vZGUiIGJlY2F1c2UgbV9ncmFwaCBpcyBleHBhbmRlZAorICAgICAgICBuZXdOb2RlLnNldFJl
ZkNvdW50KDApOworICAgICAgICArK2hvaXN0ZWQ7CisgICAgICAgIHRhcmdldEJsb2NrLmVuZCA9
IG1fZ3JhcGguc2l6ZSgpOworICAgIH0KKworICAgIGJvb2wgdmFyaWFibGVEZWZpbmVkSW5Mb29w
KE5vZGVJbmRleCBpbmRleCwgTm9kZUluZGV4IGxvb3BCZWdpbiwgTm9kZUluZGV4IGxvb3BFbmQs
IFZlY3RvcjxOb2RlSW5kZXgsIDM+JiBkZWZpbml0aW9ucykKKyAgICB7CisgICAgICAgIFZlY3Rv
cjxOb2RlSW5kZXgsIDg+IHZpc2l0ZWROb2RlczsKKyAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwg
OD4gcGhpc1RvVmlzaXQ7CisKKyAgICAgICAgcGhpc1RvVmlzaXQuYXBwZW5kKGluZGV4KTsKKwor
ICAgICAgICB3aGlsZSAoIXBoaXNUb1Zpc2l0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9k
ZUluZGV4IHBoaUluZGV4ID0gcGhpc1RvVmlzaXQubGFzdCgpOworICAgICAgICAgICAgcGhpc1Rv
VmlzaXQucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbcGhpSW5kZXhd
Lm9wID09IFBoaSk7CisKKyAgICAgICAgICAgIE5vZGVJbmRleCYgY2hpbGQxID0gbV9ncmFwaFtw
aGlJbmRleF0uY2hpbGRyZW4uZml4ZWQuY2hpbGQxOworICAgICAgICAgICAgTm9kZUluZGV4JiBj
aGlsZDIgPSBtX2dyYXBoW3BoaUluZGV4XS5jaGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAg
ICAgICBOb2RlSW5kZXgmIGNoaWxkMyA9IG1fZ3JhcGhbcGhpSW5kZXhdLmNoaWxkcmVuLmZpeGVk
LmNoaWxkMzsKKworICAgICAgICAgICAgLy8gU29tZSBQaGkgbm9kZXMgbWF5IG5vdCBnZXQgdXBk
YXRlZCBjaGlsZHJlbiBmb3Igbm93LgorICAgICAgICAgICAgaWYgKHBoaUluZGV4ID49IG1fZ3Jh
cGgubV9ibG9ja3MubGFzdCgpLT5lbmQgJiYgcGhpSW5kZXggPCBtX2dyYXBoLm1fb3JpZ2luYWxT
aXplKSB7CisgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihjaGlsZDEpOworICAg
ICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24oY2hpbGQyKTsKKyAgICAgICAgICAgICAg
ICBwZXJmb3JtU3Vic3RpdHV0aW9uKGNoaWxkMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHZpc2l0ZWROb2Rlcy5hcHBlbmQocGhpSW5kZXgpOworCisgICAgICAgICAgICBpZiAoY2hp
bGQxICE9IE5vTm9kZSAmJiAhdmlzaXRlZE5vZGVzLmNvbnRhaW5zKGNoaWxkMSkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAobV9ncmFwaFtjaGlsZDFdLm9wID09IFBoaSkKKyAgICAgICAgICAgICAg
ICAgICAgcGhpc1RvVmlzaXQuYXBwZW5kKGNoaWxkMSk7CisgICAgICAgICAgICAgICAgZWxzZSBp
ZiAobV9ncmFwaFtjaGlsZDFdLm9wID09IFNldExvY2FsIHx8IG1fZ3JhcGhbY2hpbGQxXS5vcCA9
PSBTZXRBcmd1bWVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQxID49IGxvb3BC
ZWdpbiAmJiBjaGlsZDEgPCBsb29wRW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLmFwcGVuZChjaGlsZDEpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBp
ZiAoY2hpbGQyICE9IE5vTm9kZSAmJiAhdmlzaXRlZE5vZGVzLmNvbnRhaW5zKGNoaWxkMikpIHsK
KyAgICAgICAgICAgICAgICBpZiAobV9ncmFwaFtjaGlsZDJdLm9wID09IFBoaSkKKyAgICAgICAg
ICAgICAgICAgICAgcGhpc1RvVmlzaXQuYXBwZW5kKGNoaWxkMik7CisgICAgICAgICAgICAgICAg
ZWxzZSBpZiAobV9ncmFwaFtjaGlsZDJdLm9wID09IFNldExvY2FsIHx8IG1fZ3JhcGhbY2hpbGQy
XS5vcCA9PSBTZXRBcmd1bWVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQyID49
IGxvb3BCZWdpbiAmJiBjaGlsZDIgPCBsb29wRW5kKQorICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLmFwcGVuZChjaGls
ZDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYg
KGNoaWxkMyAhPSBOb05vZGUgJiYgIXZpc2l0ZWROb2Rlcy5jb250YWlucyhjaGlsZDMpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGQzXS5vcCA9PSBQaGkpCisgICAgICAgICAg
ICAgICAgICAgIHBoaXNUb1Zpc2l0LmFwcGVuZChjaGlsZDMpOworICAgICAgICAgICAgICAgIGVs
c2UgaWYgKG1fZ3JhcGhbY2hpbGQzXS5vcCA9PSBTZXRMb2NhbCB8fCBtX2dyYXBoW2NoaWxkM10u
b3AgPT0gU2V0QXJndW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkMyA+PSBs
b29wQmVnaW4gJiYgY2hpbGQzIDwgbG9vcEVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucy5hcHBlbmQoY2hpbGQz
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjZGVmaW5lIE1BWF9IT0lTVEVEX0xPT1BfSU5WQVJJ
QU5UUyAyNTYKKworICAgIHZvaWQgaG9pc3RHZXRMb2NhbChCYXNpY0Jsb2NrJiBwcmVIZWFkZXJC
bG9jaywgTm9kZUluZGV4IGxvb3BCZWdpbiwgTm9kZUluZGV4IGxvb3BFbmQsIHVuc2lnbmVkJiBo
b2lzdGVkKQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbbV9jb21waWxlSW5k
ZXhdOworICAgICAgICBBU1NFUlQobm9kZS5vcCA9PSBQaGkgfHwgbm9kZS5vcCA9PSBHZXRMb2Nh
bCk7CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAg
IHByaW50ZigiICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhbbV9jb21waWxlSW5k
ZXhdLm9wKSwgbV9jb21waWxlSW5kZXgpOworI2VuZGlmCisKKyAgICAgICAgaWYgKG5vZGUub3Ag
PT0gUGhpKSB7CisgICAgICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCAzPiBkZWZpbml0aW9uczsK
KyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9kZS5jaGlsZHJlbi5maXhlZC5jaGls
ZDEpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihub2RlLmNoaWxkcmVuLmZpeGVk
LmNoaWxkMik7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4u
Zml4ZWQuY2hpbGQzKTsKKworICAgICAgICAgICAgaWYgKGhvaXN0ZWQgPCBNQVhfSE9JU1RFRF9M
T09QX0lOVkFSSUFOVFMgLSAxICYmICF2YXJpYWJsZURlZmluZWRJbkxvb3AobV9jb21waWxlSW5k
ZXgsIGxvb3BCZWdpbiwgbG9vcEVuZCwgZGVmaW5pdGlvbnMpICYmIGRlZmluaXRpb25zLnNpemUo
KSA8PSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFob2lzdGVkKQorICAgICAgICAgICAgICAg
ICAgICBwcmVIZWFkZXJCbG9jay5iZWdpbiA9IG1fZ3JhcGguc2l6ZSgpOworCisgICAgICAgICAg
ICAgICAgTm9kZSYgbmV4dE5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4ICsgMV07CisgICAg
ICAgICAgICAgICAgQVNTRVJUKG5leHROb2RlLm9wID09IEdldExvY2FsICYmIG5leHROb2RlLmNo
aWxkMSgpID09IG1fY29tcGlsZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnQgb3BlcmFuZCA9
IG5leHROb2RlLmxvY2FsKCk7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGxhc3REZWZpbmVJ
bmRleCA9IE5vTm9kZTsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmFuZElzQXJndW1lbnQob3Bl
cmFuZCkpCisgICAgICAgICAgICAgICAgICAgIGxhc3REZWZpbmVJbmRleCA9IHByZUhlYWRlckJs
b2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChvcGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKSk7
CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsYXN0RGVmaW5lSW5k
ZXggPSBwcmVIZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCk7CisKKyAg
ICAgICAgICAgICAgICBpZiAobGFzdERlZmluZUluZGV4ICE9IE5vTm9kZSkgeworICAgICAgICAg
ICAgICAgICAgICBOb2RlJiBsYXN0RGVmaW5lID0gbV9ncmFwaFtsYXN0RGVmaW5lSW5kZXhdOwor
ICAgICAgICAgICAgICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9PSBHZXRMb2NhbCkgeworI2lm
IERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBAJXUiLCBtX2NvbXBpbGVJbmRleCAr
IDEsIGxhc3REZWZpbmVJbmRleCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
cmVwbGFjZW1lbnRzW21fY29tcGlsZUluZGV4ICsgMV0gPSBsYXN0RGVmaW5lSW5kZXg7CisgICAg
ICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZS5zZXRSZWZDb3VudCgwKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICsrbV9jb21waWxlSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47IC8vIFdlJ3JlIGRvbmUuCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9PSBTZXRMb2NhbCkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLgorICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REZWZpbmUu
b3AgPT0gUGhpKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbbV9jb21w
aWxlSW5kZXhdID0gbGFzdERlZmluZUluZGV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQaGkgbm9kZS4KKyAgICAgICAgICAg
ICAgICAgICAgbV9ncmFwaC5hcHBlbmQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIE5vZGUm
IHJlcGxhY2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlcGxh
Y2VtZW50LnNldFJlZkNvdW50KDEpOworICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5j
aGlsZHJlbi5maXhlZC5jaGlsZDEgPSBkZWZpbml0aW9uc1swXTsKKyAgICAgICAgICAgICAgICAg
ICAgcmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQyID0gZGVmaW5pdGlvbnMuc2l6ZSgp
ID4gMSA/IGRlZmluaXRpb25zWzFdIDogTm9Ob2RlOworICAgICAgICAgICAgICAgICAgICByZXBs
YWNlbWVudC5jaGlsZHJlbi5maXhlZC5jaGlsZDMgPSBkZWZpbml0aW9ucy5zaXplKCkgPiAyID8g
ZGVmaW5pdGlvbnNbMl0gOiBOb05vZGU7CisgICAgICAgICAgICAgICAgICAgIG1fcmVwbGFjZW1l
bnRzW21fY29tcGlsZUluZGV4XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAg
ICAgICAgKytob2lzdGVkOworICAgICAgICAgICAgICAgIH0KKyNpZiBERkdfRU5BQkxFKERFQlVH
X1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBSZXBsYWNp
bmcgQCV1IC0+IEAldSIsIG1fY29tcGlsZUluZGV4LCBtX3JlcGxhY2VtZW50c1ttX2NvbXBpbGVJ
bmRleF0pOworI2VuZGlmCisgICAgICAgICAgICAgICAgKyttX2NvbXBpbGVJbmRleDsKKworICAg
ICAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbbV9jb21waWxlSW5kZXhdKTsKKyAg
ICAgICAgICAgICAgICBOb2RlJiBnZXRMb2NhbE5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4
XTsKKyAgICAgICAgICAgICAgICBOb2RlJiBnZXRMb2NhbFJlcGxhY2VtZW50ID0gbV9ncmFwaC5s
YXN0KCk7CisgICAgICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNlbWVudC5zZXRSZWZDb3VudCgw
KTsKKyAgICAgICAgICAgICAgICBnZXRMb2NhbFJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNo
aWxkMSA9IG1fcmVwbGFjZW1lbnRzW21fY29tcGlsZUluZGV4IC0gMV07CisgICAgICAgICAgICAg
ICAgbV9yZXBsYWNlbWVudHNbbV9jb21waWxlSW5kZXhdID0gbV9ncmFwaC5zaXplKCkgLSAxOwor
I2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAg
ICBwcmludGYoIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV1IiwgbV9jb21waWxlSW5kZXgsIG1fZ3Jh
cGguc2l6ZSgpIC0gMSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBnZXRMb2NhbE5vZGUuc2V0
UmVmQ291bnQoMCk7CisgICAgICAgICAgICAgICAgKytob2lzdGVkOworICAgICAgICAgICAgICAg
IHByZUhlYWRlckJsb2NrLmVuZCA9IG1fZ3JhcGguc2l6ZSgpOworCisgICAgICAgICAgICAgICAg
aWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIHVu
c2lnbmVkIGFyZ3VtZW50ID0gb3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCk7CisgICAgICAgICAg
ICAgICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChhcmd1bWVu
dCkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RGVm
aW5lSW5kZXggPT0gTm9Ob2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxv
Y2sudmFyaWFibGVzQXRIZWFkLnNldEFyZ3VtZW50Rmlyc3RUaW1lKGFyZ3VtZW50LCBtX2dyYXBo
LnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
ICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG1fZ3Jh
cGguc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REZWZpbmVJbmRleCA9
PSBOb05vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVIZWFkZXJCbG9jay52YXJpYWJs
ZXNBdEhlYWQuc2V0TG9jYWxGaXJzdFRpbWUob3BlcmFuZCwgbV9ncmFwaC5zaXplKCkgLSAxKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobm9k
ZS5vcCA9PSBHZXRMb2NhbCkgeworICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGQxKCkgIT0gTm9O
b2RlKSB7CisgICAgICAgICAgICAgICAgTm9kZSYgY2hpbGROb2RlID0gbV9ncmFwaFtub2RlLmNo
aWxkMSgpXTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoY2hpbGROb2RlLm9wID09IFBoaSk7Cisg
ICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkUmVwbGFjZUluZGV4ID0gbV9yZXBsYWNlbWVu
dHNbbm9kZS5jaGlsZDEoKV07CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgUGhpIG5vZGUg
aXMgaG9pc3RlZCwgd2UgY2FuIHNhZmVseSBvbWl0IHRoaXMgR2V0TG9jYWwgbm9kZS4KKyAgICAg
ICAgICAgICAgICBpZiAoY2hpbGRSZXBsYWNlSW5kZXggIT0gTm9Ob2RlKSB7CisgICAgICAgICAg
ICAgICAgICAgIGludCBvcGVyYW5kID0gbm9kZS5sb2NhbCgpOworICAgICAgICAgICAgICAgICAg
ICBOb2RlSW5kZXggbGFzdERlZmluZUluZGV4ID0gTm9Ob2RlOworICAgICAgICAgICAgICAgICAg
ICBpZiAob3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICBsYXN0RGVmaW5lSW5kZXggPSBwcmVIZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1l
bnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkpOworICAgICAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RGVmaW5lSW5kZXggPSBwcmVIZWFkZXJCbG9j
ay52YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCk7CisKKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKGxhc3REZWZpbmVJbmRleCAhPSBOb05vZGUgJiYgbV9ncmFwaFtsYXN0RGVmaW5lSW5k
ZXhdLm9wID09IEdldExvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNb
bV9jb21waWxlSW5kZXhdID0gbGFzdERlZmluZUluZGV4OworI2lmIERGR19FTkFCTEUoREVCVUdf
UFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBSZXBs
YWNpbmcgQCV1IC0+IEAldSIsIG1fY29tcGlsZUluZGV4LCBsYXN0RGVmaW5lSW5kZXgpOworI2Vu
ZGlmCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0UmVmQ291bnQoMCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBERkdfRU5BQkxFKERFQlVH
X1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorICAg
IH0KKworICAgIHZvaWQgZml4SG9pc3RlZENoaWxkV2l0aFNldExvY2FsKEJsb2NrSW5kZXggYmxv
Y2tJbmRleCwgTm9kZUluZGV4IGNoaWxkKQorICAgIHsKKyAgICAgICAgTm9kZSYgY2hpbGROb2Rl
ID0gbV9ncmFwaFtjaGlsZF07CisgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVw
bGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgQVNTRVJUKHJlcGxhY2VtZW50ICE9IE5vTm9kZSk7
CisgICAgICAgIEFTU0VSVChjaGlsZE5vZGUub3AgIT0gR2V0TG9jYWwgJiYgY2hpbGROb2RlLm9w
ICE9IFBoaSAmJiBjaGlsZE5vZGUub3AgIT0gU2V0TG9jYWwpOworICAgICAgICBOb2RlJiBzZXRM
b2NhbE5vZGUgPSBtX2dyYXBoW3JlcGxhY2VtZW50ICsgMV07CisgICAgICAgIEFTU0VSVChzZXRM
b2NhbE5vZGUub3AgPT0gU2V0TG9jYWwpOworICAgICAgICBBU1NFUlQoc2V0TG9jYWxOb2RlLmNo
aWxkcmVuLmZpeGVkLmNoaWxkMSA9PSByZXBsYWNlbWVudCk7CisKKyAgICAgICAgY2hpbGROb2Rl
Lm9wID0gR2V0TG9jYWw7CisgICAgICAgIHJlZmVyZW5jZU1heUJlU2tpcHBlZE5vZGUocmVwbGFj
ZW1lbnQgKyAxKTsKKyAgICAgICAgY2hpbGROb2RlLnNldFZhcmlhYmxlQWNjZXNzRGF0YShzZXRM
b2NhbE5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkpOworICAgICAgICBpbnQgb3BlcmFuZCA9IGNo
aWxkTm9kZS5sb2NhbCgpOworICAgICAgICBCYXNpY0Jsb2NrJiBjdXJyZW50QmxvY2sgPSAqbV9n
cmFwaC5tX2Jsb2Nrc1tibG9ja0luZGV4XTsKKyAgICAgICAgTm9kZUluZGV4IGZpcnN0RGVmaW5l
SW5kZXggPSBOb05vZGU7CisgICAgICAgIGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkK
KyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjdXJyZW50QmxvY2sudmFyaWFibGVzQXRI
ZWFkLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJlbnRCbG9jay52YXJpYWJsZXNBdEhl
YWQubG9jYWwob3BlcmFuZCk7CisKKyAgICAgICAgLy8gQVNTRVJUKGZpcnN0RGVmaW5lSW5kZXgg
IT0gTm9Ob2RlKTsKKyAgICAgICAgaWYgKGZpcnN0RGVmaW5lSW5kZXggIT0gTm9Ob2RlICYmIG1f
Z3JhcGhbZmlyc3REZWZpbmVJbmRleF0ub3AgPT0gR2V0TG9jYWwpCisgICAgICAgICAgICBmaXJz
dERlZmluZUluZGV4ID0gbV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5jaGlsZDEoKTsKKworICAg
ICAgICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID0gZmlyc3REZWZpbmVJbmRleDsK
KyAgICAgICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IE5vTm9kZTsKKyAgICAg
ICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IE5vTm9kZTsKKyAgICB9CisKKyAg
ICBib29sIGZpeEhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBj
aGlsZCkKKyAgICB7CisgICAgICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IHRydWU7CisgICAgICAgIE5v
ZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgQVNT
RVJUKHJlcGxhY2VtZW50ICE9IE5vTm9kZSk7IC8vIENoaWxkcmVuIG9mIGEgaG9pc3RlZCBub2Rl
IG11c3QgaGF2ZSBiZWVuIGhvaXN0ZWQgYXMgd2VsbC4KKworICAgICAgICBtX2dyYXBoW2NoaWxk
XS5yZWYoKTsKKyAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLnJlZkNvdW50KCkgPT0gMSkgewor
ICAgICAgICAgICAgLy8gT25seSBmaXggdGhpcyBjaGlsZCBvbmNlLgorICAgICAgICAgICAgaWYg
KG1fZ3JhcGhbY2hpbGRdLm9wICE9IEdldExvY2FsICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IEpT
Q29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9ncmFwaFtjaGlsZF0ub3AgIT0g
UGhpICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IFNldExvY2FsKTsKKyAgICAgICAgICAgICAgICBp
ZiAocmVwbGFjZW1lbnQgPCBtX2dyYXBoLnNpemUoKSAtIDEgJiYgbV9ncmFwaFtyZXBsYWNlbWVu
dCArIDFdLm9wID09IFNldExvY2FsKQorICAgICAgICAgICAgICAgICAgICBmaXhIb2lzdGVkQ2hp
bGRXaXRoU2V0TG9jYWwoYmxvY2tJbmRleCwgY2hpbGQpOworICAgICAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkKKyAg
ICAgICAgICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gc3VjY2Vzc2Z1bDsKKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUhvaXN0ZWRDaGlsZChC
bG9ja0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBjaGlsZCkKKyAgICB7CisgICAgICAgIGlm
IChmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQpKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIC8vIElmIGZhaWxlZCB0byBmaXggdGhpcyBjaGlsZCwgd2UgbmVlZCB0byBi
YWNrIHRyYWNrLgorICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCAzPiBob2lzdGVkQ2hpbGRyZW5X
aXRob3V0U2V0TG9jYWw7CisgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5h
cHBlbmQoY2hpbGQpOworICAgICAgICB3aGlsZSAoIWhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRM
b2NhbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2hvaXN0
ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5sYXN0KCldOworICAgICAgICAgICAgaG9pc3RlZENo
aWxkcmVuV2l0aG91dFNldExvY2FsLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIGlmIChub2Rl
Lm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNo
aWxkSWR4ID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5maXJzdENoaWxkKCkg
KyBub2RlLm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAg
Tm9kZUluZGV4JiBjaGlsZHggPSBtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGR4ICE9IE5vTm9kZSAmJiAhZml4SG9pc3RlZENo
aWxkKGJsb2NrSW5kZXgsIGNoaWxkeCkpCisgICAgICAgICAgICAgICAgICAgICAgICBob2lzdGVk
Q2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkeCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNoaWxk
MSA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxOworICAgICAgICAgICAgICAgIE5vZGVJbmRl
eCYgY2hpbGQyID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAgICAgICAgICAg
Tm9kZUluZGV4JiBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAg
ICAgICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJ
bmRleCwgY2hpbGQxKSkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91
dFNldExvY2FsLmFwcGVuZChjaGlsZDEpOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMiAh
PSBOb05vZGUgJiYgIWZpeEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZDIpKQorICAgICAg
ICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxk
Mik7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSAmJiAhZml4SG9pc3Rl
ZENoaWxkKGJsb2NrSW5kZXgsIGNoaWxkMykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRD
aGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIEFkb3B0IHRoZSBkb21pbmFuY2UgYWxnb3JpdGhtIGJ5
IENvb3BlciwgS2VpdGggRC47IEhhcnZleSwgVGltb3RoeSBKOyBhbmQgS2VubmVkeSwgS2VuICgy
MDAxKS4gCisgICAgLy8gIkEgU2ltcGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0aG0iCisgICAg
Ly8gaHR0cDovL3d3dy5oaXBlcnNvZnQucmljZS5lZHUvZ3JhZHMvcHVibGljYXRpb25zL2RvbTE0
LnBkZgorICAgIHVuc2lnbmVkIGludGVyc2VjdCh1bnNpZ25lZCBiMSwgdW5zaWduZWQgYjIsIFZl
Y3Rvcjx1bnNpZ25lZD4mIGRvbVRyZWUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBmaW5nZXIx
ID0gYjE7CisgICAgICAgIHVuc2lnbmVkIGZpbmdlcjIgPSBiMjsKKworICAgICAgICB3aGlsZSAo
ZmluZ2VyMSAhPSBmaW5nZXIyKSB7CisgICAgICAgICAgICB3aGlsZSAoZmluZ2VyMSA+IGZpbmdl
cjIpCisgICAgICAgICAgICAgICBmaW5nZXIxID0gZG9tVHJlZVtmaW5nZXIxXTsKKyAgICAgICAg
ICAgIHdoaWxlIChmaW5nZXIyID4gZmluZ2VyMSkKKyAgICAgICAgICAgICAgIGZpbmdlcjIgPSBk
b21UcmVlW2ZpbmdlcjJdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbmdlcjE7Cisg
ICAgfQorCisgICAgdm9pZCBjb21wdXRlRG9taW5hdG9ycyhCbG9ja0luZGV4IHN0YXJ0LCBCbG9j
a0luZGV4IGVuZCwgVmVjdG9yPEJsb2NrSW5kZXgsIDg+JiBkb21pbmF0b3JzKQorICAgIHsKKyAg
ICAgICAgLy8gRmlyc3RseSBjb21wdXRlIHRoZSBkb21pbmF0b3IgdHJlZS4KKyAgICAgICAgLy8g
VGhlIHRyZWUgbm9kZSBpbmRleCBpcyB0aGUgYmxvY2sgaW5kZXggb2Zmc2V0ZWQgYnkgdGhlIHN0
YXJ0IGJsb2NrIGluZGV4LgorICAgICAgICBWZWN0b3I8dW5zaWduZWQ+IGRvbVRyZWU7CisgICAg
ICAgIHVuc2lnbmVkIHNpemUgPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICAgICAgZG9tVHJlZS5y
ZXNpemUoc2l6ZSk7CisgICAgICAgIGRvbVRyZWVbMF0gPSAwOworICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgZG9tVHJlZVtpXSA9IHNpemU7
CisKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICB3aGlsZSAoY2hhbmdl
ZCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtX2dy
YXBoLm1fYmxvY2tzW3N0YXJ0ICsgaV0tPmlzUmVhY2hhYmxlKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkgYW5kIGVuc3Vy
ZSB0aGF0IHRoZSBwcmVjZXNzb3JzIGFyZSBvcmRlcmVkIGJ5IGluZGV4LgorICAgICAgICAgICAg
ICAgIFByZWRlY2Vzc29yTGlzdCYgcHJlZGVjZXNzb3JzID0gbV9ncmFwaC5tX2Jsb2Nrc1tzdGFy
dCArIGldLT5tX3ByZWRlY2Vzc29yczsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBqID0gMDsK
KyAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwcmVkZWNlc3NvciBpbiB0aGlzIHN1
YmdyYXBoCisgICAgICAgICAgICAgICAgd2hpbGUgKHByZWRlY2Vzc29yc1tqXSA8IHN0YXJ0KQor
ICAgICAgICAgICAgICAgICAgICBqKys7CisKKyAgICAgICAgICAgICAgICBpZiAocHJlZGVjZXNz
b3JzW2pdID49IHN0YXJ0ICsgaSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBlbmNvdW50
ZXJlZCBhIGJhY2sgZWRnZSBpbiBhIGxvb3AsIAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQg
anVzdCBpZ25vcmUgdGhvc2UgYmxvY2tzIGluIHRoZSBsb29wIGV4Y2VwdCBmb3IgdGhlIGxvb3Ag
ZXhpdC4KKyAgICAgICAgICAgICAgICAgICAgaSA9IHByZWRlY2Vzc29yc1tqXSAtIHN0YXJ0IC0g
MTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgdW5zaWduZWQgbmV3SURvbSA9IHByZWRlY2Vzc29yc1tqXSAtIHN0YXJ0
OworICAgICAgICAgICAgICAgIEFTU0VSVChkb21UcmVlW25ld0lEb21dICE9IHNpemUpOyAvLyBN
dXN0IGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAg
ICAgICAgIGZvciAoOyBqIDwgcHJlZGVjZXNzb3JzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIHByZWQgPSBwcmVkZWNlc3NvcnNbal0gLSBzdGFydDsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGRvbVRyZWVbcHJlZF0gIT0gc2l6ZSkgLy8gTWVhbnMgaXQncyBh
bHJlYWR5IGNhbGN1bGF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdJRG9tID0gaW50
ZXJzZWN0KHByZWQsIG5ld0lEb20sIGRvbVRyZWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBpZiAoZG9tVHJlZVtpXSAhPSBuZXdJRG9tKSB7CisgICAgICAgICAgICAgICAg
ICAgIGRvbVRyZWVbaV0gPSBuZXdJRG9tOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICAvLyBUaGVuIHRyYXZlcnNlIHRoZSBkb21pbmF0b3IgdHJlZSB0byBnZXQgdGhlIGRvbWlu
YXRvcnMgb2YgdGhlIGxhc3QgYmxvY2suCisgICAgICAgIHVuc2lnbmVkIGlkb20gPSBkb21UcmVl
Lmxhc3QoKTsKKyAgICAgICAgd2hpbGUgKGlkb20pIHsKKyAgICAgICAgICAgIGRvbWluYXRvcnMu
YXBwZW5kKGlkb20gKyBzdGFydCk7CisgICAgICAgICAgICBpZG9tID0gZG9tVHJlZVtpZG9tXTsK
KyAgICAgICAgfQorICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChzdGFydCk7CisgICAgfQorCisg
ICAgdm9pZCBwZXJmb3JtTElDTShCbG9ja0luZGV4IHByZUhlYWRlckluZGV4KQorICAgIHsKKyAg
ICAgICAgQmFzaWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1twcmVI
ZWFkZXJJbmRleF07CisgICAgICAgIEJsb2NrSW5kZXggbG9vcEhlYWRlckluZGV4ID0gbV9ncmFw
aFtwcmVIZWFkZXJCbG9jay5lbmQgLSAxXS50YWtlbkJsb2NrSW5kZXgoKTsKKyAgICAgICAgQmFz
aWNCbG9jayYgYmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29wSGVhZGVySW5kZXhdOworICAg
ICAgICBCbG9ja0luZGV4IGxhc3RMb29wQmxvY2tJbmRleCA9IGxvb3BIZWFkZXJJbmRleDsKKyAg
ICAgICAgdW5zaWduZWQgaSA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsb2NrLm1f
cHJlZGVjZXNzb3JzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmxvY2subV9wcmVk
ZWNlc3NvcnNbaV0gPiBsYXN0TG9vcEJsb2NrSW5kZXgpCisgICAgICAgICAgICAgICAgbGFzdExv
b3BCbG9ja0luZGV4ID0gYmxvY2subV9wcmVkZWNlc3NvcnNbaV07IC8vIFRoZSBmcm9tIGJsb2Nr
IG9mIHRoZSBiYWNrIGVkZ2UuCisgICAgICAgIH0KKworICAgICAgICBCbG9ja0luZGV4IGZpcnN0
TG9vcEJsb2NrSW5kZXggPSBwcmVIZWFkZXJJbmRleCArIDE7CisgICAgICAgIFZlY3RvcjxCbG9j
a0luZGV4LCA4PiBtdXN0UmVhY2hCbG9ja3NJbkxvb3A7CisgICAgICAgIG11c3RSZWFjaEJsb2Nr
c0luTG9vcC5hcHBlbmQobGFzdExvb3BCbG9ja0luZGV4KTsKKyAgICAgICAgY29tcHV0ZURvbWlu
YXRvcnMoZmlyc3RMb29wQmxvY2tJbmRleCwgbGFzdExvb3BCbG9ja0luZGV4LCBtdXN0UmVhY2hC
bG9ja3NJbkxvb3ApOworCisgICAgICAgIHVuc2lnbmVkIGhvaXN0ZWQgPSAwOworICAgICAgICBW
ZWN0b3I8VmlydHVhbFJlZ2lzdGVyLCA4PiBwb2xsdXRlZExvY2FsczsKKyAgICAgICAgYm9vbCBt
ZXRJbmxpbmUgPSBmYWxzZTsKKyAgICAgICAgdW5zaWduZWQgcHJlSGVhZGVyRW5kQmVmb3JlTElD
TSA9IHByZUhlYWRlckJsb2NrLmVuZDsKKyAgICAgICAgdW5zaWduZWQgbGFzdEJlZm9yZUhvaXN0
ID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAgICAgd2hpbGUgKCFtdXN0UmVhY2hCbG9ja3NJbkxv
b3AuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXggPSBtdXN0
UmVhY2hCbG9ja3NJbkxvb3AubGFzdCgpOworICAgICAgICAgICAgbXVzdFJlYWNoQmxvY2tzSW5M
b29wLnJlbW92ZUxhc3QoKTsKKworICAgICAgICAgICAgZm9yIChtX2NvbXBpbGVJbmRleCA9IG1f
Z3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmJlZ2luOyBtX2NvbXBpbGVJbmRleCA8IG1fZ3Jh
cGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmVuZDsgKyttX2NvbXBpbGVJbmRleCkgeworICAgICAg
ICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsKKworICAgICAg
ICAgICAgICAgIGlmIChub2RlLm9wID09IFBoaSB8fCBub2RlLm9wID09IEdldExvY2FsKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGhvaXN0R2V0TG9jYWwocHJlSGVhZGVyQmxvY2ssIG1fZ3JhcGgu
bV9ibG9ja3NbZmlyc3RMb29wQmxvY2tJbmRleF0tPmJlZ2luLCBtX2dyYXBoLm1fYmxvY2tzW2xh
c3RMb29wQmxvY2tJbmRleF0tPmVuZCwgaG9pc3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChub2RlLm9w
ID09IEZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9k
ZS5jaGlsZHJlbi5maXhlZC5jaGlsZDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiB3ZSBt
ZWV0IGlubGluZWQgYm9kaWVzIGluIHRoZSBsb29wLgorICAgICAgICAgICAgICAgIC8vIFRoZXkg
bWF5IHBvbGx1dGUgc29tZSBsb2NhbCB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgaWYgKG5v
ZGUub3AgPT0gSW5saW5lU3RhcnQpCisgICAgICAgICAgICAgICAgICAgIG1ldElubGluZSA9IHRy
dWU7CisKKyAgICAgICAgICAgICAgICBib29sIHNob3VsZEdlbmVyYXRlID0gbm9kZS5zaG91bGRH
ZW5lcmF0ZSgpOworICAgICAgICAgICAgICAgIGJvb2wgY2FuSG9pc3QgPSBpc0hvaXN0Q2FuZGlk
YXRlKG5vZGUpCisgICAgICAgICAgICAgICAgICAgICYmIGhvaXN0ZWQgPCBNQVhfSE9JU1RFRF9M
T09QX0lOVkFSSUFOVFMgLSAxCisgICAgICAgICAgICAgICAgICAgICYmICFtZXRJbmxpbmUKKyAg
ICAgICAgICAgICAgICAgICAgJiYgKG5vZGUub3AgIT0gU2V0TG9jYWwgfHwgIXBvbGx1dGVkTG9j
YWxzLmNvbnRhaW5zKG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPmxvY2FsKCkpKTsKKworICAg
ICAgICAgICAgICAgIC8vIExvb2sgb25lIHN0ZXAgYWhlYWQuCisgICAgICAgICAgICAgICAgaWYg
KG1fZ3JhcGhbbV9jb21waWxlSW5kZXggKyAxXS5vcCA9PSBTZXRMb2NhbCAmJiBwb2xsdXRlZExv
Y2Fscy5jb250YWlucyhtX2dyYXBoW21fY29tcGlsZUluZGV4ICsgMV0udmFyaWFibGVBY2Nlc3NE
YXRhKCktPmxvY2FsKCkpKQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOwor
CisgICAgICAgICAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwgMz4gaG9pc3RlZENoaWxkcmVuOwor
ICAgICAgICAgICAgICAgIGNhbkhvaXN0ICY9IG5vZGVDYW5CZUhvaXN0ZWQobm9kZSwgcHJlSGVh
ZGVyQmxvY2ssIGhvaXN0ZWRDaGlsZHJlbik7CisKKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50
IHRvIGhvaXN0IHRoZSBTZXRMb2NhbCBub2RlIHdoYXRldmVyLgorICAgICAgICAgICAgICAgIGlm
ICghc2hvdWxkR2VuZXJhdGUgJiYgbm9kZS5vcCAhPSBTZXRMb2NhbCkKKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIAorI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJ
T05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICVzIEAldTogIiwgR3JhcGg6
Om9wTmFtZShtX2dyYXBoW21fY29tcGlsZUluZGV4XS5vcCksIG1fY29tcGlsZUluZGV4KTsKKyNl
bmRpZgorCisgICAgICAgICAgICAgICAgaWYgKGNhbkhvaXN0KSB7CisgICAgICAgICAgICAgICAg
ICAgIHBlcmZvcm1Ib2lzdChtX2NvbXBpbGVJbmRleCwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWQp
OworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBTZXRMb2NhbCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgcG9sbHV0ZWRMb2NhbHMuYXBwZW5kKG5vZGUudmFyaWFibGVBY2Nl
c3NEYXRhKCktPmxvY2FsKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wZXJhbmQg
PSBub2RlLmxvY2FsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmFuZElzQXJn
dW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxv
Y2sudmFyaWFibGVzQXRUYWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKSA9
IHByZUhlYWRlckJsb2NrLmVuZCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVzQXRUYWls
LmxvY2FsKG9wZXJhbmQpID0gcHJlSGVhZGVyQmxvY2suZW5kIC0gMTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkR2VuZXJhdGUgJiYgIWhv
aXN0ZWRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBu
b2RlIGNhbm5vdCBiZSBob2lzdGVkIGJ1dCBpdCBjb250YWlucyBzb21lIHJlZmVyZW5jZXMgdG8g
dGhlIGhvaXN0ZWQgbm9kZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBzdWNoIHJl
ZmVyZW5jZXMgYnkgdXRpbGl6aW5nIFNldExvY2FsL0dldExvY2FsIGZvciBjcm9zcyBibG9jayBy
ZWZlcmVuY2VzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
aG9pc3RlZENoaWxkcmVuLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFu
ZGxlSG9pc3RlZENoaWxkKGJsb2NrSW5kZXgsIGhvaXN0ZWRDaGlsZHJlbltpXSk7CisgICAgICAg
ICAgICAgICAgfQorCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQor
ICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgaWYgKGhvaXN0ZWQgPiAwKSB7CisgICAgICAgICAgICBBU1NFUlQo
bV9ncmFwaFtwcmVIZWFkZXJFbmRCZWZvcmVMSUNNIC0gMV0ub3AgPT0gSnVtcCk7CisgICAgICAg
ICAgICBtX2dyYXBoLmFwcGVuZChtX2dyYXBoW3ByZUhlYWRlckVuZEJlZm9yZUxJQ00gLSAxXSk7
CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGxhc3RCZWZvcmVIb2lzdCwgcHJlSGVhZGVyQmxv
Y2suYmVnaW4gPT0gbGFzdEJlZm9yZUhvaXN0KTsKKyAgICAgICAgICAgIHByZUhlYWRlckJsb2Nr
LmVuZCA9IG1fZ3JhcGguc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsb29w
SW52YXJpYW50Q29kZU1vdGlvbigpCisgICAgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCJQZXJmb3JtaW5nIGxvb3AgaW52YXJpYW50
IGNvZGUgbW90aW9uOiIpOworI2VuZGlmCisgICAgICAgIHVuc2lnbmVkIGkgPSAwOworICAgICAg
ICBmb3IgKGkgPSAwOyBpIDwgbV9ncmFwaC5tX2xvb3BQcmVIZWFkZXJCbG9ja3Muc2l6ZSgpOyAr
K2kpCisgICAgICAgICAgICBwZXJmb3JtTElDTShtX2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nr
c1tpXSk7CisKKyAgICAgICAgLy8gU29tZSBQaGkgbm9kZXMgbWF5IG5vdCBnZXQgdXBkYXRlZCBj
aGlsZHJlbiBmb3Igbm93LgorICAgICAgICBmb3IgKGkgPSBtX2dyYXBoLm1fYmxvY2tzLmxhc3Qo
KS0+ZW5kOyBpIDwgbV9ncmFwaC5tX29yaWdpbmFsU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBw
ZXJmb3JtU3Vic3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uZml4ZWQuY2hpbGQxKTsKKyAg
ICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obV9ncmFwaFtpXS5jaGlsZHJlbi5maXhlZC5j
aGlsZDIpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihtX2dyYXBoW2ldLmNoaWxk
cmVuLmZpeGVkLmNoaWxkMyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDbGVhbi11cAorICAg
ICAgICBmb3IgKGkgPSAwOyBpIDwgbV9yZXBsYWNlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICBtX3JlcGxhY2VtZW50c1tpXSA9IE5vTm9kZTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBh
bGxvY2F0ZVZpcnR1YWxSZWdpc3RlcnMoKQpAQCAtMTY0OSw4ICsyMzA3LDExIEBAIHByaXZhdGU6
CiAgICAgICAgIHByaW50ZigiXG4iKTsKICNlbmRpZgogICAgICAgICBTY29yZUJvYXJkIHNjb3Jl
Qm9hcmQobV9ncmFwaCwgbV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMpOwotICAgICAgICB1bnNpZ25l
ZCBzaXplRXhjbHVkaW5nUGhpTm9kZXMgPSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kOwot
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVFeGNsdWRpbmdQaGlOb2RlczsgKytp
KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkg
eworICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGhpIG5vZGVzCisgICAgICAgICAgICBpZiAoaSA+
PSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kICYmIGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxT
aXplKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBOb2RlJiBub2Rl
ID0gbV9ncmFwaFtpXTsKICAgICAgICAgCiAgICAgICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2Vu
ZXJhdGUoKSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3Vs
YXRpdmVKSVQuY3BwCShyZXZpc2lvbiAxMDU1NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTIwLDcgKzkyMCw4
IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVNb3ZIaW50KE5vZGUKIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYgYmxvY2spCiB7CiAgICAgQVNTRVJUKG1fY29t
cGlsZU9rYXkpOwotICAgIEFTU0VSVChtX2NvbXBpbGVJbmRleCA9PSBibG9jay5iZWdpbik7Cisg
ICAgLy8gQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKKyAgICBtX2NvbXBp
bGVJbmRleCA9IGJsb2NrLmJlZ2luOwogICAgIAogICAgIGlmICghYmxvY2suaXNSZWFjaGFibGUp
IHsKICAgICAgICAgbV9jb21waWxlSW5kZXggPSBibG9jay5lbmQ7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHJldmlzaW9u
IDEwNTU2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3MTAsNiArMzcxMCwxMSBAQCBza2lwX2lkX2N1c3Rv
bV9zZWxmOgogICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9sb29wX2hpbnQpOwogICAg
ICAgICBORVhUX0lOU1RSVUNUSU9OKCk7CiAgICAgfQorICAgIERFRklORV9PUENPREUob3BfbG9v
cF9wcmVoZWFkZXIpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIG5vLW9wIHVubGVzcyB3ZSBpbnRl
bmQgb24gZG9pbmcgT1NSIGZyb20gdGhlIGludGVycHJldGVyLgorICAgICAgICB2UEMgKz0gT1BD
T0RFX0xFTkdUSChvcF9sb29wX3ByZWhlYWRlcik7CisgICAgICAgIE5FWFRfSU5TVFJVQ1RJT04o
KTsKKyAgICB9CiAgICAgREVGSU5FX09QQ09ERShvcF9sb29wX2lmX3RydWUpIHsKICAgICAgICAg
LyogbG9vcF9pZl90cnVlIGNvbmQocikgdGFyZ2V0KG9mZnNldCkKICAgICAgICAgIApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAkocmV2aXNpb24gMTA1NTY5KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCw3IEBA
IEpJVDo6SklUKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgQ29kZUIKICNlbHNlCiAgICAgLCBt
X3JhbmRvbUdlbmVyYXRvcihzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocmFuZG9tTnVtYmVyKCkgKiAw
eEZGRkZGRkYpKQogI2VuZGlmCisgICAgLCBtX2xhc3RMb29wUHJlSGVhZGVyT2Zmc2V0KCh1bnNp
Z25lZCktMSkKIHsKIH0KIApAQCAtMTAyLDcgKzEwMyw3IEBAIHZvaWQgSklUOjplbWl0T3B0aW1p
emF0aW9uQ2hlY2soT3B0aW1pemEKICAgICBKdW1wIHNraXBPcHRpbWl6ZSA9IGJyYW5jaEFkZDMy
KFNpZ25lZCwgVHJ1c3RlZEltbTMyKGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gT3B0
aW9uczo6ZXhlY3V0aW9uQ291bnRlckluY3JlbWVudEZvckxvb3AgOiBPcHRpb25zOjpleGVjdXRp
b25Db3VudGVySW5jcmVtZW50Rm9yUmV0dXJuKSwgQWJzb2x1dGVBZGRyZXNzKG1fY29kZUJsb2Nr
LT5hZGRyZXNzT2ZKSVRFeGVjdXRlQ291bnRlcigpKSk7CiAgICAgSklUU3R1YkNhbGwgc3R1YkNh
bGwodGhpcywga2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBjdGlfb3B0aW1pemVfZnJv
bV9sb29wIDogY3RpX29wdGltaXplX2Zyb21fcmV0KTsKICAgICBpZiAoa2luZCA9PSBMb29wT3B0
aW1pemF0aW9uQ2hlY2spCi0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0
ZWNvZGVPZmZzZXQpKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIobV9sYXN0
TG9vcFByZUhlYWRlck9mZnNldCkpOwogICAgIHN0dWJDYWxsLmNhbGwoKTsKICAgICBza2lwT3B0
aW1pemUubGluayh0aGlzKTsKIH0KQEAgLTI5MSw2ICsyOTIsNyBAQCB2b2lkIEpJVDo6cHJpdmF0
ZUNvbXBpbGVNYWluUGFzcygpCiAgICAgICAgIERFRklORV9PUChvcF9qdHJ1ZSkKICAgICAgICAg
REVGSU5FX09QKG9wX2xvb3ApCiAgICAgICAgIERFRklORV9PUChvcF9sb29wX2hpbnQpCisgICAg
ICAgIERFRklORV9PUChvcF9sb29wX3ByZWhlYWRlcikKICAgICAgICAgREVGSU5FX09QKG9wX2xv
b3BfaWZfbGVzcykKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaWZfbGVzc2VxKQogICAgICAg
ICBERUZJTkVfT1Aob3BfbG9vcF9pZl9ncmVhdGVyKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2ppdC9KSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJ
VC5oCShyZXZpc2lvbiAxMDU1NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5o
CSh3b3JraW5nIGNvcHkpCkBAIC04MjEsNiArODIxLDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAg
ICAgIHZvaWQgZW1pdF9vcF9qdHJ1ZShJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRf
b3BfbG9vcChJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9oaW50KElu
c3RydWN0aW9uKik7CisgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX3ByZWhlYWRlcihJbnN0cnVj
dGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9sZXNzKEluc3RydWN0aW9uKik7
CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3NlcShJbnN0cnVjdGlvbiopOwogICAg
ICAgICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9ncmVhdGVyKEluc3RydWN0aW9uKik7CkBAIC0xMDkw
LDYgKzEwOTEsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICNpZiBFTkFCTEUoVkFMVUVfUFJPRklMRVIp
CiAgICAgICAgIGJvb2wgbV9jYW5CZU9wdGltaXplZDsKICNlbmRpZgorICAgICAgICB1bnNpZ25l
ZCBtX2xhc3RMb29wUHJlSGVhZGVyT2Zmc2V0OwogICAgIH0gSklUX0NMQVNTX0FMSUdOTUVOVDsK
IAogICAgIGlubGluZSB2b2lkIEpJVDo6ZW1pdF9vcF9sb29wKEluc3RydWN0aW9uKiBjdXJyZW50
SW5zdHJ1Y3Rpb24pCkBAIC0xMTAzLDYgKzExMDUsMTEgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAg
ICAgIGVtaXRPcHRpbWl6YXRpb25DaGVjayhMb29wT3B0aW1pemF0aW9uQ2hlY2spOwogICAgIH0K
IAorICAgIGlubGluZSB2b2lkIEpJVDo6ZW1pdF9vcF9sb29wX3ByZWhlYWRlcihJbnN0cnVjdGlv
biopCisgICAgeworICAgICAgICBtX2xhc3RMb29wUHJlSGVhZGVyT2Zmc2V0ID0gbV9ieXRlY29k
ZU9mZnNldDsKKyAgICB9CisKICAgICBpbmxpbmUgdm9pZCBKSVQ6OmVtaXRfb3BfbG9vcF9pZl90
cnVlKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiAgICAgewogICAgICAgICBlbWl0
VGltZW91dENoZWNrKCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124682</attachid>
            <date>2012-01-31 01:16:57 -0800</date>
            <delta_ts>2012-02-01 01:37:36 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.5.patch</filename>
            <type>text/plain</type>
            <size>50218</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2MjQwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgxIEBA
CisyMDEyLTAxLTMwICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIExvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGluIEpTQyBERkcKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzcwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV29yay1pbi1wcm9ncmVzcy4KKwor
ICAgICAgICBUaGUgZnJhbWV3b3JrIHRvIHN1cHBvcnQgbW92aW5nIGEgREZHIG5vZGUgKGFuZCB0
aGUgbm9kZXMgY2hhaW5lZCB3aXRoCisgICAgICAgIHJlZmVyZW5jZXMpIHRvIGEgZGlmZmVyZW50
IGJhc2ljIGJsb2NrIGlzIHN1cHBvc2VkIHRvIHdvcmssIGFzIHdlbGwgYXMKKyAgICAgICAgdGhl
IG1lY2hhbmlzbSB0byBzdXBwb3J0IGNyb3NzLWJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgIEEg
YmFzaWMgYmxvY2sgZG9taW5hbmNlIGFuYWx5c2lzIGFsZ29yaXRobSBpcyBpbnRyb2R1Y2VkIHRv
IGRldGVybWluZQorICAgICAgICB3aGljaCBsb29wIGJsb2NrcyBzaG91bGQgYmUgY29uc2lkZXJl
ZCBmb3IgY29kZSBtb3Rpb246IHRoZSBibG9ja3MKKyAgICAgICAgdGhhdCBkb21pbmF0ZSB0aGUg
bG9vcCBleGl0LgorICAgICAgICBUaGUgT1NSIGVudHJ5IGlzIG1vZGlmaWVkLiBUaGVyZSdzIGEg
ZGVkaWNhdGVkIGxvb3AgcHJlaGVhZGVyIGJsb2NrIGFzCisgICAgICAgIHRoZSBPU1IgZW50cnku
CisgICAgICAgIFNpZGUgZWZmZWN0cyBhbmFseXNpcyBvZiBhIGxvb3AgaXMgcGVyZm9ybWVkIHRv
IGZpbmQgb3V0IGlmIHRoZXJlJ3JlCisgICAgICAgIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8g
dGhlIHByb3BlcnRpZXMgb3IgdGhlIHN0cnVjdHVyZXMsIGFuZCBpZgorICAgICAgICB0aGVyZSdy
ZSBwb3NzaWJsZSBtb2RpZmljYXRpb25zIHRvIHRoZSBsb2NhbCBvciB0aGUgZ2xvYmFsIHZhcmlh
YmxlcywKKyAgICAgICAgdG8gaGVscCB1cyBtb3JlIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHdoZXRo
ZXIgYSBERkcgbm9kZSBpcyBpbmRlZWQgbG9vcAorICAgICAgICBpbnZhcmlhbnQgb3Igbm90Lgor
CisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJs
b2NrOjpkdW1wKToKKyAgICAgICAgKiBieXRlY29kZS9PcGNvZGUuaDoKKyAgICAgICAgKiBieXRl
Y29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdl
bmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5oOgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3Bw
OgorICAgICAgICAoSlNDOjpEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpT
Qzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JOb2RlOjplbWl0
Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAg
ICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkFic3Ry
YWN0U3RhdGU6Om1lcmdlU3RhdGVBdFRhaWwpOgorICAgICAgICAoSlNDOjpERkc6OkFic3RyYWN0
U3RhdGU6Om1lcmdlVmFyaWFibGVCZXR3ZWVuQmxvY2tzKToKKyAgICAgICAgKiBkZmcvREZHQnl0
ZUNvZGVQYXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUJsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2UpOgorICAg
ICAgICAqIGRmZy9ERkdDYXBhYmlsaXRpZXMuaDoKKyAgICAgICAgKEpTQzo6REZHOjpjYW5Db21w
aWxlT3Bjb2RlKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpkdW1wKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguaDoKKyAgICAgICAgKiBk
ZmcvREZHTm9kZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OnNldFZhcmlhYmxlQWNjZXNz
RGF0YSk6CisgICAgICAgICogZGZnL0RGR1Byb3BhZ2F0b3IuY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6OmZpeHBvaW50KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
Ojpwcm9wYWdhdGVOb2RlUHJlZGljdGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OnBlcmZvcm1TdWJzdGl0dXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6
OmxvY2FsQ1NFKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjppc0hvaXN0Q2FuZGlk
YXRlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpub2RlQ2FuQmVIb2lzdGVkKToK
KyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpyZWZlcmVuY2VNYXlCZVNraXBwZWROb2Rl
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtSG9pc3QpOgorICAgICAg
ICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnZhcmlhYmxlRGVmaW5lZEluTG9vcCk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6aG9pc3RHZXRMb2NhbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkV2l0aFNldExvY2FsKToKKyAgICAgICAgKEpT
Qzo6REZHOjpQcm9wYWdhdG9yOjpmaXhIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6
OlByb3BhZ2F0b3I6OmhhbmRsZUhvaXN0ZWRDaGlsZCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJv
cGFnYXRvcjo6aW50ZXJzZWN0KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpjb21w
dXRlRG9taW5hdG9ycyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUxJ
Q00pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Omxvb3BJbnZhcmlhbnRDb2RlTW90
aW9uKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjphbGxvY2F0ZVZpcnR1YWxSZWdp
c3RlcnMpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAqIGludGVycHJldGVy
L0ludGVycHJldGVyLmNwcDoKKyAgICAgICAgKEpTQzo6SW50ZXJwcmV0ZXI6OnByaXZhdGVFeGVj
dXRlKToKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAgICAgKEpTQzo6SklUOjpKSVQpOgor
ICAgICAgICAoSlNDOjpKSVQ6OmVtaXRPcHRpbWl6YXRpb25DaGVjayk6CisgICAgICAgIChKU0M6
OkpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcyk6CisgICAgICAgICogaml0L0pJVC5oOgorICAg
ICAgICAoSlNDOjpKSVQ6OmVtaXRfb3BfbG9vcF9oaW50KToKKyAgICAgICAgKEpTQzo6SklUOjpl
bWl0X29wX2xvb3BfcHJlaGVhZGVyKToKKwogMjAxMi0wMS0yOSAgWm9sdGFuIEhlcmN6ZWcgIDx6
aGVyY3plZ0B3ZWJraXQub3JnPgogCiAgICAgICAgIEN1c3RvbSB3cml0dGVuIENTUyBsZXhlcgpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHJl
dmlzaW9uIDEwNjI0MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxv
Y2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTAyLDYgKzExMDIsMTAgQEAgdm9pZCBDb2RlQmxv
Y2s6OmR1bXAoRXhlY1N0YXRlKiBleGVjLCBjbwogICAgICAgICAgICAgcHJpbnRmKCJbJTRkXSBs
b29wX2hpbnRcbiIsIGxvY2F0aW9uKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Cisg
ICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIHByaW50ZigiWyU0
ZF0gbG9vcF9wcmVoZWFkZXJcbiIsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CiAgICAgICAgIGNhc2Ugb3Bfc3dpdGNoX2ltbTogewogICAgICAgICAgICAgaW50IHRh
YmxlSW5kZXggPSAoKytpdCktPnUub3BlcmFuZDsKICAgICAgICAgICAgIGludCBkZWZhdWx0VGFy
Z2V0ID0gKCsraXQpLT51Lm9wZXJhbmQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0
ZWNvZGUvT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL09wY29kZS5oCShyZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTE1OCw2ICsxNTgsNyBAQCBuYW1l
c3BhY2UgSlNDIHsKICAgICAgICAgbWFjcm8ob3BfbG9vcF9pZl9ncmVhdGVyLCA0KSBcCiAgICAg
ICAgIG1hY3JvKG9wX2xvb3BfaWZfZ3JlYXRlcmVxLCA0KSBcCiAgICAgICAgIG1hY3JvKG9wX2xv
b3BfaGludCwgMSkgXAorICAgICAgICBtYWNybyhvcF9sb29wX3ByZWhlYWRlciwgMSkgXAogICAg
ICAgICBtYWNybyhvcF9zd2l0Y2hfaW1tLCA0KSBcCiAgICAgICAgIG1hY3JvKG9wX3N3aXRjaF9j
aGFyLCA0KSBcCiAgICAgICAgIG1hY3JvKG9wX3N3aXRjaF9zdHJpbmcsIDQpIFwKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVH
ZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjg2
LDYgKzY4NiwxMyBAQCB2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0TG9vcEhpbnQoKQogI2Vu
ZGlmCiB9CiAKK3ZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wUHJlSGVhZGVyKCkKK3sK
KyNpZiBFTkFCTEUoREZHX0pJVCkKKyAgICBlbWl0T3Bjb2RlKG9wX2xvb3BfcHJlaGVhZGVyKTsK
KyNlbmRpZgorfQorCiB2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjpyZXRyaWV2ZUxhc3RCaW5hcnlP
cChpbnQmIGRzdEluZGV4LCBpbnQmIHNyYzFJbmRleCwgaW50JiBzcmMySW5kZXgpCiB7CiAgICAg
QVNTRVJUKGluc3RydWN0aW9ucygpLnNpemUoKSA+PSA0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHJl
dmlzaW9uIDEwNjI0MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0
ZWNvZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzQ3LDYgKzM0Nyw3IEBAIG5hbWVz
cGFjZSBKU0MgewogCiAgICAgICAgIFBhc3NSZWZQdHI8TGFiZWw+IGVtaXRMYWJlbChMYWJlbCop
OwogICAgICAgICB2b2lkIGVtaXRMb29wSGludCgpOworICAgICAgICB2b2lkIGVtaXRMb29wUHJl
SGVhZGVyKCk7CiAgICAgICAgIFBhc3NSZWZQdHI8TGFiZWw+IGVtaXRKdW1wKExhYmVsKiB0YXJn
ZXQpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBlbWl0SnVtcElmVHJ1ZShSZWdpc3RlcklE
KiBjb25kLCBMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdEp1
bXBJZkZhbHNlKFJlZ2lzdGVySUQqIGNvbmQsIExhYmVsKiB0YXJnZXQpOwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAko
cmV2aXNpb24gMTA2MjQwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDc4LDYgKzE0NzgsMTAgQEAgUmVn
aXN0ZXJJRCogRG9XaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeQogewogICAgIFJlZlB0cjxMYWJl
bFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVsU2NvcGU6Okxvb3Ap
OwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVs
KCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBn
ZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKKwogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZM
b29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BP
Zkxvb3AuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsKQEAgLTE1MDQsMTIg
KzE1MDgsMTUgQEAgUmVnaXN0ZXJJRCogV2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZQogewog
ICAgIFJlZlB0cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExh
YmVsU2NvcGU6Okxvb3ApOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2Vu
ZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVy
LmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKICAgICBnZW5lcmF0
b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwogCiAgICAgUmVmUHRyPExhYmVs
PiB0b3BPZkxvb3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0b3IuZW1pdExh
YmVsKHRvcE9mTG9vcC5nZXQoKSk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludCgpOwotICAg
IAorCiAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwogCiAgICAgZ2Vu
ZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CkBAIC0xNTM5LDYgKzE1
NDYsMTAgQEAgUmVnaXN0ZXJJRCogRm9yTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjbwogICAgIGlm
IChtX2V4cHIxKQogICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRS
ZXN1bHQoKSwgbV9leHByMSk7CiAKKyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBn
ZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFk
ZXIuZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcFByZUhlYWRlcigpOworCiAgICAgUmVm
UHRyPExhYmVsPiBjb25kaXRpb24gPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0
b3IuZW1pdEp1bXAoY29uZGl0aW9uLmdldCgpKTsKIApAQCAtMTU4OCw2ICsxNTk5LDEwIEBAIFJl
Z2lzdGVySUQqIEZvckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGUKICAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gc2l6ZSA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKICAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gZXhwZWN0ZWRTdWJzY3JpcHQ7CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGl0ZXIgPSBn
ZW5lcmF0b3IuZW1pdEdldFByb3BlcnR5TmFtZXMoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBi
YXNlLmdldCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBzY29wZS0+YnJlYWtUYXJnZXQoKSk7CisK
KyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsK
KyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIuZ2V0KCkpOworICAgIGdlbmVy
YXRvci5lbWl0TG9vcFByZUhlYWRlcigpOwogICAgIGdlbmVyYXRvci5lbWl0SnVtcChzY29wZS0+
Y29udGludWVUYXJnZXQoKSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IGxvb3BTdGFydCA9IGdlbmVy
YXRvci5uZXdMYWJlbCgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0
cmFjdFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0Fic3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MzcsNyAr
OTM3LDcgQEAgaW5saW5lIGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VAogICAgIEFi
c3RyYWN0VmFsdWUqIHNvdXJjZTsKICAgICAgICAgCiAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhb
bm9kZUluZGV4XTsKLSAgICBpZiAoIW5vZGUucmVmQ291bnQoKSkKKyAgICBpZiAoIW5vZGUuYWRq
dXN0ZWRSZWZDb3VudCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCiAjaWYgREZHX0VO
QUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQpAQCAtMTA0NywxMSArMTA0NywxMSBAQCBp
bmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVRvU3VjY2VzCiAKIGlubGluZSBib29sIEFi
c3RyYWN0U3RhdGU6Om1lcmdlVmFyaWFibGVCZXR3ZWVuQmxvY2tzKEFic3RyYWN0VmFsdWUmIGRl
c3RpbmF0aW9uLCBBYnN0cmFjdFZhbHVlJiBzb3VyY2UsIE5vZGVJbmRleCBkZXN0aW5hdGlvbk5v
ZGVJbmRleCwgTm9kZUluZGV4IHNvdXJjZU5vZGVJbmRleCkKIHsKLSAgICBpZiAoZGVzdGluYXRp
b25Ob2RlSW5kZXggPT0gTm9Ob2RlKQorICAgIC8vIEZJWE1FOiBJdCdzIHBvc3NpYmxlIHRoYXQg
dGhlIHNvdXJjZSBpcyBOb05vZGUgYnV0IHRoZSBkZXN0IGlzbid0LAorICAgIC8vIGJlY2F1c2Ug
d2UgZGlkIExJQ00gYW5kIHRoZSBkZXN0IGlzIGluIGEgbG9vcCBwcmVIZWFkZXIuCisgICAgaWYg
KGRlc3RpbmF0aW9uTm9kZUluZGV4ID09IE5vTm9kZSB8fCBzb3VyY2VOb2RlSW5kZXggPT0gTm9O
b2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCi0gICAgQVNTRVJUX1VOVVNFRChzb3Vy
Y2VOb2RlSW5kZXgsIHNvdXJjZU5vZGVJbmRleCAhPSBOb05vZGUpOwotICAgIAogICAgIC8vIEZJ
WE1FOiBXZSBjb3VsZCBkbyBzb21lIHNwYXJzZSBjb25kaXRpb25hbCBwcm9wYWdhdGlvbiBoZXJl
IQogICAgIAogICAgIHJldHVybiBkZXN0aW5hdGlvbi5tZXJnZShzb3VyY2UpOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlz
aW9uIDEwNjI0MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJz
ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTYyLDcgKzIxNjIsMTcgQEAgYm9vbCBCeXRlQ29k
ZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBv
cF9sb29wX2hpbnQ6IHsKLSAgICAgICAgICAgIC8vIEJhc2VsaW5lLT5ERkcgT1NSIGp1bXBzIGJl
dHdlZW4gbG9vcCBoaW50cy4gVGhlIERGRyBhc3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRworICAg
ICAgICAgICAgQVNTRVJUX1VOVVNFRChibG9ja0JlZ2luLCBtX2N1cnJlbnRJbmRleCA9PSBibG9j
a0JlZ2luKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRW1pdCBhIHBoYW50b20gbm9k
ZSB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIHRoaXMgYnl0
ZWNvZGUKKyAgICAgICAgICAgIC8vIG9wLgorICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9t
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTkVYVF9PUENPREUob3BfbG9vcF9oaW50KTsK
KyAgICAgICAgfQorCisgICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAg
ICAgIC8vIEJhc2VsaW5lLT5ERkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBwcmVoZWFkZXJzLiBU
aGUgREZHIGFzc3VtZXMgdGhhdCBCYXNlbGluZS0+REZHCiAgICAgICAgICAgICAvLyBPU1IgY2Fu
IG9ubHkgaGFwcGVuIGF0IGJhc2ljIGJsb2NrIGJvdW5kYXJpZXMuIEFzc2VydCB0aGF0IHRoZXNl
IHR3byBzdGF0ZW1lbnRzCiAgICAgICAgICAgICAvLyBhcmUgY29tcGF0aWJsZS4KICAgICAgICAg
ICAgIEFTU0VSVF9VTlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdp
bik7CkBAIC0yMTc3LDcgKzIxODcsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2Nr
KHVuc2lnbmVkCiAgICAgICAgICAgICAvLyBvcC4KICAgICAgICAgICAgIGFkZFRvR3JhcGgoUGhh
bnRvbSk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2xvb3BfaGlu
dCk7CisgICAgICAgICAgICBtX2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nrcy5hcHBlbmQobV9n
cmFwaC5tX2Jsb2Nrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2xv
b3BfcHJlaGVhZGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yNjA4LDYg
KzI2MTksNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZSgpCiAgICAgbV9ncmFwaC5tX3By
ZXNlcnZlZFZhcnMgPSBtX3ByZXNlcnZlZFZhcnM7CiAgICAgbV9ncmFwaC5tX2xvY2FsVmFycyA9
IG1fbnVtTG9jYWxzOwogICAgIG1fZ3JhcGgubV9wYXJhbWV0ZXJTbG90cyA9IG1fcGFyYW1ldGVy
U2xvdHM7CisgICAgbV9ncmFwaC5tX29yaWdpbmFsU2l6ZSA9IG1fZ3JhcGguc2l6ZSgpOwogCiAg
ICAgcmV0dXJuIHRydWU7CiB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Nh
cGFiaWxpdGllcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
Q2FwYWJpbGl0aWVzLmgJKHJldmlzaW9uIDEwNjI0MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzMCw2ICsxMzAsNyBA
QCBpbmxpbmUgYm9vbCBjYW5Db21waWxlT3Bjb2RlKE9wY29kZUlEIG9wCiAgICAgY2FzZSBvcF9q
bmdyZWF0ZXI6CiAgICAgY2FzZSBvcF9qbmdyZWF0ZXJlcToKICAgICBjYXNlIG9wX2xvb3BfaGlu
dDoKKyAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOgogICAgIGNhc2Ugb3BfbG9vcF9pZl9sZXNz
OgogICAgIGNhc2Ugb3BfbG9vcF9pZl9sZXNzZXE6CiAgICAgY2FzZSBvcF9sb29wX2lmX2dyZWF0
ZXI6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmNwcAkocmV2aXNpb24g
MTA2MjQwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEyNiw3ICsxMjYsNyBAQCB2b2lkIEdyYXBoOjpkdW1wKE5vZGVJbmRleCBu
b2RlSW5kZXgsIENvCiAKICAgICB1bnNpZ25lZCByZWZDb3VudCA9IG5vZGUucmVmQ291bnQoKTsK
ICAgICBib29sIHNraXBwZWQgPSAhcmVmQ291bnQ7Ci0gICAgYm9vbCBtdXN0R2VuZXJhdGUgPSBu
b2RlLm11c3RHZW5lcmF0ZSgpOworICAgIGJvb2wgbXVzdEdlbmVyYXRlID0gcmVmQ291bnQgJiYg
bm9kZS5tdXN0R2VuZXJhdGUoKTsKICAgICBpZiAobXVzdEdlbmVyYXRlKSB7CiAgICAgICAgIEFT
U0VSVChyZWZDb3VudCk7CiAgICAgICAgIC0tcmVmQ291bnQ7CkBAIC0yOTQsNyArMjk0LDcgQEAg
dm9pZCBHcmFwaDo6ZHVtcChDb2RlQmxvY2sqIGNvZGVCbG9jaykKICAgICAgICAgcHJpbnRmKCJc
biIpOwogICAgIH0KICAgICBwcmludGYoIlBoaSBOb2RlczpcbiIpOwotICAgIGZvciAoc2l6ZV90
IGkgPSBtX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IHNpemUoKTsgKytpKQorICAgIGZvciAoc2l6
ZV90IGkgPSBtX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IG1fb3JpZ2luYWxTaXplOyArK2kpCiAg
ICAgICAgIGR1bXAoaSwgY29kZUJsb2NrKTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdHcmFwaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHR3JhcGguaAkocmV2aXNpb24gMTA2MjQwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdHcmFwaC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMzksNiArMjM5LDcgQEAgcHVibGlj
OgogICAgIH0KIAogICAgIFZlY3RvcjwgT3duUHRyPEJhc2ljQmxvY2s+ICwgOD4gbV9ibG9ja3M7
CisgICAgVmVjdG9yPEJsb2NrSW5kZXgsIDg+IG1fbG9vcFByZUhlYWRlckJsb2NrczsKICAgICBW
ZWN0b3I8Tm9kZUluZGV4LCAxNj4gbV92YXJBcmdDaGlsZHJlbjsKICAgICBWZWN0b3I8U3RvcmFn
ZUFjY2Vzc0RhdGE+IG1fc3RvcmFnZUFjY2Vzc0RhdGE7CiAgICAgVmVjdG9yPFJlc29sdmVHbG9i
YWxEYXRhPiBtX3Jlc29sdmVHbG9iYWxEYXRhOwpAQCAtMjQ5LDYgKzI1MCw3IEBAIHB1YmxpYzoK
ICAgICBCaXRWZWN0b3IgbV9wcmVzZXJ2ZWRWYXJzOwogICAgIHVuc2lnbmVkIG1fbG9jYWxWYXJz
OwogICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyU2xvdHM7CisgICAgdW5zaWduZWQgbV9vcmlnaW5h
bFNpemU7IC8vIFRoZSBncmFwaCBzaXplIGJlZm9yZSB3ZSBkbyBvcHRpbWl6YXRpb25zIHdoaWNo
IHdpbGwgZXhwYW5kIHRoZSBncmFwaC4KIHByaXZhdGU6CiAgICAgCiAgICAgLy8gV2hlbiBhIG5v
ZGUncyByZWZDb3VudCBnb2VzIGZyb20gMCB0byAxLCBpdCBtdXN0IChsb2dpY2FsbHkpIHJlY3Vy
c2l2ZWx5IHJlZiBhbGwgb2YgaXRzIGNoaWxkcmVuLCBhbmQgdmljZSB2ZXJzYS4KSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCShyZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDk5LDYgKzQ5
OSwxMiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIHJldHVybiB2YXJpYWJsZUFjY2Vzc0RhdGEo
KS0+bG9jYWwoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldFZhcmlhYmxlQWNjZXNzRGF0YSh2b2lk
KiBkYXRhKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGhhc1ZhcmlhYmxlQWNjZXNzRGF0YSgpKTsK
KyAgICAgICAgbV9vcEluZm8gPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGF0YSk7Cisg
ICAgfQorCiAjaWZuZGVmIE5ERUJVRwogICAgIGJvb2wgaGFzSWRlbnRpZmllcigpCiAgICAgewpA
QCAtMTAzNSw3ICsxMDQxLDcgQEAgc3RydWN0IE5vZGUgewogICAgIHsKICAgICAgICAgcmV0dXJu
IG5vZGVDYW5TcGVjdWxhdGVJbnRlZ2VyKGFyaXRoTm9kZUZsYWdzKCkpOwogICAgIH0KLSAgICAK
KwogI2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGR1bXBDaGlsZHJlbihGSUxFKiBvdXQpCiAgICAg
ewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQcm9wYWdhdG9yLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCShy
ZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0
b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3NSwxMyBAQCBwdWJsaWM6CiAgICAgICAg
IG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7CiAjZW5kaWYKIAorICAgICAgICBsb29wSW52YXJp
YW50Q29kZU1vdGlvbigpOworCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJC
T1NFKQorICAgICAgICBwcmludGYoIkdyYXBoIGFmdGVyIGxvb3AgaW52YXJpYW50IGNvZGUgbW90
aW9uOlxuIik7CisgICAgICAgIG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7CisjZW5kaWYKKwog
ICAgICAgICBhbGxvY2F0ZVZpcnR1YWxSZWdpc3RlcnMoKTsKIAogI2lmIERGR19FTkFCTEUoREVC
VUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKQEAgLTI4OSw3ICsyOTYsNyBAQCBwcml2YXRlOgogICAg
IAogICAgIHZvaWQgcHJvcGFnYXRlTm9kZVByZWRpY3Rpb25zKE5vZGUmIG5vZGUpCiAgICAgewot
ICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgaWYgKCFub2RlLnNo
b3VsZEdlbmVyYXRlKCkgJiYgbm9kZS5vcCAhPSBTZXRMb2NhbCkKICAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgCiAgICAgICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKQEAgLTExMDEsNiAr
MTEwOCwxMyBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxl
ZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCk7CiAgICAgfQogICAgIAorICAgIGJvb2wg
Y29tcGFyZUVxSXNQdXJlKE5vZGUmIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gaXNQcmVk
aWN0ZWROdW1lcmljYWwobm9kZSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0
ZUZpbmFsT2JqZWN0KG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIo
KV0pCisgICAgICAgICAgICB8fCBOb2RlOjpzaG91bGRTcGVjdWxhdGVBcnJheShtX2dyYXBoW25v
ZGUuY2hpbGQxKCldLCBtX2dyYXBoW25vZGUuY2hpbGQyKCldKTsKKyAgICB9CisKICAgICBib29s
IGxvZ2ljYWxOb3RJc1B1cmUoTm9kZSYgbm9kZSkKICAgICB7CiAgICAgICAgIFByZWRpY3RlZFR5
cGUgcHJlZGljdGlvbiA9IG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpOwpAQCAt
MTEyOCw4ICsxMTQyLDkgQEAgcHJpdmF0ZToKICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgog
ICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVy
RXE6Ci0gICAgICAgIGNhc2UgQ29tcGFyZUVxOgogICAgICAgICAgICAgcmV0dXJuICFpc1ByZWRp
Y3RlZE51bWVyaWNhbChub2RlKTsKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAg
ICByZXR1cm4gIWNvbXBhcmVFcUlzUHVyZShub2RlKTsKICAgICAgICAgY2FzZSBMb2dpY2FsTm90
OgogICAgICAgICAgICAgcmV0dXJuICFsb2dpY2FsTm90SXNQdXJlKG5vZGUpOwogICAgICAgICBj
YXNlIEdldEJ5VmFsOgpAQCAtMTQyMyw3ICsxNDM4LDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBl
cmZvcm1TdWJzdGl0dXRpb24oTm9kZUluZGV4JiBjaGlsZCwgYm9vbCBhZGRSZWYgPSB0cnVlKQog
ICAgIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYW5kIGlzIGFjdHVhbGx5IHVudXNl
ZC4KLSAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSkKKyAgICAgICAgaWYgKGNoaWxkID09IE5v
Tm9kZSB8fCBjaGlsZCA+PSBtX3JlcGxhY2VtZW50cy5zaXplKCkpCiAgICAgICAgICAgICByZXR1
cm47CiAgICAgICAgIAogICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcmVwbGFjZW1l
bnQuCkBAIC0xNDM1LDEwICsxNDUwLDEwIEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICAv
LyBUaGVyZSBpcyBkZWZpbml0ZWx5IGEgcmVwbGFjZW1lbnQuIEFzc2VydCB0aGF0IHRoZSByZXBs
YWNlbWVudCBkb2VzIG5vdAogICAgICAgICAvLyBoYXZlIGEgcmVwbGFjZW1lbnQuCi0gICAgICAg
IEFTU0VSVChtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJU
KGNoaWxkID49IG1fcmVwbGFjZW1lbnRzLnNpemUoKSB8fCBtX3JlcGxhY2VtZW50c1tjaGlsZF0g
PT0gTm9Ob2RlKTsKICAgICAgICAgCiAgICAgICAgIGlmIChhZGRSZWYpCi0gICAgICAgICAgICBt
X2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgICAgIHJlZmVyZW5jZU1heUJlU2tpcHBlZE5v
ZGUoY2hpbGQpOwogICAgIH0KICAgICAKICAgICB2b2lkIHNldFJlcGxhY2VtZW50KE5vZGVJbmRl
eCByZXBsYWNlbWVudCkKQEAgLTE2MzksNiArMTY1NCw2NzkgQEAgcHJpdmF0ZToKICNlbmRpZgog
ICAgICAgICBmb3IgKHVuc2lnbmVkIGJsb2NrID0gMDsgYmxvY2sgPCBtX2dyYXBoLm1fYmxvY2tz
LnNpemUoKTsgKytibG9jaykKICAgICAgICAgICAgIHBlcmZvcm1CbG9ja0NTRSgqbV9ncmFwaC5t
X2Jsb2Nrc1tibG9ja10pOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3Jl
cGxhY2VtZW50cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0g
Tm9Ob2RlOworICAgIH0KKyAgICAKKyNkZWZpbmUgTUFYX0hPSVNURURfTE9PUF9JTlZBUklBTlRT
IDI1NgorCisgICAgc3RydWN0IExvb3BTaWRlRWZmZWN0cyB7CisgICAgICAgIGVudW0gQ2xvYmJl
cktpbmQgeworICAgICAgICAgICAgQ2xvYmJlckdldEdsb2JhbFZhciwKKyAgICAgICAgICAgIENs
b2JiZXJHZXRCeVZhbCwKKyAgICAgICAgICAgIENsb2JiZXJDaGVja1N0cnVjdHVyZSwKKyAgICAg
ICAgICAgIENsb2JiZXJHZXRCeU9mZnNldCwKKyAgICAgICAgICAgIENsb2JiZXJHZXRQcm9wZXJ0
eVN0b3JhZ2UsCisgICAgICAgICAgICBDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSwK
KyAgICAgICAgICAgIENsb2JiZXJHZXRBcnJheUxlbmd0aCwKKyAgICAgICAgICAgIENsb2JiZXJH
ZXRTdHJpbmdMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICBib29sIGNhbkhvaXN0R2V0R2xv
YmFsVmFyKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0R2xvYmFsVmFyKTsgfQor
ICAgICAgICBib29sIGNhbkhvaXN0R2V0QnlWYWwoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENs
b2JiZXJHZXRCeVZhbCk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdENoZWNrU3RydWN0dXJlKCkg
eyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUpOyB9CisgICAgICAg
IGJvb2wgY2FuSG9pc3RHZXRCeU9mZnNldCgpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJl
ckdldEJ5T2Zmc2V0KTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0UHJvcGVydHlTdG9yYWdl
KCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlKTsgfQor
ICAgICAgICBib29sIGNhbkhvaXN0R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpIHsgcmV0dXJu
ICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UpOyB9CisgICAg
ICAgIGJvb2wgY2FuSG9pc3RHZXRBcnJheUxlbmd0aCgpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQo
Q2xvYmJlckdldEFycmF5TGVuZ3RoKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0U3RyaW5n
TGVuZ3RoKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0U3RyaW5nTGVuZ3RoKTsg
fQorCisgICAgICAgIHZvaWQgY2xvYmJlckdldEdsb2JhbFZhcigpIHsgY2xvYmJlcnMuc2V0KENs
b2JiZXJHZXRHbG9iYWxWYXIpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldEJ5VmFsKCkgeyBj
bG9iYmVycy5zZXQoQ2xvYmJlckdldEJ5VmFsKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJDaGVj
a1N0cnVjdHVyZSgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJDaGVja1N0cnVjdHVyZSk7IH0KKyAg
ICAgICAgdm9pZCBjbG9iYmVyR2V0QnlPZmZzZXQoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0
QnlPZmZzZXQpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgpIHsg
Y2xvYmJlcnMuc2V0KENsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UpOyB9CisgICAgICAgIHZvaWQg
Y2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVy
R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0QXJy
YXlMZW5ndGgoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0QXJyYXlMZW5ndGgpOyB9CisgICAg
ICAgIHZvaWQgY2xvYmJlckdldFN0cmluZ0xlbmd0aCgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJH
ZXRTdHJpbmdMZW5ndGgpOyB9CisKKyAgICAgICAgVmVjdG9yPGludCwgOD4gcG9sbHV0ZWRMb2Nh
bHM7CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9sbHV0ZWRHbG9iYWxzOworICAgICAg
ICBWZWN0b3I8Tm9kZUluZGV4LCA0PiBub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXM7CisgICAg
ICAgIFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9sbHV0ZWRJZGVudGlmaWVyczsKKyAgICAgICAgVmVj
dG9yPGludCwgOD4gZ2V0TG9jYWxzOworICAgICAgICBCaXRWZWN0b3IgY2xvYmJlcnM7CisgICAg
fTsKKworICAgIHZvaWQgYW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyhOb2RlSW5kZXggbG9vcEJlZ2lu
LCBOb2RlSW5kZXggbG9vcEVuZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7Cisg
ICAgICAgIGZvciAoTm9kZUluZGV4IGluZGV4ID0gbG9vcEJlZ2luOyBpbmRleCA8IGxvb3BFbmQ7
IGluZGV4KyspIHsKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKKwor
ICAgICAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkgeworICAgICAgICAgICAg
Y2FzZSBQdXRCeVZhbDoKKyAgICAgICAgICAgIGNhc2UgUHV0QnlWYWxBbGlhczoKKyAgICAgICAg
ICAgICAgICAvLyBJZiBQdXRCeVZhbCBzcGVjdWxhdGVzIHRoYXQgaXQncyBhY2Nlc3NpbmcgYW4g
YXJyYXkgd2l0aCBhbgorICAgICAgICAgICAgICAgIC8vIGludGVnZXIgaW5kZXgsIHRoZW4gaXQn
cyBpbXBvc3NpYmxlIGZvciBpdCB0byBjYXVzZSBhIHN0cnVjdHVyZQorICAgICAgICAgICAgICAg
IC8vIGNoYW5nZS4KKyAgICAgICAgICAgICAgICBpZiAoIWJ5VmFsSXNQdXJlKG5vZGUpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJDaGVja1N0cnVjdHVyZSgpOworICAg
ICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlPZmZzZXQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgpOworICAgICAg
ICAgICAgICAgICAgICAvLyBQdXRCeVZhbEFsaWFzIGNhbid0IGNoYW5nZSB0aGUgaW5kZXhlZCBz
dG9yYWdlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gUHV0QnlW
YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0SW5kZXhlZFBy
b3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5vcCA9PSBQ
dXRCeVZhbCAmJiAhaXNGaXhlZEluZGV4ZWRTdG9yYWdlT2JqZWN0UHJlZGljdGlvbihtX2dyYXBo
W25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKSkpCisgICAgICAgICAgICAgICAgICAgIGxvb3BJ
bmZvLmNsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAg
Ly8gV2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgUHV0QnlWYWwgd2lsbCBjbG9iYmVyIHRoZSBsb2Nh
dGlvbiB3ZSdyZSBnZXR0aW5nIGZyb20uCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGNh
biBkbyBiZXR0ZXI7IGlmIHdlIGtub3cgdGhhdCB0aGUgUHV0QnlWYWwgaXMgYWNjZXNzaW5nIGFu
IGFycmF5IG9mIGEKKyAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBH
ZXRCeVZhbCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhleSB3b24ndCBjbG9iYmVyIGVhY2ggb3RoZXIu
CisgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5VmFsKCk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dFN0cnVjdHVyZToKKyAgICAgICAgICAg
ICAgICAvLyBDaGFuZ2luZyB0aGUgc3RydWN0dXJlIG9yIHB1dHRpbmcgdG8gdGhlIHN0b3JhZ2Ug
Y2Fubm90CisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBwcm9wZXJ0eSBzdG9yYWdlIHBv
aW50ZXIuCisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBjYW5ub3Qg
Y2hhbmdlIHRoZSBvdXRjb21lIG9mIGEgcHJvcGVydHkgZ2V0LgorICAgICAgICAgICAgICAgIGxv
b3BJbmZvLm5vZGVzV2l0aFBvbGx1dGVkU3RydWN0dXJlcy5hcHBlbmQobm9kZS5jaGlsZDEoKSk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dEJ5T2Zmc2V0Ogor
ICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYSBwcm9wZXJ0eSBjYW5ub3QgY2hhbmdlIHRoZSBz
dHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRJZGVudGlmaWVycy5h
cHBlbmQobV9ncmFwaC5tX3N0b3JhZ2VBY2Nlc3NEYXRhW25vZGUuc3RvcmFnZUFjY2Vzc0RhdGFJ
bmRleCgpXS5pZGVudGlmaWVyTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgQXJyYXlQb3A6CisgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdl
dEJ5VmFsKCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoLgorICAgICAgICAgICAg
Y2FzZSBBcnJheVB1c2g6CisgICAgICAgICAgICAgICAgLy8gQSBwdXNoIGNhbm5vdCBhZmZlY3Qg
cHJldmlvdXNseSBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICAgICAgICAg
ICAgbG9vcEluZm8uY2xvYmJlckdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIFB1dEdsb2JhbFZhcjoKKyAgICAgICAgICAgICAgICBsb29w
SW5mby5wb2xsdXRlZEdsb2JhbHMuYXBwZW5kKG5vZGUudmFyTnVtYmVyKCkpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKKyAgICAgICAgICAgICAg
ICBsb29wSW5mby5wb2xsdXRlZExvY2Fscy5hcHBlbmQobm9kZS5sb2NhbCgpKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR2V0TG9jYWw6CisgICAgICAgICAgICAg
ICAgbG9vcEluZm8uZ2V0TG9jYWxzLmFwcGVuZChub2RlLmxvY2FsKCkpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoY2xv
YmJlcnNXb3JsZChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJl
ckNoZWNrU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJH
ZXRCeU9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0UHJv
cGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRJ
bmRleGVkUHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNs
b2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0
QXJyYXlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFN0
cmluZ0xlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBDYWxsIHx8
IG5vZGUub3AgPT0gQ29uc3RydWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8u
Y2xvYmJlckdldEdsb2JhbFZhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNI
b2lzdENhbmRpZGF0ZShOb2RlJiBub2RlLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAg
IHsKKyAgICAgICAgYm9vbCBpc0NhbmRpZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAo
bm9kZS5vcCkgeworCisgICAgICAgIGNhc2UgQ29udmVydFRoaXM6CisgICAgICAgIGNhc2UgR2V0
Q2FsbGVlOgorICAgICAgICBjYXNlIENoZWNrRnVuY3Rpb246CisgICAgICAgIGNhc2UgU3RyaW5n
Q2hhckNvZGVBdDoKKyAgICAgICAgY2FzZSBTdHJpbmdDaGFyQXQ6CisgICAgICAgIGNhc2UgQ2hl
Y2tIYXNJbnN0YW5jZToKKyAgICAgICAgY2FzZSBJbnN0YW5jZU9mOgorICAgICAgICBjYXNlIENv
bXBhcmVTdHJpY3RFcToKKyAgICAgICAgY2FzZSBCaXRBbmQ6CisgICAgICAgIGNhc2UgQml0T3I6
CisgICAgICAgIGNhc2UgQml0WG9yOgorICAgICAgICBjYXNlIEJpdExTaGlmdDoKKyAgICAgICAg
Y2FzZSBCaXRSU2hpZnQ6CisgICAgICAgIGNhc2UgQml0VVJTaGlmdDoKKyAgICAgICAgY2FzZSBW
YWx1ZVRvSW50MzI6CisgICAgICAgIGNhc2UgVUludDMyVG9OdW1iZXI6CisgICAgICAgIGNhc2Ug
QXJpdGhBZGQ6CisgICAgICAgIGNhc2UgQXJpdGhTdWI6CisgICAgICAgIGNhc2UgQXJpdGhNdWw6
CisgICAgICAgIGNhc2UgQXJpdGhNb2Q6CisgICAgICAgIGNhc2UgQXJpdGhEaXY6CisgICAgICAg
IGNhc2UgQXJpdGhBYnM6CisgICAgICAgIGNhc2UgQXJpdGhNaW46CisgICAgICAgIGNhc2UgQXJp
dGhNYXg6CisgICAgICAgIGNhc2UgQXJpdGhTcXJ0OgorICAgICAgICBjYXNlIFZhbHVlVG9OdW1i
ZXI6CisgICAgICAgIGNhc2UgVmFsdWVUb0RvdWJsZToKKyAgICAgICAgY2FzZSBKU0NvbnN0YW50
OgorICAgICAgICBjYXNlIFdlYWtKU0NvbnN0YW50OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUg
PSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVBZGQ6CisgICAg
ICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAg
ICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgor
ICAgICAgICBjYXNlIENvbXBhcmVFcToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gaXNQcmVk
aWN0ZWROdW1lcmljYWwobm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBM
b2dpY2FsTm90OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb2dpY2FsTm90SXNQdXJlKG5v
ZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2hlY2tTdHJ1Y3R1cmU6Cisg
ICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0Q2hlY2tTdHJ1Y3R1cmUo
KSAmJiAhbG9vcEluZm8ubm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzLmNvbnRhaW5zKG5vZGUu
Y2hpbGQxKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlWYWw6Cisg
ICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGJ5VmFsSXNQdXJlKG5vZGUpICYmIGxvb3BJbmZvLmNh
bkhvaXN0R2V0QnlWYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldFBy
b3BlcnR5U3RvcmFnZToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9p
c3RHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2U6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxv
b3BJbmZvLmNhbkhvaXN0R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlPZmZzZXQ6CisgICAgICAgICAgICBpc0NhbmRpZGF0
ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0QnlPZmZzZXQoKSAmJiAhbG9vcEluZm8ucG9sbHV0ZWRJ
ZGVudGlmaWVycy5jb250YWlucyhtX2dyYXBoLm1fc3RvcmFnZUFjY2Vzc0RhdGFbbm9kZS5zdG9y
YWdlQWNjZXNzRGF0YUluZGV4KCldLmlkZW50aWZpZXJOdW1iZXIpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6CisgICAgICAgIGNhc2UgR2V0Qnl0ZUFy
cmF5TGVuZ3RoOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdl
dEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRTdHJp
bmdMZW5ndGg6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0
U3RyaW5nTGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRHbG9i
YWxWYXI6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0R2xv
YmFsVmFyKCkgJiYgIWxvb3BJbmZvLnBvbGx1dGVkR2xvYmFscy5jb250YWlucyhub2RlLnZhck51
bWJlcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldExvY2FsOgorICAg
ICAgICAgICAgaXNDYW5kaWRhdGUgPSAhbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuY29udGFpbnMo
bm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBEYW5nZXJvdXMh
IFBheSBtb3JlIGF0dGVudGlvbiBwbGVhc2UuCisgICAgICAgIGNhc2UgU2V0TG9jYWw6CisgICAg
ICAgICAgICBpc0NhbmRpZGF0ZSA9ICFsb29wSW5mby5wb2xsdXRlZExvY2Fscy5jb250YWlucyhu
b2RlLmxvY2FsKCkpICYmICFsb29wSW5mby5nZXRMb2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaXNDYW5kaWRhdGU7CisgICAgfQorCisg
ICAgYm9vbCBub2RlQ2FuQmVIb2lzdGVkKE5vZGUmIG5vZGUsIEJhc2ljQmxvY2smIHRhcmdldEJs
b2NrLCBWZWN0b3I8Tm9kZUluZGV4LCAzPiYgaG9pc3RlZENoaWxkcmVuKQorICAgIHsKKyAgICAg
ICAgYm9vbCBjYW5Ib2lzdCA9IHRydWU7CisKKyAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFz
VmFyQXJncykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmly
c3RDaGlsZCgpOyBjaGlsZElkeCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJl
bigpOyBjaGlsZElkeCsrKSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkID0gbV9n
cmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICBpZiAoY2hp
bGQgIT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVu
dCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxh
Y2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0QmxvY2su
ZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGls
ZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNh
bkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4u
Zml4ZWQuY2hpbGQxOworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMiA9IG5vZGUuY2hpbGRy
ZW4uZml4ZWQuY2hpbGQyOworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IG5vZGUuY2hp
bGRyZW4uZml4ZWQuY2hpbGQzOworCisgICAgICAgICAgICBpZiAoY2hpbGQxICE9IE5vTm9kZSkg
eworICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRz
W2NoaWxkMV07CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2Nr
LmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAg
ICAgICBob2lzdGVkQ2hpbGRyZW4uYXBwZW5kKGNoaWxkMSk7CisgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2Rl
SW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDJdOworICAgICAgICAgICAg
ICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8
IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFw
cGVuZChjaGlsZDIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
Y2FuSG9pc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDMg
IT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9y
ZXBsYWNlbWVudHNbY2hpbGQzXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0g
dGFyZ2V0QmxvY2suYmVnaW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAg
ICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FuSG9pc3Q7CisgICAgfQor
CisgICAgdm9pZCByZWZlcmVuY2VNYXlCZVNraXBwZWROb2RlKE5vZGVJbmRleCBpbmRleCkKKyAg
ICB7CisgICAgICAgIGlmIChpbmRleCA9PSBOb05vZGUgfHwgIW1fZ3JhcGhbaW5kZXhdLnJlZigp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEl0IGJlY29tZXMgbW9yZSBjb21w
bGV4IGlmIHRoZSByZWZlcmVuY2UgaXMgYSBza2lwcGVkIG5vZGUuCisgICAgICAgIC8vIFdlIG5l
ZWQgdG8gdHJhdmVyc2UgdGhlIHJlZmVyZW5jZSBjaGFpbiB0byBmaXggdGhlIHJlZmVyZW5jZSBj
b3VudHMuCisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDQ+IHNraXBwZWROb2RlczsKKyAgICAg
ICAgc2tpcHBlZE5vZGVzLmFwcGVuZChpbmRleCk7CisKKyAgICAgICAgd2hpbGUgKCFza2lwcGVk
Tm9kZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBOb2RlSW5kZXggc2tpcHBlZEluZGV4ID0g
c2tpcHBlZE5vZGVzLmxhc3QoKTsKKyAgICAgICAgICAgIHNraXBwZWROb2Rlcy5yZW1vdmVMYXN0
KCk7CisgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtza2lwcGVkSW5kZXhdOworCisg
ICAgICAgICAgICBpZiAobm9kZS5vcCAmIE5vZGVNdXN0R2VuZXJhdGUpCisgICAgICAgICAgICAg
ICAgbm9kZS5yZWYoKTsKKworICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFzVmFyQXJn
cykgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0
Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hpbGRyZW4o
KTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGR4ID0g
bV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG1fZ3JhcGhbY2hpbGR4XS5yZWYoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBw
ZWROb2Rlcy5hcHBlbmQoY2hpbGR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZDEgPSBub2RlLmNoaWxkcmVu
LmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQyID0gbm9kZS5j
aGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9
IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQzOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxk
MSAhPSBOb05vZGUgJiYgbV9ncmFwaFtjaGlsZDFdLnJlZigpKQorICAgICAgICAgICAgICAgICAg
ICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hp
bGQyICE9IE5vTm9kZSAmJiBtX2dyYXBoW2NoaWxkMl0ucmVmKCkpCisgICAgICAgICAgICAgICAg
ICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoY2hpbGQyKTsKKworICAgICAgICAgICAgICAgIGlmIChj
aGlsZDMgIT0gTm9Ob2RlICYmIG1fZ3JhcGhbY2hpbGQzXS5yZWYoKSkKKyAgICAgICAgICAgICAg
ICAgICAgc2tpcHBlZE5vZGVzLmFwcGVuZChjaGlsZDMpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtSG9pc3QoTm9kZUluZGV4IGluZGV4LCBCYXNp
Y0Jsb2NrJiB0YXJnZXRCbG9jaywgdW5zaWduZWQmIGhvaXN0ZWQpCisgICAgeworICAgICAgICBO
b2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CisKKyAgICAgICAgaWYgKCFob2lzdGVkKQorICAg
ICAgICAgICAgdGFyZ2V0QmxvY2suYmVnaW4gPSBtX2dyYXBoLnNpemUoKTsKKworICAgICAgICBt
X2dyYXBoLmFwcGVuZChub2RlKTsKKyAgICAgICAgTm9kZSYgcmVwbGFjZW1lbnQgPSBtX2dyYXBo
Lmxhc3QoKTsKKyAgICAgICAgcmVwbGFjZW1lbnQuc2V0UmVmQ291bnQoIW5vZGUuaGFzUmVzdWx0
KCkgJiYgKG5vZGUub3AgJiBOb2RlTXVzdEdlbmVyYXRlKSA/IDEgOiAwKTsKKyAgICAgICAgLy8g
T25seSBwZXJmb3JtIGNoaWxkcmVuIHN1YnN0aXR1dGlvbiBmb3IgdGhlIHJlcGxhY2VtZW50IG5v
ZGUuCisgICAgICAgIGlmIChyZXBsYWNlbWVudC5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxkSWR4ID0gcmVwbGFjZW1lbnQuZmlyc3RDaGlsZCgp
OyBjaGlsZElkeCA8IHJlcGxhY2VtZW50LmZpcnN0Q2hpbGQoKSArIHJlcGxhY2VtZW50Lm51bUNo
aWxkcmVuKCk7IGNoaWxkSWR4KyspCisgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlv
bihtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdLCByZXBsYWNlbWVudC5yZWZDb3Vu
dCgpKTsgLy8gRG9uJ3QgcmVmZXJlbmNlIHRoZSBuZXcgY2hpbGQgaGVyZS4KKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRy
ZW4uZml4ZWQuY2hpbGQxLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAgIHBl
cmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQyLCByZXBs
YWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVw
bGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQzLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsK
KyAgICAgICAgfQorI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAg
ICAgICAgcHJpbnRmKCIgICBSZXBsYWNpbmcgQCV1IC0+IEAldSIsIGluZGV4LCBtX2dyYXBoLnNp
emUoKSAtIDEpOworI2VuZGlmCisgICAgICAgIG1fcmVwbGFjZW1lbnRzW21fY29tcGlsZUluZGV4
XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsKKyAgICAgICAgTm9kZSYgbmV3Tm9kZSA9IG1fZ3JhcGhb
bV9jb21waWxlSW5kZXhdOyAvLyBUaGlzIGNhbiBkaWZmZXIgZnJvbSAibm9kZSIgYmVjYXVzZSBt
X2dyYXBoIGlzIGV4cGFuZGVkCisgICAgICAgIG5ld05vZGUuc2V0UmVmQ291bnQoMCk7CisgICAg
ICAgICsraG9pc3RlZDsKKyAgICAgICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7
CisgICAgfQorCisgICAgdm9pZCBob2lzdEdldExvY2FsKEJhc2ljQmxvY2smIHByZUhlYWRlckJs
b2NrLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvLCB1bnNpZ25lZCYgaG9pc3RlZCkKKyAgICB7
CisgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsKKyAgICAgICAg
QVNTRVJUKG5vZGUub3AgPT0gR2V0TG9jYWwpOworCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9Q
QUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIiAgICVzIEAldTogIiwgR3JhcGg6Om9w
TmFtZShtX2dyYXBoW21fY29tcGlsZUluZGV4XS5vcCksIG1fY29tcGlsZUluZGV4KTsKKyNlbmRp
ZgorCisgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpCisgICAgICAgICAgICB8fCBo
b2lzdGVkID49IE1BWF9IT0lTVEVEX0xPT1BfSU5WQVJJQU5UUyAtIDEKKyAgICAgICAgICAgIHx8
ICFpc0hvaXN0Q2FuZGlkYXRlKG5vZGUsIGxvb3BJbmZvKSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBpbnQgb3BlcmFuZCA9IG5vZGUubG9jYWwoKTsKKyAgICAgICAgTm9kZUluZGV4
IGxhc3REZWZpbmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50
KG9wZXJhbmQpKQorICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gcHJlSGVhZGVyQmxvY2su
dmFyaWFibGVzQXRUYWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gcHJlSGVhZGVyQmxvY2su
dmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQpOworCisgICAgICAgIEFTU0VSVChsYXN0RGVm
aW5lSW5kZXggIT0gTm9Ob2RlKTsKKyAgICAgICAgTm9kZSYgbGFzdERlZmluZSA9IG1fZ3JhcGhb
bGFzdERlZmluZUluZGV4XTsKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gR2V0TG9jYWwp
IHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAg
ICBwcmludGYoIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV1XG4iLCBtX2NvbXBpbGVJbmRleCArIDEs
IGxhc3REZWZpbmVJbmRleCk7CisjZW5kaWYKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW21f
Y29tcGlsZUluZGV4XSA9IGxhc3REZWZpbmVJbmRleDsKKyAgICAgICAgICAgIG5vZGUuc2V0UmVm
Q291bnQoMCk7CisgICAgICAgICAgICByZXR1cm47IC8vIFdlJ3JlIGRvbmUuCisgICAgICAgIH0K
KworICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9PSBTZXRMb2NhbCkgeworICAgICAgICAgICAg
Ly8gRklYTUU6IHZlcmlmeSEKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gUGhpKSB7CisgICAgICAgICAg
ICBpZiAoIWhvaXN0ZWQpCisgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2suYmVnaW4gPSBt
X2dyYXBoLnNpemUoKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbbV9jb21w
aWxlSW5kZXhdKTsKKyAgICAgICAgICAgIE5vZGUmIGdldExvY2FsTm9kZSA9IG1fZ3JhcGhbbV9j
b21waWxlSW5kZXhdOworICAgICAgICAgICAgTm9kZSYgZ2V0TG9jYWxSZXBsYWNlbWVudCA9IG1f
Z3JhcGgubGFzdCgpOworICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNlbWVudC5zZXRSZWZDb3Vu
dCgwKTsKKyAgICAgICAgICAgIGdldExvY2FsUmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hp
bGQxID0gbGFzdERlZmluZUluZGV4OworICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbbV9jb21w
aWxlSW5kZXhdID0gbV9ncmFwaC5zaXplKCkgLSAxOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJP
UEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAt
PiBAJXVcbiIsIG1fY29tcGlsZUluZGV4LCBtX2dyYXBoLnNpemUoKSAtIDEpOworI2VuZGlmCisg
ICAgICAgICAgICBnZXRMb2NhbE5vZGUuc2V0UmVmQ291bnQoMCk7CisgICAgICAgICAgICArK2hv
aXN0ZWQ7CisgICAgICAgICAgICBwcmVIZWFkZXJCbG9jay5lbmQgPSBtX2dyYXBoLnNpemUoKTsK
KworICAgICAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKQorICAgICAgICAg
ICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChvcGVyYW5kVG9B
cmd1bWVudChvcGVyYW5kKSkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9w
ZXJhbmQpID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgdm9p
ZCBmaXhIb2lzdGVkQ2hpbGRXaXRoU2V0TG9jYWwoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2Rl
SW5kZXggY2hpbGQsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBO
b2RlJiBjaGlsZE5vZGUgPSBtX2dyYXBoW2NoaWxkXTsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxh
Y2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1l
bnQgIT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkTm9kZS5vcCAhPSBHZXRMb2NhbCAm
JiBjaGlsZE5vZGUub3AgIT0gUGhpICYmIGNoaWxkTm9kZS5vcCAhPSBTZXRMb2NhbCk7CisgICAg
ICAgIE5vZGUmIHNldExvY2FsTm9kZSA9IG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAxXTsKKyAgICAg
ICAgQVNTRVJUKHNldExvY2FsTm9kZS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFTU0VSVChz
ZXRMb2NhbE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID09IHJlcGxhY2VtZW50KTsKKworICAg
ICAgICBjaGlsZE5vZGUub3AgPSBHZXRMb2NhbDsKKyAgICAgICAgcmVmZXJlbmNlTWF5QmVTa2lw
cGVkTm9kZShyZXBsYWNlbWVudCArIDEpOworICAgICAgICBjaGlsZE5vZGUuc2V0VmFyaWFibGVB
Y2Nlc3NEYXRhKHNldExvY2FsTm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKSk7CisgICAgICAgIGlu
dCBvcGVyYW5kID0gY2hpbGROb2RlLmxvY2FsKCk7CisgICAgICAgIEJhc2ljQmxvY2smIGN1cnJl
bnRCbG9jayA9ICptX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBOb2RlSW5k
ZXggZmlyc3REZWZpbmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRM
b2NhbHMuYXBwZW5kKG9wZXJhbmQpOworICAgICAgICBpZiAob3BlcmFuZElzQXJndW1lbnQob3Bl
cmFuZCkpCisgICAgICAgICAgICBmaXJzdERlZmluZUluZGV4ID0gY3VycmVudEJsb2NrLnZhcmlh
Ymxlc0F0SGVhZC5hcmd1bWVudChvcGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKSk7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJlbnRCbG9jay52YXJp
YWJsZXNBdEhlYWQubG9jYWwob3BlcmFuZCk7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVh
ZHMgb2YgdGVtcG9yYXJpZXMgZnJvbSBwcmlvciBibG9ja3MsCisgICAgICAgICAgICAvLyBleHBh
bmQgbV9wcmVzZXJ2ZWRWYXJzIHRvIGNvdmVyIHRoZXNlLgorICAgICAgICAgICAgbV9ncmFwaC5t
X3ByZXNlcnZlZFZhcnMuc2V0KG9wZXJhbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQVNT
RVJUKGZpcnN0RGVmaW5lSW5kZXggIT0gTm9Ob2RlKTsKKyAgICAgICAgaWYgKGZpcnN0RGVmaW5l
SW5kZXggIT0gTm9Ob2RlICYmIG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0ub3AgPT0gR2V0TG9j
YWwpCisgICAgICAgICAgICBmaXJzdERlZmluZUluZGV4ID0gbV9ncmFwaFtmaXJzdERlZmluZUlu
ZGV4XS5jaGlsZDEoKTsKKworICAgICAgICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQx
ID0gZmlyc3REZWZpbmVJbmRleDsKKyAgICAgICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNo
aWxkMiA9IE5vTm9kZTsKKyAgICAgICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9
IE5vTm9kZTsKKyAgICB9CisKKyAgICBib29sIGZpeEhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJs
b2NrSW5kZXgsIE5vZGVJbmRleCBjaGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAg
ICB7CisgICAgICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IHRydWU7CisgICAgICAgIE5vZGVJbmRleCBy
ZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgQVNTRVJUKHJlcGxh
Y2VtZW50ICE9IE5vTm9kZSk7IC8vIENoaWxkcmVuIG9mIGEgaG9pc3RlZCBub2RlIG11c3QgaGF2
ZSBiZWVuIGhvaXN0ZWQgYXMgd2VsbC4KKworICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsK
KyAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLnJlZkNvdW50KCkgPT0gMSkgeworICAgICAgICAg
ICAgLy8gT25seSBmaXggdGhpcyBjaGlsZCBvbmNlLgorICAgICAgICAgICAgaWYgKG1fZ3JhcGhb
Y2hpbGRdLm9wICE9IEdldExvY2FsICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IEpTQ29uc3RhbnQg
JiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0gV2Vha0pTQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQobV9ncmFwaFtjaGlsZF0ub3AgIT0gUGhpICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9
IFNldExvY2FsKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPCBtX2dyYXBoLnNp
emUoKSAtIDEgJiYgbV9ncmFwaFtyZXBsYWNlbWVudCArIDFdLm9wID09IFNldExvY2FsKQorICAg
ICAgICAgICAgICAgICAgICBmaXhIb2lzdGVkQ2hpbGRXaXRoU2V0TG9jYWwoYmxvY2tJbmRleCwg
Y2hpbGQsIGxvb3BJbmZvKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICht
X2dyYXBoW2NoaWxkXS5vcCAmIE5vZGVNdXN0R2VuZXJhdGUpCisgICAgICAgICAgICAgICAgbV9n
cmFwaFtjaGlsZF0ucmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7
CisgICAgfQorCisgICAgdm9pZCBoYW5kbGVIb2lzdGVkQ2hpbGQoQmxvY2tJbmRleCBibG9ja0lu
ZGV4LCBOb2RlSW5kZXggY2hpbGQsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgewor
ICAgICAgICBpZiAoZml4SG9pc3RlZENoaWxkKGJsb2NrSW5kZXgsIGNoaWxkLCBsb29wSW5mbykp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGZpeCB0aGlz
IGNoaWxkLCB3ZSBuZWVkIHRvIGJhY2sgdHJhY2suCisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgs
IDM+IGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbDsKKyAgICAgICAgaG9pc3RlZENoaWxk
cmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZCk7CisgICAgICAgIHdoaWxlICghaG9pc3Rl
ZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9kZSYg
bm9kZSA9IG1fZ3JhcGhbaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmxhc3QoKV07Cisg
ICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwucmVtb3ZlTGFzdCgpOwor
ICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFzVmFyQXJncykgeworICAgICAgICAgICAg
ICAgIGZvciAodW5zaWduZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHgg
PCBub2RlLmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgewor
ICAgICAgICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdD
aGlsZHJlbltjaGlsZElkeF07CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHggIT0gTm9O
b2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGR4LCBsb29wSW5mbykpCisg
ICAgICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBw
ZW5kKGNoaWxkeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hp
bGQxOworICAgICAgICAgICAgICAgIE5vZGVJbmRleCYgY2hpbGQyID0gbm9kZS5jaGlsZHJlbi5m
aXhlZC5jaGlsZDI7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4JiBjaGlsZDMgPSBub2RlLmNo
aWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDEgIT0gTm9O
b2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQxLCBsb29wSW5mbykpCisg
ICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQo
Y2hpbGQxKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlICYmICFmaXhI
b2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQyLCBsb29wSW5mbykpCisgICAgICAgICAgICAg
ICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQyKTsKKwor
ICAgICAgICAgICAgICAgIGlmIChjaGlsZDMgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQo
YmxvY2tJbmRleCwgY2hpbGQzLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0
ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFkb3B0IHRoZSBkb21pbmFuY2UgYWxnb3JpdGht
IGJ5IENvb3BlciwgS2VpdGggRC47IEhhcnZleSwgVGltb3RoeSBKOyBhbmQgS2VubmVkeSwgS2Vu
ICgyMDAxKS4gCisgICAgLy8gIkEgU2ltcGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0aG0iCisg
ICAgLy8gaHR0cDovL3d3dy5oaXBlcnNvZnQucmljZS5lZHUvZ3JhZHMvcHVibGljYXRpb25zL2Rv
bTE0LnBkZgorICAgIHVuc2lnbmVkIGludGVyc2VjdCh1bnNpZ25lZCBiMSwgdW5zaWduZWQgYjIs
IFZlY3Rvcjx1bnNpZ25lZD4mIGRvbVRyZWUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBmaW5n
ZXIxID0gYjE7CisgICAgICAgIHVuc2lnbmVkIGZpbmdlcjIgPSBiMjsKKworICAgICAgICB3aGls
ZSAoZmluZ2VyMSAhPSBmaW5nZXIyKSB7CisgICAgICAgICAgICB3aGlsZSAoZmluZ2VyMSA+IGZp
bmdlcjIpCisgICAgICAgICAgICAgICBmaW5nZXIxID0gZG9tVHJlZVtmaW5nZXIxXTsKKyAgICAg
ICAgICAgIHdoaWxlIChmaW5nZXIyID4gZmluZ2VyMSkKKyAgICAgICAgICAgICAgIGZpbmdlcjIg
PSBkb21UcmVlW2ZpbmdlcjJdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbmdlcjE7
CisgICAgfQorCisgICAgdm9pZCBjb21wdXRlRG9taW5hdG9ycyhCbG9ja0luZGV4IGJlZ2luLCBC
bG9ja0luZGV4IGVuZCwgVmVjdG9yPEJsb2NrSW5kZXgsIDg+JiBkb21pbmF0b3JzKQorICAgIHsK
KyAgICAgICAgLy8gRmlyc3RseSBjb21wdXRlIHRoZSBkb21pbmF0b3IgdHJlZS4KKyAgICAgICAg
Ly8gVGhlIHRyZWUgbm9kZSBpbmRleCBpcyB0aGUgYmxvY2sgaW5kZXggb2Zmc2V0ZWQgYnkgdGhl
IGJlZ2luIGJsb2NrIGluZGV4LgorICAgICAgICBWZWN0b3I8dW5zaWduZWQ+IGRvbVRyZWU7Cisg
ICAgICAgIHVuc2lnbmVkIHNpemUgPSBlbmQgLSBiZWdpbiArIDE7CisKKyAgICAgICAgZG9tVHJl
ZS5yZXNpemUoc2l6ZSk7CisgICAgICAgIGRvbVRyZWVbMF0gPSAwOworICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgZG9tVHJlZVtpXSA9IHNp
emU7CisKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICB3aGlsZSAoY2hh
bmdlZCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFt
X2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0tPmlzUmVhY2hhYmxlKQorICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkgYW5kIGVu
c3VyZSB0aGF0IHRoZSBwcmVjZXNzb3JzIGFyZSBvcmRlcmVkIGJ5IGluZGV4LgorICAgICAgICAg
ICAgICAgIFByZWRlY2Vzc29yTGlzdCYgcHJlZGVjZXNzb3JzID0gbV9ncmFwaC5tX2Jsb2Nrc1ti
ZWdpbiArIGldLT5tX3ByZWRlY2Vzc29yczsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBqID0g
MDsKKyAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwcmVkZWNlc3NvciBpbiB0aGlz
IHN1YmdyYXBoCisgICAgICAgICAgICAgICAgd2hpbGUgKHByZWRlY2Vzc29yc1tqXSA8IGJlZ2lu
KQorICAgICAgICAgICAgICAgICAgICBqKys7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBu
ZXdJRG9tID0gcHJlZGVjZXNzb3JzW2pdIC0gYmVnaW47CisgICAgICAgICAgICAgICAgQVNTRVJU
KGRvbVRyZWVbbmV3SURvbV0gIT0gc2l6ZSk7IC8vIE11c3QgaGF2ZSBiZWVuIHByb2Nlc3NlZC4K
KyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgZm9yICg7IGogPCBwcmVkZWNl
c3NvcnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJlZCA9
IHByZWRlY2Vzc29yc1tqXSAtIGJlZ2luOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9tVHJl
ZVtwcmVkXSAhPSBzaXplKSAvLyBNZWFucyBpdCdzIGFscmVhZHkgY2FsY3VsYXRlZC4KKyAgICAg
ICAgICAgICAgICAgICAgICAgIG5ld0lEb20gPSBpbnRlcnNlY3QocHJlZCwgbmV3SURvbSwgZG9t
VHJlZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb21UcmVlW2ld
ICE9IG5ld0lEb20pIHsKKyAgICAgICAgICAgICAgICAgICAgZG9tVHJlZVtpXSA9IG5ld0lEb207
CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nrcy5jb250
YWlucyhiZWdpbiArIGkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGNvbmRp
dGlvbmFsIGlubmVyIGxvb3BzIGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgICAgICBOb2Rl
JiBqdW1wID0gbV9ncmFwaFttX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0tPmVuZCAtIDFdOwor
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQoanVtcC5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAg
ICAgICAgICAgaSA9IGp1bXAudGFrZW5CbG9ja0luZGV4KCkgLSBiZWdpbiAtIDE7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlbiB0
cmF2ZXJzZSB0aGUgZG9taW5hdG9yIHRyZWUgdG8gZ2V0IHRoZSBkb21pbmF0b3JzIG9mIHRoZSBs
YXN0IGJsb2NrLgorICAgICAgICB1bnNpZ25lZCBpZG9tID0gZG9tVHJlZS5sYXN0KCk7CisgICAg
ICAgIHdoaWxlIChpZG9tKSB7CisgICAgICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChpZG9tICsg
YmVnaW4pOworICAgICAgICAgICAgaWRvbSA9IGRvbVRyZWVbaWRvbV07CisgICAgICAgIH0KKyAg
ICAgICAgZG9taW5hdG9ycy5hcHBlbmQoYmVnaW4pOworICAgIH0KKworICAgIHZvaWQgcGVyZm9y
bUxJQ00oQmxvY2tJbmRleCBwcmVIZWFkZXJJbmRleCkKKyAgICB7CisgICAgICAgIEJhc2ljQmxv
Y2smIHByZUhlYWRlckJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbcHJlSGVhZGVySW5kZXhdOwor
ICAgICAgICBCbG9ja0luZGV4IGxvb3BIZWFkZXJJbmRleCA9IG1fZ3JhcGhbcHJlSGVhZGVyQmxv
Y2suZW5kIC0gMV0udGFrZW5CbG9ja0luZGV4KCk7CisgICAgICAgIEJhc2ljQmxvY2smIGJsb2Nr
ID0gKm1fZ3JhcGgubV9ibG9ja3NbbG9vcEhlYWRlckluZGV4XTsKKyAgICAgICAgQmxvY2tJbmRl
eCBsYXN0TG9vcEJsb2NrSW5kZXggPSBsb29wSGVhZGVySW5kZXg7CisgICAgICAgIHVuc2lnbmVk
IGkgPSAwOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBibG9jay5tX3ByZWRlY2Vzc29ycy5z
aXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKGJsb2NrLm1fcHJlZGVjZXNzb3JzW2ldID4g
bGFzdExvb3BCbG9ja0luZGV4KQorICAgICAgICAgICAgICAgIGxhc3RMb29wQmxvY2tJbmRleCA9
IGJsb2NrLm1fcHJlZGVjZXNzb3JzW2ldOyAvLyBUaGUgZnJvbSBibG9jayBvZiB0aGUgYmFjayBl
ZGdlLgorICAgICAgICB9CisKKyAgICAgICAgQmxvY2tJbmRleCBmaXJzdExvb3BCbG9ja0luZGV4
ID0gcHJlSGVhZGVySW5kZXggKyAxOworICAgICAgICBWZWN0b3I8QmxvY2tJbmRleCwgOD4gbXVz
dFJlYWNoQmxvY2tzSW5Mb29wOworICAgICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AuYXBwZW5k
KGxhc3RMb29wQmxvY2tJbmRleCk7CisgICAgICAgIGNvbXB1dGVEb21pbmF0b3JzKGZpcnN0TG9v
cEJsb2NrSW5kZXgsIGxhc3RMb29wQmxvY2tJbmRleCwgbXVzdFJlYWNoQmxvY2tzSW5Mb29wKTsK
KworICAgICAgICB1bnNpZ25lZCBob2lzdGVkID0gMDsKKyAgICAgICAgLy8gYm9vbCBtZXRJbmxp
bmUgPSBmYWxzZTsKKyAgICAgICAgdW5zaWduZWQgcHJlSGVhZGVyRW5kQmVmb3JlTElDTSA9IHBy
ZUhlYWRlckJsb2NrLmVuZDsKKyAgICAgICAgdW5zaWduZWQgbGFzdEJlZm9yZUhvaXN0ID0gbV9n
cmFwaC5zaXplKCk7CisgICAgICAgIExvb3BTaWRlRWZmZWN0cyBsb29wSW5mbzsKKyAgICAgICAg
YW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyhtX2dyYXBoLm1fYmxvY2tzW2ZpcnN0TG9vcEJsb2NrSW5k
ZXhdLT5iZWdpbiwgbV9ncmFwaC5tX2Jsb2Nrc1tsYXN0TG9vcEJsb2NrSW5kZXhdLT5lbmQsIGxv
b3BJbmZvKTsKKworICAgICAgICB3aGlsZSAoIW11c3RSZWFjaEJsb2Nrc0luTG9vcC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggYmxvY2tJbmRleCA9IG11c3RSZWFjaEJsb2Nr
c0luTG9vcC5sYXN0KCk7CisgICAgICAgICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AucmVtb3Zl
TGFzdCgpOworCisjaWYgMAorICAgICAgICAgICAgLy8gRklYTUU6IHJlY29uc2lkZXIgdGhpcyBs
YXRlciB0byBiYWxhbmNlIHRoZSBleGVjdXRpb24gcGVyZm9ybWFuY2UgYW5kIGNvbXBpbGUgdGlt
ZS4KKyAgICAgICAgICAgIGlmIChtZXRJbmxpbmUpCisgICAgICAgICAgICAgICAgYnJlYWs7Cisj
ZW5kaWYKKworICAgICAgICAgICAgZm9yIChtX2NvbXBpbGVJbmRleCA9IG1fZ3JhcGgubV9ibG9j
a3NbYmxvY2tJbmRleF0tPmJlZ2luOyBtX2NvbXBpbGVJbmRleCA8IG1fZ3JhcGgubV9ibG9ja3Nb
YmxvY2tJbmRleF0tPmVuZDsgKyttX2NvbXBpbGVJbmRleCkgeworICAgICAgICAgICAgICAgIE5v
ZGUmIG5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsKKworI2lmIDAKKyAgICAgICAgICAg
ICAgICAvLyBCYWlsIG91dCBpZiB3ZSBtZWV0IGlubGluZWQgYm9kaWVzIGluIHRoZSBsb29wLgor
ICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IElubGluZVN0YXJ0KSB7CisgICAgICAgICAg
ICAgICAgICAgIG1ldElubGluZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUub3Ag
PT0gUGhpIHx8IG5vZGUub3AgPT0gRmx1c2gpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9y
bVN1YnN0aXR1dGlvbihub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMSk7CisgICAgICAgICAgICAg
ICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDIpOwor
ICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4uZml4
ZWQuY2hpbGQzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gR2V0TG9jYWwpIHsKKyAgICAg
ICAgICAgICAgICAgICAgaG9pc3RHZXRMb2NhbChwcmVIZWFkZXJCbG9jaywgbG9vcEluZm8sIGhv
aXN0ZWQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICBib29sIHNob3VsZEdlbmVyYXRlID0gbm9kZS5zaG91bGRHZW5l
cmF0ZSgpOworICAgICAgICAgICAgICAgIGJvb2wgY2FuSG9pc3QgPSBob2lzdGVkIDwgTUFYX0hP
SVNURURfTE9PUF9JTlZBUklBTlRTIC0gMQorICAgICAgICAgICAgICAgICAgICAmJiBpc0hvaXN0
Q2FuZGlkYXRlKG5vZGUsIGxvb3BJbmZvKTsKKworICAgICAgICAgICAgICAgIC8vIExvb2sgb25l
IHN0ZXAgYWhlYWQuCisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGhbbV9jb21waWxlSW5kZXgg
KyAxXS5vcCA9PSBTZXRMb2NhbCAmJiBsb29wSW5mby5wb2xsdXRlZExvY2Fscy5jb250YWlucyht
X2dyYXBoW21fY29tcGlsZUluZGV4ICsgMV0ubG9jYWwoKSkpCisgICAgICAgICAgICAgICAgICAg
IGNhbkhvaXN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCAz
PiBob2lzdGVkQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgY2FuSG9pc3QgJj0gbm9kZUNhbkJl
SG9pc3RlZChub2RlLCBwcmVIZWFkZXJCbG9jaywgaG9pc3RlZENoaWxkcmVuKTsKKworICAgICAg
ICAgICAgICAgIC8vIFdlIHdhbnQgdG8gaG9pc3QgdGhlIFNldExvY2FsIG5vZGUgd2hhdGV2ZXIu
CisgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRHZW5lcmF0ZSAmJiBub2RlLm9wICE9IFNldExv
Y2FsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisjaWYgREZHX0VO
QUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50Zigi
ICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhbbV9jb21waWxlSW5kZXhdLm9wKSwg
bV9jb21waWxlSW5kZXgpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoY2FuSG9pc3Qp
IHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUhvaXN0KG1fY29tcGlsZUluZGV4LCBwcmVI
ZWFkZXJCbG9jaywgaG9pc3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoW21f
Y29tcGlsZUluZGV4XS5vcCA9PSBTZXRMb2NhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
aW50IG9wZXJhbmQgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XS5sb2NhbCgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVu
dChvcGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKSkgPSBwcmVIZWFkZXJCbG9jay5lbmQgLSAxOwor
ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IHByZUhlYWRl
ckJsb2NrLmVuZCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKHNob3VsZEdlbmVyYXRlICYmICFob2lzdGVkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBjYW5ub3QgYmUgaG9pc3RlZCBidXQg
aXQgY29udGFpbnMgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBob2lzdGVkIG5vZGVzLgorICAgICAg
ICAgICAgICAgICAgICAvLyBBZGp1c3Qgc3VjaCByZWZlcmVuY2VzIGJ5IHV0aWxpemluZyBTZXRM
b2NhbC9HZXRMb2NhbCBmb3IgY3Jvc3MgYmxvY2sgcmVmZXJlbmNlcy4KKyAgICAgICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGhvaXN0ZWRDaGlsZHJlbi5zaXplKCk7ICsr
aSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhvaXN0ZWRDaGlsZChibG9ja0luZGV4
LCBob2lzdGVkQ2hpbGRyZW5baV0sIGxvb3BJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisKKyNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAg
cHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoaG9pc3RlZCA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2dyYXBoW3ByZUhlYWRl
ckVuZEJlZm9yZUxJQ00gLSAxXS5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBw
ZW5kKG1fZ3JhcGhbcHJlSGVhZGVyRW5kQmVmb3JlTElDTSAtIDFdKTsKKyAgICAgICAgICAgIEFT
U0VSVF9VTlVTRUQobGFzdEJlZm9yZUhvaXN0LCBwcmVIZWFkZXJCbG9jay5iZWdpbiA9PSBsYXN0
QmVmb3JlSG9pc3QpOworICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2suZW5kID0gbV9ncmFwaC5z
aXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvb3BJbnZhcmlhbnRDb2RlTW90
aW9uKCkKKyAgICB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQor
ICAgICAgICBwcmludGYoIlBlcmZvcm1pbmcgbG9vcCBpbnZhcmlhbnQgY29kZSBtb3Rpb246Iik7
CisjZW5kaWYKKyAgICAgICAgdW5zaWduZWQgaSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkg
PCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nrcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAg
IHBlcmZvcm1MSUNNKG1fZ3JhcGgubV9sb29wUHJlSGVhZGVyQmxvY2tzW2ldKTsKKworICAgICAg
ICAvLyBTb21lIFBoaSBub2RlcyBtYXkgbm90IGdldCB1cGRhdGVkIGNoaWxkcmVuIGZvciBub3cu
CisgICAgICAgIGZvciAoaSA9IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBtX2dy
YXBoLm1fb3JpZ2luYWxTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRp
b24obV9ncmFwaFtpXS5jaGlsZHJlbi5maXhlZC5jaGlsZDEpOworICAgICAgICAgICAgcGVyZm9y
bVN1YnN0aXR1dGlvbihtX2dyYXBoW2ldLmNoaWxkcmVuLmZpeGVkLmNoaWxkMik7CisgICAgICAg
ICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uZml4ZWQuY2hpbGQz
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFuLXVwLgorICAgICAgICBmb3IgKGkgPSAw
OyBpIDwgbV9yZXBsYWNlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX3JlcGxhY2Vt
ZW50c1tpXSA9IE5vTm9kZTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBhbGxvY2F0ZVZpcnR1YWxS
ZWdpc3RlcnMoKQpAQCAtMTY0OSw4ICsyMzM3LDExIEBAIHByaXZhdGU6CiAgICAgICAgIHByaW50
ZigiXG4iKTsKICNlbmRpZgogICAgICAgICBTY29yZUJvYXJkIHNjb3JlQm9hcmQobV9ncmFwaCwg
bV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMpOwotICAgICAgICB1bnNpZ25lZCBzaXplRXhjbHVkaW5n
UGhpTm9kZXMgPSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kOwotICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHNpemVFeGNsdWRpbmdQaGlOb2RlczsgKytpKSB7CisgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
Ly8gU2tpcCB0aGUgcGhpIG5vZGVzCisgICAgICAgICAgICBpZiAoaSA+PSBtX2dyYXBoLm1fYmxv
Y2tzLmxhc3QoKS0+ZW5kICYmIGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxTaXplKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpXTsK
ICAgICAgICAgCiAgICAgICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCShy
ZXZpc2lvbiAxMDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0
aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTIwLDcgKzkyMCw4IEBAIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGVNb3ZIaW50KE5vZGUKIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGUoQmFzaWNCbG9jayYgYmxvY2spCiB7CiAgICAgQVNTRVJUKG1fY29tcGlsZU9rYXkpOwotICAg
IEFTU0VSVChtX2NvbXBpbGVJbmRleCA9PSBibG9jay5iZWdpbik7CisgICAgLy8gQVNTRVJUKG1f
Y29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKKyAgICBtX2NvbXBpbGVJbmRleCA9IGJsb2Nr
LmJlZ2luOwogICAgIAogICAgIGlmICghYmxvY2suaXNSZWFjaGFibGUpIHsKICAgICAgICAgbV9j
b21waWxlSW5kZXggPSBibG9jay5lbmQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDEwNjI0MCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM3MTAsNiArMzcxMCwxMSBAQCBza2lwX2lkX2N1c3RvbV9zZWxmOgogICAgICAg
ICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9sb29wX2hpbnQpOwogICAgICAgICBORVhUX0lOU1RS
VUNUSU9OKCk7CiAgICAgfQorICAgIERFRklORV9PUENPREUob3BfbG9vcF9wcmVoZWFkZXIpIHsK
KyAgICAgICAgLy8gVGhpcyBpcyBhIG5vLW9wIHVubGVzcyB3ZSBpbnRlbmQgb24gZG9pbmcgT1NS
IGZyb20gdGhlIGludGVycHJldGVyLgorICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9s
b29wX3ByZWhlYWRlcik7CisgICAgICAgIE5FWFRfSU5TVFJVQ1RJT04oKTsKKyAgICB9CiAgICAg
REVGSU5FX09QQ09ERShvcF9sb29wX2lmX3RydWUpIHsKICAgICAgICAgLyogbG9vcF9pZl90cnVl
IGNvbmQocikgdGFyZ2V0KG9mZnNldCkKICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2ppdC9KSVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvSklULmNwcAkocmV2aXNpb24gMTA2MjQwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2pp
dC9KSVQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCw3IEBAIEpJVDo6SklUKEpTR2xv
YmFsRGF0YSogZ2xvYmFsRGF0YSwgQ29kZUIKICNlbHNlCiAgICAgLCBtX3JhbmRvbUdlbmVyYXRv
cihzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocmFuZG9tTnVtYmVyKCkgKiAweEZGRkZGRkYpKQogI2Vu
ZGlmCisgICAgLCBtX2xhc3RMb29wUHJlSGVhZGVyT2Zmc2V0KCh1bnNpZ25lZCktMSkKIHsKIH0K
IApAQCAtMTAyLDcgKzEwMyw3IEBAIHZvaWQgSklUOjplbWl0T3B0aW1pemF0aW9uQ2hlY2soT3B0
aW1pemEKICAgICBKdW1wIHNraXBPcHRpbWl6ZSA9IGJyYW5jaEFkZDMyKFNpZ25lZCwgVHJ1c3Rl
ZEltbTMyKGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gT3B0aW9uczo6ZXhlY3V0aW9u
Q291bnRlckluY3JlbWVudEZvckxvb3AgOiBPcHRpb25zOjpleGVjdXRpb25Db3VudGVySW5jcmVt
ZW50Rm9yUmV0dXJuKSwgQWJzb2x1dGVBZGRyZXNzKG1fY29kZUJsb2NrLT5hZGRyZXNzT2ZKSVRF
eGVjdXRlQ291bnRlcigpKSk7CiAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywga2luZCA9
PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBjdGlfb3B0aW1pemVfZnJvbV9sb29wIDogY3RpX29w
dGltaXplX2Zyb21fcmV0KTsKICAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sp
Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0ZWNvZGVPZmZzZXQpKTsK
KyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIobV9sYXN0TG9vcFByZUhlYWRlck9m
ZnNldCkpOwogICAgIHN0dWJDYWxsLmNhbGwoKTsKICAgICBza2lwT3B0aW1pemUubGluayh0aGlz
KTsKIH0KQEAgLTI5MSw2ICsyOTIsNyBAQCB2b2lkIEpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFz
cygpCiAgICAgICAgIERFRklORV9PUChvcF9qdHJ1ZSkKICAgICAgICAgREVGSU5FX09QKG9wX2xv
b3ApCiAgICAgICAgIERFRklORV9PUChvcF9sb29wX2hpbnQpCisgICAgICAgIERFRklORV9PUChv
cF9sb29wX3ByZWhlYWRlcikKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaWZfbGVzcykKICAg
ICAgICAgREVGSU5FX09QKG9wX2xvb3BfaWZfbGVzc2VxKQogICAgICAgICBERUZJTkVfT1Aob3Bf
bG9vcF9pZl9ncmVhdGVyKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5oCShyZXZpc2lvbiAx
MDYyNDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5oCSh3b3JraW5nIGNvcHkp
CkBAIC04MjEsNiArODIxLDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIHZvaWQgZW1pdF9v
cF9qdHJ1ZShJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcChJbnN0cnVj
dGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9oaW50KEluc3RydWN0aW9uKik7Cisg
ICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX3ByZWhlYWRlcihJbnN0cnVjdGlvbiopOwogICAgICAg
ICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9sZXNzKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQg
ZW1pdF9vcF9sb29wX2lmX2xlc3NlcShJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRf
b3BfbG9vcF9pZl9ncmVhdGVyKEluc3RydWN0aW9uKik7CkBAIC0xMDkwLDYgKzEwOTEsNyBAQCBu
YW1lc3BhY2UgSlNDIHsKICNpZiBFTkFCTEUoVkFMVUVfUFJPRklMRVIpCiAgICAgICAgIGJvb2wg
bV9jYW5CZU9wdGltaXplZDsKICNlbmRpZgorICAgICAgICB1bnNpZ25lZCBtX2xhc3RMb29wUHJl
SGVhZGVyT2Zmc2V0OwogICAgIH0gSklUX0NMQVNTX0FMSUdOTUVOVDsKIAogICAgIGlubGluZSB2
b2lkIEpJVDo6ZW1pdF9vcF9sb29wKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCkBA
IC0xMTAzLDYgKzExMDUsMTEgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIGVtaXRPcHRpbWl6
YXRpb25DaGVjayhMb29wT3B0aW1pemF0aW9uQ2hlY2spOwogICAgIH0KIAorICAgIGlubGluZSB2
b2lkIEpJVDo6ZW1pdF9vcF9sb29wX3ByZWhlYWRlcihJbnN0cnVjdGlvbiopCisgICAgeworICAg
ICAgICBtX2xhc3RMb29wUHJlSGVhZGVyT2Zmc2V0ID0gbV9ieXRlY29kZU9mZnNldDsKKyAgICB9
CisKICAgICBpbmxpbmUgdm9pZCBKSVQ6OmVtaXRfb3BfbG9vcF9pZl90cnVlKEluc3RydWN0aW9u
KiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiAgICAgewogICAgICAgICBlbWl0VGltZW91dENoZWNrKCk7
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124904</attachid>
            <date>2012-02-01 01:37:36 -0800</date>
            <delta_ts>2012-02-01 06:28:06 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.7.patch</filename>
            <type>text/plain</type>
            <size>53133</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgxIEBA
CisyMDEyLTAxLTMwICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIExvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGluIEpTQyBERkcKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzcwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV29yay1pbi1wcm9ncmVzcy4KKwor
ICAgICAgICBUaGUgZnJhbWV3b3JrIHRvIHN1cHBvcnQgbW92aW5nIGEgREZHIG5vZGUgKGFuZCB0
aGUgbm9kZXMgY2hhaW5lZCB3aXRoCisgICAgICAgIHJlZmVyZW5jZXMpIHRvIGEgZGlmZmVyZW50
IGJhc2ljIGJsb2NrIGlzIHN1cHBvc2VkIHRvIHdvcmssIGFzIHdlbGwgYXMKKyAgICAgICAgdGhl
IG1lY2hhbmlzbSB0byBzdXBwb3J0IGNyb3NzLWJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgIEEg
YmFzaWMgYmxvY2sgZG9taW5hbmNlIGFuYWx5c2lzIGFsZ29yaXRobSBpcyBpbnRyb2R1Y2VkIHRv
IGRldGVybWluZQorICAgICAgICB3aGljaCBsb29wIGJsb2NrcyBzaG91bGQgYmUgY29uc2lkZXJl
ZCBmb3IgY29kZSBtb3Rpb246IHRoZSBibG9ja3MKKyAgICAgICAgdGhhdCBkb21pbmF0ZSB0aGUg
bG9vcCBleGl0LgorICAgICAgICBUaGUgT1NSIGVudHJ5IGlzIG1vZGlmaWVkLiBUaGVyZSdzIGEg
ZGVkaWNhdGVkIGxvb3AgcHJlaGVhZGVyIGJsb2NrIGFzCisgICAgICAgIHRoZSBPU1IgZW50cnku
CisgICAgICAgIFNpZGUgZWZmZWN0cyBhbmFseXNpcyBvZiBhIGxvb3AgaXMgcGVyZm9ybWVkIHRv
IGZpbmQgb3V0IGlmIHRoZXJlJ3JlCisgICAgICAgIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8g
dGhlIHByb3BlcnRpZXMgb3IgdGhlIHN0cnVjdHVyZXMsIGFuZCBpZgorICAgICAgICB0aGVyZSdy
ZSBwb3NzaWJsZSBtb2RpZmljYXRpb25zIHRvIHRoZSBsb2NhbCBvciB0aGUgZ2xvYmFsIHZhcmlh
YmxlcywKKyAgICAgICAgdG8gaGVscCB1cyBtb3JlIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHdoZXRo
ZXIgYSBERkcgbm9kZSBpcyBpbmRlZWQgbG9vcAorICAgICAgICBpbnZhcmlhbnQgb3Igbm90Lgor
CisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJs
b2NrOjpkdW1wKToKKyAgICAgICAgKiBieXRlY29kZS9PcGNvZGUuaDoKKyAgICAgICAgKiBieXRl
Y29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdl
bmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5oOgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3Bw
OgorICAgICAgICAoSlNDOjpEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpT
Qzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JOb2RlOjplbWl0
Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAg
ICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkFic3Ry
YWN0U3RhdGU6Om1lcmdlU3RhdGVBdFRhaWwpOgorICAgICAgICAoSlNDOjpERkc6OkFic3RyYWN0
U3RhdGU6Om1lcmdlVmFyaWFibGVCZXR3ZWVuQmxvY2tzKToKKyAgICAgICAgKiBkZmcvREZHQnl0
ZUNvZGVQYXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUJsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2UpOgorICAg
ICAgICAqIGRmZy9ERkdDYXBhYmlsaXRpZXMuaDoKKyAgICAgICAgKEpTQzo6REZHOjpjYW5Db21w
aWxlT3Bjb2RlKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpkdW1wKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguaDoKKyAgICAgICAgKiBk
ZmcvREZHTm9kZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OnNldFZhcmlhYmxlQWNjZXNz
RGF0YSk6CisgICAgICAgICogZGZnL0RGR1Byb3BhZ2F0b3IuY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6OmZpeHBvaW50KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
Ojpwcm9wYWdhdGVOb2RlUHJlZGljdGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OnBlcmZvcm1TdWJzdGl0dXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6
OmxvY2FsQ1NFKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjppc0hvaXN0Q2FuZGlk
YXRlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpub2RlQ2FuQmVIb2lzdGVkKToK
KyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpyZWZlcmVuY2VNYXlCZVNraXBwZWROb2Rl
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtSG9pc3QpOgorICAgICAg
ICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnZhcmlhYmxlRGVmaW5lZEluTG9vcCk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6aG9pc3RHZXRMb2NhbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkV2l0aFNldExvY2FsKToKKyAgICAgICAgKEpT
Qzo6REZHOjpQcm9wYWdhdG9yOjpmaXhIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6
OlByb3BhZ2F0b3I6OmhhbmRsZUhvaXN0ZWRDaGlsZCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJv
cGFnYXRvcjo6aW50ZXJzZWN0KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpjb21w
dXRlRG9taW5hdG9ycyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUxJ
Q00pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Omxvb3BJbnZhcmlhbnRDb2RlTW90
aW9uKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjphbGxvY2F0ZVZpcnR1YWxSZWdp
c3RlcnMpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAqIGludGVycHJldGVy
L0ludGVycHJldGVyLmNwcDoKKyAgICAgICAgKEpTQzo6SW50ZXJwcmV0ZXI6OnByaXZhdGVFeGVj
dXRlKToKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAgICAgKEpTQzo6SklUOjpKSVQpOgor
ICAgICAgICAoSlNDOjpKSVQ6OmVtaXRPcHRpbWl6YXRpb25DaGVjayk6CisgICAgICAgIChKU0M6
OkpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcyk6CisgICAgICAgICogaml0L0pJVC5oOgorICAg
ICAgICAoSlNDOjpKSVQ6OmVtaXRfb3BfbG9vcF9oaW50KToKKyAgICAgICAgKEpTQzo6SklUOjpl
bWl0X29wX2xvb3BfcHJlaGVhZGVyKToKKwogMjAxMi0wMS0zMCAgT2xpdmVyIEh1bnQgIDxvbGl2
ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIGdldF9ieV92YWxfYXJndW1lbnRzIGlzIGJyb2tlbiBp
biB0aGUgaW50ZXJwcmV0ZXIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9D
b2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA5Nyw2ICsxMDk3
LDEwIEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wKEV4ZWNTdGF0ZSogZXhlYywgY28KICAgICAgICAg
ICAgIHByaW50ZigiWyU0ZF0gbG9vcF9oaW50XG4iLCBsb2NhdGlvbik7CiAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOiB7CisgICAg
ICAgICAgICBwcmludGYoIlslNGRdIGxvb3BfcHJlaGVhZGVyXG4iLCBsb2NhdGlvbik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIG9wX3N3aXRjaF9pbW06IHsK
ICAgICAgICAgICAgIGludCB0YWJsZUluZGV4ID0gKCsraXQpLT51Lm9wZXJhbmQ7CiAgICAgICAg
ICAgICBpbnQgZGVmYXVsdFRhcmdldCA9ICgrK2l0KS0+dS5vcGVyYW5kOwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaAkocmV2aXNpb24gMTA2MzQzKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
NTcsNiArMTU3LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIG1hY3JvKG9wX2xvb3BfaWZf
Z3JlYXRlciwgNCkgXAogICAgICAgICBtYWNybyhvcF9sb29wX2lmX2dyZWF0ZXJlcSwgNCkgXAog
ICAgICAgICBtYWNybyhvcF9sb29wX2hpbnQsIDEpIFwKKyAgICAgICAgbWFjcm8ob3BfbG9vcF9w
cmVoZWFkZXIsIDEpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX2ltbSwgNCkgXAogICAgICAg
ICBtYWNybyhvcF9zd2l0Y2hfY2hhciwgNCkgXAogICAgICAgICBtYWNybyhvcF9zd2l0Y2hfc3Ry
aW5nLCA0KSBcCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVj
b2RlR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkocmV2aXNpb24gMTA2MzQzKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTY4Niw2ICs2ODYsMTMgQEAgdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6
ZW1pdExvb3BIaW50KCkKICNlbmRpZgogfQogCit2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0
TG9vcFByZUhlYWRlcigpCit7CisjaWYgRU5BQkxFKERGR19KSVQpCisgICAgZW1pdE9wY29kZShv
cF9sb29wX3ByZWhlYWRlcik7CisjZW5kaWYKK30KKwogdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6
cmV0cmlldmVMYXN0QmluYXJ5T3AoaW50JiBkc3RJbmRleCwgaW50JiBzcmMxSW5kZXgsIGludCYg
c3JjMkluZGV4KQogewogICAgIEFTU0VSVChpbnN0cnVjdGlvbnMoKS5zaXplKCkgPj0gNCk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0
Niw2ICszNDYsNyBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAgICBQYXNzUmVmUHRyPExhYmVs
PiBlbWl0TGFiZWwoTGFiZWwqKTsKICAgICAgICAgdm9pZCBlbWl0TG9vcEhpbnQoKTsKKyAgICAg
ICAgdm9pZCBlbWl0TG9vcFByZUhlYWRlcigpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBl
bWl0SnVtcChMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdEp1
bXBJZlRydWUoUmVnaXN0ZXJJRCogY29uZCwgTGFiZWwqIHRhcmdldCk7CiAgICAgICAgIFBhc3NS
ZWZQdHI8TGFiZWw+IGVtaXRKdW1wSWZGYWxzZShSZWdpc3RlcklEKiBjb25kLCBMYWJlbCogdGFy
Z2V0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2Rl
Z2VuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVy
L05vZGVzQ29kZWdlbi5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUz
MCw2ICsxNTMwLDEwIEBAIFJlZ2lzdGVySUQqIERvV2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUoQnkK
IHsKICAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0b3IubmV3TGFiZWxTY29w
ZShMYWJlbFNjb3BlOjpMb29wKTsKIAorICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhlYWRlciA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFByZUhl
YWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CisKICAgICBS
ZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVy
YXRvci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdExvb3BI
aW50KCk7CkBAIC0xNTU2LDEyICsxNTYwLDE1IEBAIFJlZ2lzdGVySUQqIFdoaWxlTm9kZTo6ZW1p
dEJ5dGVjb2RlKEJ5dGUKIHsKICAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0
b3IubmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsKIAorICAgIFJlZlB0cjxMYWJlbD4g
bG9vcFByZUhlYWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0
TGFiZWwobG9vcFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVh
ZGVyKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsK
IAogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAg
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5l
bWl0TG9vcEhpbnQoKTsKLSAgICAKKwogICAgIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fc3Rh
dGVtZW50KTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0
KCkpOwpAQCAtMTU5MSw2ICsxNTk4LDEwIEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY28KICAgICBpZiAobV9leHByMSkKICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2Rl
KGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcjEpOwogCisgICAgUmVmUHRyPExhYmVs
PiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVt
aXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVI
ZWFkZXIoKTsKKwogICAgIFJlZlB0cjxMYWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5ld0xh
YmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7CiAKQEAgLTE2
NDAsNiArMTY1MSwxMCBAQCBSZWdpc3RlcklEKiBGb3JJbk5vZGU6OmVtaXRCeXRlY29kZShCeXRl
CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNpemUgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7
CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGV4cGVjdGVkU3Vic2NyaXB0OwogICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBpdGVyID0gZ2VuZXJhdG9yLmVtaXRHZXRQcm9wZXJ0eU5hbWVzKGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQoKSwgaS5nZXQoKSwgc2l6ZS5nZXQoKSwgc2NvcGUt
PmJyZWFrVGFyZ2V0KCkpOworCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2Vu
ZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVy
LmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKICAgICBnZW5lcmF0
b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwogCiAgICAgUmVmUHRyPExhYmVs
PiBsb29wU3RhcnQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAkocmV2aXNpb24gMTA2MzQzKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtOTIsOCArOTIsNiBAQCB2b2lkIEFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNC
bG9jayhCYXNpCiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgYmFzaWNCbG9jay0+Y2ZhU2hv
dWxkUmV2aXNpdCA9IGZhbHNlOwotICAgIGJhc2ljQmxvY2stPmNmYUhhc1Zpc2l0ZWQgPSB0cnVl
OwogICAgIG1fYmxvY2sgPSBiYXNpY0Jsb2NrOwogICAgIG1faXNWYWxpZCA9IHRydWU7CiB9CkBA
IC05MzYsMTUgKzkzNCwyMCBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVN0YXRl
QXRUCiAgICAgICAgIAogICAgIEFic3RyYWN0VmFsdWUqIHNvdXJjZTsKICAgICAgICAgCi0gICAg
Tm9kZSYgbm9kZSA9IG1fZ3JhcGhbbm9kZUluZGV4XTsKLSAgICBpZiAoIW5vZGUucmVmQ291bnQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIE5vZGUqIG5vZGVQdHIgPSAmbV9ncmFwaFtu
b2RlSW5kZXhdOworICAgIGlmICghbm9kZVB0ci0+cmVmQ291bnQoKSkgeworICAgICAgICBpZiAo
bm9kZVB0ci0+b3AgPT0gR2V0TG9jYWwpIHsKKyAgICAgICAgICAgIEFTU0VSVChub2RlUHRyLT5j
aGlsZDEoKSAhPSBOb05vZGUpOworICAgICAgICAgICAgbm9kZVB0ciA9ICZtX2dyYXBoW25vZGVQ
dHItPmNoaWxkMSgpXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQogICAgIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
ICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAgIEl0J3MgbGl2ZSwgbm9kZSBAJXUuXG4iLCBu
b2RlSW5kZXgpOwogI2VuZGlmCiAKLSAgICBzd2l0Y2ggKG5vZGUub3ApIHsKKyAgICBzd2l0Y2gg
KG5vZGVQdHItPm9wKSB7CiAgICAgY2FzZSBQaGk6CiAgICAgY2FzZSBTZXRBcmd1bWVudDoKICAg
ICBjYXNlIEZsdXNoOgpAQCAtOTY2LDcgKzk2OSw3IEBAIGlubGluZSBib29sIEFic3RyYWN0U3Rh
dGU6Om1lcmdlU3RhdGVBdFQKICAgICBjYXNlIFNldExvY2FsOgogICAgICAgICAvLyBUaGUgYmxv
Y2sgc2V0cyB0aGUgdmFyaWFibGUsIGFuZCBwb3RlbnRpYWxseSByZWZpbmVzIGl0LCBib3RoCiAg
ICAgICAgIC8vIGJlZm9yZSBhbmQgYWZ0ZXIgc2V0dGluZyBpdC4KLSAgICAgICAgc291cmNlID0g
JmZvck5vZGUobm9kZS5jaGlsZDEoKSk7CisgICAgICAgIHNvdXJjZSA9ICZmb3JOb2RlKG5vZGVQ
dHItPmNoaWxkMSgpKTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0Up
CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIFNldHRpbmcuXG4iKTsKICNlbmRpZgpAQCAtMTA0
NywxMSArMTA1MCwxMSBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVRvU3VjY2Vz
CiAKIGlubGluZSBib29sIEFic3RyYWN0U3RhdGU6Om1lcmdlVmFyaWFibGVCZXR3ZWVuQmxvY2tz
KEFic3RyYWN0VmFsdWUmIGRlc3RpbmF0aW9uLCBBYnN0cmFjdFZhbHVlJiBzb3VyY2UsIE5vZGVJ
bmRleCBkZXN0aW5hdGlvbk5vZGVJbmRleCwgTm9kZUluZGV4IHNvdXJjZU5vZGVJbmRleCkKIHsK
LSAgICBpZiAoZGVzdGluYXRpb25Ob2RlSW5kZXggPT0gTm9Ob2RlKQorICAgIC8vIEZJWE1FOiBJ
dCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNvdXJjZSBpcyBOb05vZGUgYnV0IHRoZSBkZXN0IGlzbid0
LAorICAgIC8vIGJlY2F1c2Ugd2UgZGlkIExJQ00gYW5kIHRoZSBkZXN0IGlzIGluIGEgbG9vcCBw
cmVIZWFkZXIuCisgICAgaWYgKGRlc3RpbmF0aW9uTm9kZUluZGV4ID09IE5vTm9kZSB8fCBzb3Vy
Y2VOb2RlSW5kZXggPT0gTm9Ob2RlKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCi0gICAg
QVNTRVJUX1VOVVNFRChzb3VyY2VOb2RlSW5kZXgsIHNvdXJjZU5vZGVJbmRleCAhPSBOb05vZGUp
OwotICAgIAogICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBkbyBzb21lIHNwYXJzZSBjb25kaXRpb25h
bCBwcm9wYWdhdGlvbiBoZXJlIQogICAgIAogICAgIHJldHVybiBkZXN0aW5hdGlvbi5tZXJnZShz
b3VyY2UpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29k
ZVBhcnNlci5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTYyLDcgKzIxNjIs
MTcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICB9
CiAKICAgICAgICAgY2FzZSBvcF9sb29wX2hpbnQ6IHsKLSAgICAgICAgICAgIC8vIEJhc2VsaW5l
LT5ERkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBoaW50cy4gVGhlIERGRyBhc3N1bWVzIHRoYXQg
QmFzZWxpbmUtPkRGRworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChibG9ja0JlZ2luLCBtX2N1
cnJlbnRJbmRleCA9PSBibG9ja0JlZ2luKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8g
RW1pdCBhIHBoYW50b20gbm9kZSB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIHBsYWNlaG9sZGVy
IG5vZGUgZm9yIHRoaXMgYnl0ZWNvZGUKKyAgICAgICAgICAgIC8vIG9wLgorICAgICAgICAgICAg
YWRkVG9HcmFwaChQaGFudG9tKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTkVYVF9PUENP
REUob3BfbG9vcF9oaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVo
ZWFkZXI6IHsKKyAgICAgICAgICAgIC8vIEJhc2VsaW5lLT5ERkcgT1NSIGp1bXBzIGJldHdlZW4g
bG9vcCBwcmVoZWFkZXJzLiBUaGUgREZHIGFzc3VtZXMgdGhhdCBCYXNlbGluZS0+REZHCiAgICAg
ICAgICAgICAvLyBPU1IgY2FuIG9ubHkgaGFwcGVuIGF0IGJhc2ljIGJsb2NrIGJvdW5kYXJpZXMu
IEFzc2VydCB0aGF0IHRoZXNlIHR3byBzdGF0ZW1lbnRzCiAgICAgICAgICAgICAvLyBhcmUgY29t
cGF0aWJsZS4KICAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50
SW5kZXggPT0gYmxvY2tCZWdpbik7CkBAIC0yMTc3LDcgKzIxODcsOCBAQCBib29sIEJ5dGVDb2Rl
UGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICAvLyBvcC4KICAgICAgICAg
ICAgIGFkZFRvR3JhcGgoUGhhbnRvbSk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIE5FWFRf
T1BDT0RFKG9wX2xvb3BfaGludCk7CisgICAgICAgICAgICBtX2dyYXBoLm1fbG9vcFByZUhlYWRl
ckJsb2Nrcy5hcHBlbmQobV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAg
IE5FWFRfT1BDT0RFKG9wX2xvb3BfcHJlaGVhZGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRl
ZmF1bHQ6CkBAIC0yNjA4LDYgKzI2MTksNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZSgp
CiAgICAgbV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMgPSBtX3ByZXNlcnZlZFZhcnM7CiAgICAgbV9n
cmFwaC5tX2xvY2FsVmFycyA9IG1fbnVtTG9jYWxzOwogICAgIG1fZ3JhcGgubV9wYXJhbWV0ZXJT
bG90cyA9IG1fcGFyYW1ldGVyU2xvdHM7CisgICAgbV9ncmFwaC5tX29yaWdpbmFsU2l6ZSA9IG1f
Z3JhcGguc2l6ZSgpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgJKHJldmlzaW9uIDEwNjM0MykKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEzMCw2ICsxMzAsNyBAQCBpbmxpbmUgYm9vbCBjYW5Db21waWxlT3Bjb2RlKE9wY29kZUlE
IG9wCiAgICAgY2FzZSBvcF9qbmdyZWF0ZXI6CiAgICAgY2FzZSBvcF9qbmdyZWF0ZXJlcToKICAg
ICBjYXNlIG9wX2xvb3BfaGludDoKKyAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOgogICAgIGNh
c2Ugb3BfbG9vcF9pZl9sZXNzOgogICAgIGNhc2Ugb3BfbG9vcF9pZl9sZXNzZXE6CiAgICAgY2Fz
ZSBvcF9sb29wX2lmX2dyZWF0ZXI6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0dyYXBoLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dy
YXBoLmNwcAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdHcmFwaC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNiw3ICsxMjYsNyBAQCB2b2lkIEdyYXBo
OjpkdW1wKE5vZGVJbmRleCBub2RlSW5kZXgsIENvCiAKICAgICB1bnNpZ25lZCByZWZDb3VudCA9
IG5vZGUucmVmQ291bnQoKTsKICAgICBib29sIHNraXBwZWQgPSAhcmVmQ291bnQ7Ci0gICAgYm9v
bCBtdXN0R2VuZXJhdGUgPSBub2RlLm11c3RHZW5lcmF0ZSgpOworICAgIGJvb2wgbXVzdEdlbmVy
YXRlID0gcmVmQ291bnQgJiYgbm9kZS5tdXN0R2VuZXJhdGUoKTsKICAgICBpZiAobXVzdEdlbmVy
YXRlKSB7CiAgICAgICAgIEFTU0VSVChyZWZDb3VudCk7CiAgICAgICAgIC0tcmVmQ291bnQ7CkBA
IC0yOTQsNyArMjk0LDcgQEAgdm9pZCBHcmFwaDo6ZHVtcChDb2RlQmxvY2sqIGNvZGVCbG9jaykK
ICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgIH0KICAgICBwcmludGYoIlBoaSBOb2RlczpcbiIp
OwotICAgIGZvciAoc2l6ZV90IGkgPSBtX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IHNpemUoKTsg
KytpKQorICAgIGZvciAoc2l6ZV90IGkgPSBtX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IG1fb3Jp
Z2luYWxTaXplOyArK2kpCiAgICAgICAgIGR1bXAoaSwgY29kZUJsb2NrKTsKIH0KIApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAkocmV2aXNpb24gMTA2MzQzKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMzks
NiArMjM5LDcgQEAgcHVibGljOgogICAgIH0KIAogICAgIFZlY3RvcjwgT3duUHRyPEJhc2ljQmxv
Y2s+ICwgOD4gbV9ibG9ja3M7CisgICAgVmVjdG9yPEJsb2NrSW5kZXgsIDg+IG1fbG9vcFByZUhl
YWRlckJsb2NrczsKICAgICBWZWN0b3I8Tm9kZUluZGV4LCAxNj4gbV92YXJBcmdDaGlsZHJlbjsK
ICAgICBWZWN0b3I8U3RvcmFnZUFjY2Vzc0RhdGE+IG1fc3RvcmFnZUFjY2Vzc0RhdGE7CiAgICAg
VmVjdG9yPFJlc29sdmVHbG9iYWxEYXRhPiBtX3Jlc29sdmVHbG9iYWxEYXRhOwpAQCAtMjQ5LDYg
KzI1MCw3IEBAIHB1YmxpYzoKICAgICBCaXRWZWN0b3IgbV9wcmVzZXJ2ZWRWYXJzOwogICAgIHVu
c2lnbmVkIG1fbG9jYWxWYXJzOwogICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyU2xvdHM7CisgICAg
dW5zaWduZWQgbV9vcmlnaW5hbFNpemU7IC8vIFRoZSBncmFwaCBzaXplIGJlZm9yZSB3ZSBkbyBv
cHRpbWl6YXRpb25zIHdoaWNoIHdpbGwgZXhwYW5kIHRoZSBncmFwaC4KIHByaXZhdGU6CiAgICAg
CiAgICAgLy8gV2hlbiBhIG5vZGUncyByZWZDb3VudCBnb2VzIGZyb20gMCB0byAxLCBpdCBtdXN0
IChsb2dpY2FsbHkpIHJlY3Vyc2l2ZWx5IHJlZiBhbGwgb2YgaXRzIGNoaWxkcmVuLCBhbmQgdmlj
ZSB2ZXJzYS4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVy
LmgJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklU
Q29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzIxLDE0ICszMjEsMTQgQEAgcHVibGljOgog
ICAgICAgICAvLyB2YWx1ZSBvZiAoTm9uZSwgW10pLiBCdXQgdGhlIG9sZCBKSVQgbWF5IHN0YXNo
IHNvbWUgdmFsdWVzIHRoZXJlLiBTbyB3ZSByZWFsbHkKICAgICAgICAgLy8gbmVlZCAoVG9wLCBU
T1ApLgogICAgICAgICBmb3IgKHNpemVfdCBhcmd1bWVudCA9IDA7IGFyZ3VtZW50IDwgYmFzaWNC
bG9jay52YXJpYWJsZXNBdEhlYWQubnVtYmVyT2ZBcmd1bWVudHMoKTsgKythcmd1bWVudCkgewot
ICAgICAgICAgICAgaWYgKGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLmFyZ3VtZW50KGFyZ3Vt
ZW50KSA9PSBOb05vZGUpCisgICAgICAgICAgICBpZiAoIWJhc2ljQmxvY2suY2ZhSGFzVmlzaXRl
ZCB8fCBiYXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5hcmd1bWVudChhcmd1bWVudCkgPT0gTm9O
b2RlKQogICAgICAgICAgICAgICAgIGVudHJ5LT5tX2V4cGVjdGVkVmFsdWVzLmFyZ3VtZW50KGFy
Z3VtZW50KS5tYWtlVG9wKCk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChzaXplX3QgbG9jYWwg
PSAwOyBsb2NhbCA8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLm51bWJlck9mTG9jYWxzKCk7
ICsrbG9jYWwpIHsKICAgICAgICAgICAgIE5vZGVJbmRleCBub2RlSW5kZXggPSBiYXNpY0Jsb2Nr
LnZhcmlhYmxlc0F0SGVhZC5sb2NhbChsb2NhbCk7Ci0gICAgICAgICAgICBpZiAobm9kZUluZGV4
ID09IE5vTm9kZSkKKyAgICAgICAgICAgIGlmICghYmFzaWNCbG9jay5jZmFIYXNWaXNpdGVkIHx8
IG5vZGVJbmRleCA9PSBOb05vZGUpCiAgICAgICAgICAgICAgICAgZW50cnktPm1fZXhwZWN0ZWRW
YWx1ZXMubG9jYWwobG9jYWwpLm1ha2VUb3AoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1fZ3Jh
cGhbbm9kZUluZGV4XS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0
KCkpCisgICAgICAgICAgICBpZiAobm9kZUluZGV4ICE9IE5vTm9kZSAmJiBtX2dyYXBoW25vZGVJ
bmRleF0udmFyaWFibGVBY2Nlc3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKQogICAg
ICAgICAgICAgICAgIGVudHJ5LT5tX2xvY2Fsc0ZvcmNlZERvdWJsZS5zZXQobG9jYWwpOwogICAg
ICAgICB9CiAjZWxzZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgJKHJldmlz
aW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00OTksNiArNDk5LDEyIEBAIHN0cnVjdCBOb2RlIHsKICAgICAgICAgcmV0
dXJuIHZhcmlhYmxlQWNjZXNzRGF0YSgpLT5sb2NhbCgpOwogICAgIH0KIAorICAgIHZvaWQgc2V0
VmFyaWFibGVBY2Nlc3NEYXRhKHZvaWQqIGRhdGEpCisgICAgeworICAgICAgICBBU1NFUlQoaGFz
VmFyaWFibGVBY2Nlc3NEYXRhKCkpOworICAgICAgICBtX29wSW5mbyA9IHJlaW50ZXJwcmV0X2Nh
c3Q8dWludHB0cl90PihkYXRhKTsKKyAgICB9CisKICNpZm5kZWYgTkRFQlVHCiAgICAgYm9vbCBo
YXNJZGVudGlmaWVyKCkKICAgICB7CkBAIC0xMDM1LDcgKzEwNDEsNyBAQCBzdHJ1Y3QgTm9kZSB7
CiAgICAgewogICAgICAgICByZXR1cm4gbm9kZUNhblNwZWN1bGF0ZUludGVnZXIoYXJpdGhOb2Rl
RmxhZ3MoKSk7CiAgICAgfQotICAgIAorCiAjaWZuZGVmIE5ERUJVRwogICAgIHZvaWQgZHVtcENo
aWxkcmVuKEZJTEUqIG91dCkKICAgICB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1Byb3BhZ2F0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHUHJvcGFnYXRvci5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHUHJvcGFnYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc1LDYgKzc1
LDEzIEBAIHB1YmxpYzoKICAgICAgICAgbV9ncmFwaC5kdW1wKG1fY29kZUJsb2NrKTsKICNlbmRp
ZgogCisgICAgICAgIGxvb3BJbnZhcmlhbnRDb2RlTW90aW9uKCk7CisKKyNpZiBERkdfRU5BQkxF
KERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiR3JhcGggYWZ0ZXIg
bG9vcCBpbnZhcmlhbnQgY29kZSBtb3Rpb246XG4iKTsKKyAgICAgICAgbV9ncmFwaC5kdW1wKG1f
Y29kZUJsb2NrKTsKKyNlbmRpZgorCiAgICAgICAgIGFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycygp
OwogCiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQpAQCAtMjg5LDcg
KzI5Niw3IEBAIHByaXZhdGU6CiAgICAgCiAgICAgdm9pZCBwcm9wYWdhdGVOb2RlUHJlZGljdGlv
bnMoTm9kZSYgbm9kZSkKICAgICB7Ci0gICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgp
KQorICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSAmJiBub2RlLm9wICE9IFNldExv
Y2FsKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAKICAgICAgICAgTm9kZVR5cGUgb3Ag
PSBub2RlLm9wOwpAQCAtMTEwMSw2ICsxMTA4LDEzIEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVy
biBpc051bWJlclByZWRpY3Rpb24obGVmdCkgJiYgaXNOdW1iZXJQcmVkaWN0aW9uKHJpZ2h0KTsK
ICAgICB9CiAgICAgCisgICAgYm9vbCBjb21wYXJlRXFJc1B1cmUoTm9kZSYgbm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBpc1ByZWRpY3RlZE51bWVyaWNhbChub2RlKQorICAgICAgICAgICAg
fHwgTm9kZTo6c2hvdWxkU3BlY3VsYXRlRmluYWxPYmplY3QobV9ncmFwaFtub2RlLmNoaWxkMSgp
XSwgbV9ncmFwaFtub2RlLmNoaWxkMigpXSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNob3VsZFNw
ZWN1bGF0ZUFycmF5KG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIo
KV0pOworICAgIH0KKwogICAgIGJvb2wgbG9naWNhbE5vdElzUHVyZShOb2RlJiBub2RlKQogICAg
IHsKICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0aW9uID0gbV9ncmFwaFtub2RlLmNoaWxk
MSgpXS5wcmVkaWN0aW9uKCk7CkBAIC0xMTI4LDggKzExNDIsOSBAQCBwcml2YXRlOgogICAgICAg
ICBjYXNlIENvbXBhcmVMZXNzRXE6CiAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6CiAgICAg
ICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKLSAgICAgICAgY2FzZSBDb21wYXJlRXE6CiAgICAg
ICAgICAgICByZXR1cm4gIWlzUHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOworICAgICAgICBjYXNl
IENvbXBhcmVFcToKKyAgICAgICAgICAgIHJldHVybiAhY29tcGFyZUVxSXNQdXJlKG5vZGUpOwog
ICAgICAgICBjYXNlIExvZ2ljYWxOb3Q6CiAgICAgICAgICAgICByZXR1cm4gIWxvZ2ljYWxOb3RJ
c1B1cmUobm9kZSk7CiAgICAgICAgIGNhc2UgR2V0QnlWYWw6CkBAIC0xNDIzLDcgKzE0MzgsNyBA
QCBwcml2YXRlOgogICAgIHZvaWQgcGVyZm9ybVN1YnN0aXR1dGlvbihOb2RlSW5kZXgmIGNoaWxk
LCBib29sIGFkZFJlZiA9IHRydWUpCiAgICAgewogICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG9w
ZXJhbmQgaXMgYWN0dWFsbHkgdW51c2VkLgotICAgICAgICBpZiAoY2hpbGQgPT0gTm9Ob2RlKQor
ICAgICAgICBpZiAoY2hpbGQgPT0gTm9Ob2RlIHx8IGNoaWxkID49IG1fcmVwbGFjZW1lbnRzLnNp
emUoKSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAgICAgIC8vIENoZWNrIGlm
IHRoZXJlIGlzIGFueSByZXBsYWNlbWVudC4KQEAgLTE0MzUsMTAgKzE0NTAsMTAgQEAgcHJpdmF0
ZToKICAgICAgICAgCiAgICAgICAgIC8vIFRoZXJlIGlzIGRlZmluaXRlbHkgYSByZXBsYWNlbWVu
dC4gQXNzZXJ0IHRoYXQgdGhlIHJlcGxhY2VtZW50IGRvZXMgbm90CiAgICAgICAgIC8vIGhhdmUg
YSByZXBsYWNlbWVudC4KLSAgICAgICAgQVNTRVJUKG1fcmVwbGFjZW1lbnRzW2NoaWxkXSA9PSBO
b05vZGUpOworICAgICAgICBBU1NFUlQoY2hpbGQgPj0gbV9yZXBsYWNlbWVudHMuc2l6ZSgpIHx8
IG1fcmVwbGFjZW1lbnRzW2NoaWxkXSA9PSBOb05vZGUpOwogICAgICAgICAKICAgICAgICAgaWYg
KGFkZFJlZikKLSAgICAgICAgICAgIG1fZ3JhcGhbY2hpbGRdLnJlZigpOworICAgICAgICAgICAg
cmVmZXJlbmNlTWF5QmVTa2lwcGVkTm9kZShjaGlsZCk7CiAgICAgfQogICAgIAogICAgIHZvaWQg
c2V0UmVwbGFjZW1lbnQoTm9kZUluZGV4IHJlcGxhY2VtZW50KQpAQCAtMTYzOSw2ICsxNjU0LDY4
NCBAQCBwcml2YXRlOgogI2VuZGlmCiAgICAgICAgIGZvciAodW5zaWduZWQgYmxvY2sgPSAwOyBi
bG9jayA8IG1fZ3JhcGgubV9ibG9ja3Muc2l6ZSgpOyArK2Jsb2NrKQogICAgICAgICAgICAgcGVy
Zm9ybUJsb2NrQ1NFKCptX2dyYXBoLm1fYmxvY2tzW2Jsb2NrXSk7CisKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1fcmVwbGFjZW1lbnRzLnNpemUoKTsgKytpKQorICAgICAgICAg
ICAgbV9yZXBsYWNlbWVudHNbaV0gPSBOb05vZGU7CisgICAgfQorICAgIAorI2RlZmluZSBNQVhf
SE9JU1RFRF9MT09QX0lOVkFSSUFOVFMgMjU2CisKKyAgICBzdHJ1Y3QgTG9vcFNpZGVFZmZlY3Rz
IHsKKyAgICAgICAgZW51bSBDbG9iYmVyS2luZCB7CisgICAgICAgICAgICBDbG9iYmVyR2V0R2xv
YmFsVmFyLAorICAgICAgICAgICAgQ2xvYmJlckdldEJ5VmFsLAorICAgICAgICAgICAgQ2xvYmJl
ckNoZWNrU3RydWN0dXJlLAorICAgICAgICAgICAgQ2xvYmJlckdldEJ5T2Zmc2V0LAorICAgICAg
ICAgICAgQ2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSwKKyAgICAgICAgICAgIENsb2JiZXJHZXRJ
bmRleGVkUHJvcGVydHlTdG9yYWdlLAorICAgICAgICAgICAgQ2xvYmJlckdldEFycmF5TGVuZ3Ro
LAorICAgICAgICAgICAgQ2xvYmJlckdldFN0cmluZ0xlbmd0aAorICAgICAgICB9OworCisgICAg
ICAgIExvb3BTaWRlRWZmZWN0cyhCbG9ja0luZGV4IHByZUhlYWRlcikKKyAgICAgICAgICAgIDog
cHJlSGVhZGVySW5kZXgocHJlSGVhZGVyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAg
ICBib29sIGNhbkhvaXN0R2V0R2xvYmFsVmFyKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9i
YmVyR2V0R2xvYmFsVmFyKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0QnlWYWwoKSB7IHJl
dHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRCeVZhbCk7IH0KKyAgICAgICAgYm9vbCBjYW5I
b2lzdENoZWNrU3RydWN0dXJlKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyQ2hlY2tT
dHJ1Y3R1cmUpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRCeU9mZnNldCgpIHsgcmV0dXJu
ICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEJ5T2Zmc2V0KTsgfQorICAgICAgICBib29sIGNhbkhv
aXN0R2V0UHJvcGVydHlTdG9yYWdlKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0
UHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0SW5kZXhlZFByb3Bl
cnR5U3RvcmFnZSgpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEluZGV4ZWRQcm9w
ZXJ0eVN0b3JhZ2UpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRBcnJheUxlbmd0aCgpIHsg
cmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEFycmF5TGVuZ3RoKTsgfQorICAgICAgICBi
b29sIGNhbkhvaXN0R2V0U3RyaW5nTGVuZ3RoKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9i
YmVyR2V0U3RyaW5nTGVuZ3RoKTsgfQorCisgICAgICAgIHZvaWQgY2xvYmJlckdldEdsb2JhbFZh
cigpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJHZXRHbG9iYWxWYXIpOyB9CisgICAgICAgIHZvaWQg
Y2xvYmJlckdldEJ5VmFsKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEJ5VmFsKTsgfQorICAg
ICAgICB2b2lkIGNsb2JiZXJDaGVja1N0cnVjdHVyZSgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJD
aGVja1N0cnVjdHVyZSk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0QnlPZmZzZXQoKSB7IGNs
b2JiZXJzLnNldChDbG9iYmVyR2V0QnlPZmZzZXQpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdl
dFByb3BlcnR5U3RvcmFnZSgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJHZXRQcm9wZXJ0eVN0b3Jh
Z2UpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKSB7
IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAg
ICAgdm9pZCBjbG9iYmVyR2V0QXJyYXlMZW5ndGgoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0
QXJyYXlMZW5ndGgpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldFN0cmluZ0xlbmd0aCgpIHsg
Y2xvYmJlcnMuc2V0KENsb2JiZXJHZXRTdHJpbmdMZW5ndGgpOyB9CisKKyAgICAgICAgVmVjdG9y
PGludCwgOD4gcG9sbHV0ZWRMb2NhbHM7CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9s
bHV0ZWRHbG9iYWxzOworICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCA0PiBub2Rlc1dpdGhQb2xs
dXRlZFN0cnVjdHVyZXM7CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9sbHV0ZWRJZGVu
dGlmaWVyczsKKyAgICAgICAgVmVjdG9yPGludCwgOD4gZ2V0TG9jYWxzOworICAgICAgICBCaXRW
ZWN0b3IgY2xvYmJlcnM7CisgICAgICAgIEJsb2NrSW5kZXggcHJlSGVhZGVySW5kZXg7CisgICAg
fTsKKworICAgIHZvaWQgYW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyhOb2RlSW5kZXggbG9vcEJlZ2lu
LCBOb2RlSW5kZXggbG9vcEVuZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7Cisg
ICAgICAgIGZvciAoTm9kZUluZGV4IGluZGV4ID0gbG9vcEJlZ2luOyBpbmRleCA8IGxvb3BFbmQ7
IGluZGV4KyspIHsKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKKwor
ICAgICAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkgeworICAgICAgICAgICAg
Y2FzZSBQdXRCeVZhbDoKKyAgICAgICAgICAgIGNhc2UgUHV0QnlWYWxBbGlhczoKKyAgICAgICAg
ICAgICAgICAvLyBJZiBQdXRCeVZhbCBzcGVjdWxhdGVzIHRoYXQgaXQncyBhY2Nlc3NpbmcgYW4g
YXJyYXkgd2l0aCBhbgorICAgICAgICAgICAgICAgIC8vIGludGVnZXIgaW5kZXgsIHRoZW4gaXQn
cyBpbXBvc3NpYmxlIGZvciBpdCB0byBjYXVzZSBhIHN0cnVjdHVyZQorICAgICAgICAgICAgICAg
IC8vIGNoYW5nZS4KKyAgICAgICAgICAgICAgICBpZiAoIWJ5VmFsSXNQdXJlKG5vZGUpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJDaGVja1N0cnVjdHVyZSgpOworICAg
ICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlPZmZzZXQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgpOworICAgICAg
ICAgICAgICAgICAgICAvLyBQdXRCeVZhbEFsaWFzIGNhbid0IGNoYW5nZSB0aGUgaW5kZXhlZCBz
dG9yYWdlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gUHV0QnlW
YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0SW5kZXhlZFBy
b3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5vcCA9PSBQ
dXRCeVZhbCAmJiAhaXNGaXhlZEluZGV4ZWRTdG9yYWdlT2JqZWN0UHJlZGljdGlvbihtX2dyYXBo
W25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKSkpCisgICAgICAgICAgICAgICAgICAgIGxvb3BJ
bmZvLmNsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAg
Ly8gV2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgUHV0QnlWYWwgd2lsbCBjbG9iYmVyIHRoZSBsb2Nh
dGlvbiB3ZSdyZSBnZXR0aW5nIGZyb20uCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGNh
biBkbyBiZXR0ZXI7IGlmIHdlIGtub3cgdGhhdCB0aGUgUHV0QnlWYWwgaXMgYWNjZXNzaW5nIGFu
IGFycmF5IG9mIGEKKyAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBH
ZXRCeVZhbCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhleSB3b24ndCBjbG9iYmVyIGVhY2ggb3RoZXIu
CisgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5VmFsKCk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dFN0cnVjdHVyZToKKyAgICAgICAgICAg
ICAgICAvLyBDaGFuZ2luZyB0aGUgc3RydWN0dXJlIG9yIHB1dHRpbmcgdG8gdGhlIHN0b3JhZ2Ug
Y2Fubm90CisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBwcm9wZXJ0eSBzdG9yYWdlIHBv
aW50ZXIuCisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBjYW5ub3Qg
Y2hhbmdlIHRoZSBvdXRjb21lIG9mIGEgcHJvcGVydHkgZ2V0LgorICAgICAgICAgICAgICAgIGxv
b3BJbmZvLm5vZGVzV2l0aFBvbGx1dGVkU3RydWN0dXJlcy5hcHBlbmQobm9kZS5jaGlsZDEoKSk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dEJ5T2Zmc2V0Ogor
ICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYSBwcm9wZXJ0eSBjYW5ub3QgY2hhbmdlIHRoZSBz
dHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRJZGVudGlmaWVycy5h
cHBlbmQobV9ncmFwaC5tX3N0b3JhZ2VBY2Nlc3NEYXRhW25vZGUuc3RvcmFnZUFjY2Vzc0RhdGFJ
bmRleCgpXS5pZGVudGlmaWVyTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgQXJyYXlQb3A6CisgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdl
dEJ5VmFsKCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoLgorICAgICAgICAgICAg
Y2FzZSBBcnJheVB1c2g6CisgICAgICAgICAgICAgICAgLy8gQSBwdXNoIGNhbm5vdCBhZmZlY3Qg
cHJldmlvdXNseSBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICAgICAgICAg
ICAgbG9vcEluZm8uY2xvYmJlckdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIFB1dEdsb2JhbFZhcjoKKyAgICAgICAgICAgICAgICBsb29w
SW5mby5wb2xsdXRlZEdsb2JhbHMuYXBwZW5kKG5vZGUudmFyTnVtYmVyKCkpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKKyAgICAgICAgICAgICAg
ICBsb29wSW5mby5wb2xsdXRlZExvY2Fscy5hcHBlbmQobm9kZS5sb2NhbCgpKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR2V0TG9jYWw6CisgICAgICAgICAgICAg
ICAgbG9vcEluZm8uZ2V0TG9jYWxzLmFwcGVuZChub2RlLmxvY2FsKCkpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoY2xv
YmJlcnNXb3JsZChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJl
ckNoZWNrU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJH
ZXRCeU9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0UHJv
cGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRJ
bmRleGVkUHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNs
b2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0
QXJyYXlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFN0
cmluZ0xlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBDYWxsIHx8
IG5vZGUub3AgPT0gQ29uc3RydWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8u
Y2xvYmJlckdldEdsb2JhbFZhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNI
b2lzdENhbmRpZGF0ZShOb2RlJiBub2RlLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAg
IHsKKyAgICAgICAgYm9vbCBpc0NhbmRpZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAo
bm9kZS5vcCkgeworCisgICAgICAgIGNhc2UgQ29udmVydFRoaXM6CisgICAgICAgIGNhc2UgR2V0
Q2FsbGVlOgorICAgICAgICBjYXNlIENoZWNrRnVuY3Rpb246CisgICAgICAgIGNhc2UgU3RyaW5n
Q2hhckNvZGVBdDoKKyAgICAgICAgY2FzZSBTdHJpbmdDaGFyQXQ6CisgICAgICAgIGNhc2UgQ2hl
Y2tIYXNJbnN0YW5jZToKKyAgICAgICAgY2FzZSBJbnN0YW5jZU9mOgorICAgICAgICBjYXNlIENv
bXBhcmVTdHJpY3RFcToKKyAgICAgICAgY2FzZSBCaXRBbmQ6CisgICAgICAgIGNhc2UgQml0T3I6
CisgICAgICAgIGNhc2UgQml0WG9yOgorICAgICAgICBjYXNlIEJpdExTaGlmdDoKKyAgICAgICAg
Y2FzZSBCaXRSU2hpZnQ6CisgICAgICAgIGNhc2UgQml0VVJTaGlmdDoKKyAgICAgICAgY2FzZSBW
YWx1ZVRvSW50MzI6CisgICAgICAgIGNhc2UgVUludDMyVG9OdW1iZXI6CisgICAgICAgIGNhc2Ug
QXJpdGhBZGQ6CisgICAgICAgIGNhc2UgQXJpdGhTdWI6CisgICAgICAgIGNhc2UgQXJpdGhNdWw6
CisgICAgICAgIGNhc2UgQXJpdGhNb2Q6CisgICAgICAgIGNhc2UgQXJpdGhEaXY6CisgICAgICAg
IGNhc2UgQXJpdGhBYnM6CisgICAgICAgIGNhc2UgQXJpdGhNaW46CisgICAgICAgIGNhc2UgQXJp
dGhNYXg6CisgICAgICAgIGNhc2UgQXJpdGhTcXJ0OgorICAgICAgICBjYXNlIFZhbHVlVG9OdW1i
ZXI6CisgICAgICAgIGNhc2UgVmFsdWVUb0RvdWJsZToKKyAgICAgICAgY2FzZSBKU0NvbnN0YW50
OgorICAgICAgICBjYXNlIFdlYWtKU0NvbnN0YW50OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUg
PSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVBZGQ6CisgICAg
ICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAg
ICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgor
ICAgICAgICBjYXNlIENvbXBhcmVFcToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gaXNQcmVk
aWN0ZWROdW1lcmljYWwobm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBM
b2dpY2FsTm90OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb2dpY2FsTm90SXNQdXJlKG5v
ZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2hlY2tTdHJ1Y3R1cmU6Cisg
ICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0Q2hlY2tTdHJ1Y3R1cmUo
KSAmJiAhbG9vcEluZm8ubm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzLmNvbnRhaW5zKG5vZGUu
Y2hpbGQxKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlWYWw6Cisg
ICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGJ5VmFsSXNQdXJlKG5vZGUpICYmIGxvb3BJbmZvLmNh
bkhvaXN0R2V0QnlWYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldFBy
b3BlcnR5U3RvcmFnZToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9p
c3RHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2U6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxv
b3BJbmZvLmNhbkhvaXN0R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlPZmZzZXQ6CisgICAgICAgICAgICBpc0NhbmRpZGF0
ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0QnlPZmZzZXQoKSAmJiAhbG9vcEluZm8ucG9sbHV0ZWRJ
ZGVudGlmaWVycy5jb250YWlucyhtX2dyYXBoLm1fc3RvcmFnZUFjY2Vzc0RhdGFbbm9kZS5zdG9y
YWdlQWNjZXNzRGF0YUluZGV4KCldLmlkZW50aWZpZXJOdW1iZXIpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6CisgICAgICAgIGNhc2UgR2V0Qnl0ZUFy
cmF5TGVuZ3RoOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdl
dEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRTdHJp
bmdMZW5ndGg6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0
U3RyaW5nTGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRHbG9i
YWxWYXI6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0R2xv
YmFsVmFyKCkgJiYgIWxvb3BJbmZvLnBvbGx1dGVkR2xvYmFscy5jb250YWlucyhub2RlLnZhck51
bWJlcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldExvY2FsOgorICAg
ICAgICAgICAgaXNDYW5kaWRhdGUgPSAhbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuY29udGFpbnMo
bm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBEYW5nZXJvdXMh
IFBheSBtb3JlIGF0dGVudGlvbiBwbGVhc2UuCisgICAgICAgIGNhc2UgU2V0TG9jYWw6CisgICAg
ICAgICAgICBpc0NhbmRpZGF0ZSA9ICFsb29wSW5mby5wb2xsdXRlZExvY2Fscy5jb250YWlucyhu
b2RlLmxvY2FsKCkpICYmICFsb29wSW5mby5nZXRMb2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaXNDYW5kaWRhdGU7CisgICAgfQorCisg
ICAgYm9vbCBub2RlQ2FuQmVIb2lzdGVkKE5vZGUmIG5vZGUsIEJhc2ljQmxvY2smIHRhcmdldEJs
b2NrLCBWZWN0b3I8Tm9kZUluZGV4LCAzPiYgaG9pc3RlZENoaWxkcmVuKQorICAgIHsKKyAgICAg
ICAgYm9vbCBjYW5Ib2lzdCA9IHRydWU7CisKKyAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFz
VmFyQXJncykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmly
c3RDaGlsZCgpOyBjaGlsZElkeCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJl
bigpOyBjaGlsZElkeCsrKSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkID0gbV9n
cmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICBpZiAoY2hp
bGQgIT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVu
dCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxh
Y2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0QmxvY2su
ZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGls
ZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNh
bkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4u
Zml4ZWQuY2hpbGQxOworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMiA9IG5vZGUuY2hpbGRy
ZW4uZml4ZWQuY2hpbGQyOworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IG5vZGUuY2hp
bGRyZW4uZml4ZWQuY2hpbGQzOworCisgICAgICAgICAgICBpZiAoY2hpbGQxICE9IE5vTm9kZSkg
eworICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRz
W2NoaWxkMV07CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2Nr
LmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAg
ICAgICBob2lzdGVkQ2hpbGRyZW4uYXBwZW5kKGNoaWxkMSk7CisgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2Rl
SW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDJdOworICAgICAgICAgICAg
ICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8
IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFw
cGVuZChjaGlsZDIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
Y2FuSG9pc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDMg
IT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9y
ZXBsYWNlbWVudHNbY2hpbGQzXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0g
dGFyZ2V0QmxvY2suYmVnaW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAg
ICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FuSG9pc3Q7CisgICAgfQor
CisgICAgdm9pZCByZWZlcmVuY2VNYXlCZVNraXBwZWROb2RlKE5vZGVJbmRleCBpbmRleCkKKyAg
ICB7CisgICAgICAgIGlmIChpbmRleCA9PSBOb05vZGUgfHwgIW1fZ3JhcGhbaW5kZXhdLnJlZigp
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEl0IGJlY29tZXMgbW9yZSBjb21w
bGV4IGlmIHRoZSByZWZlcmVuY2UgaXMgYSBza2lwcGVkIG5vZGUuCisgICAgICAgIC8vIFdlIG5l
ZWQgdG8gdHJhdmVyc2UgdGhlIHJlZmVyZW5jZSBjaGFpbiB0byBmaXggdGhlIHJlZmVyZW5jZSBj
b3VudHMuCisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDQ+IHNraXBwZWROb2RlczsKKyAgICAg
ICAgc2tpcHBlZE5vZGVzLmFwcGVuZChpbmRleCk7CisKKyAgICAgICAgd2hpbGUgKCFza2lwcGVk
Tm9kZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBOb2RlSW5kZXggc2tpcHBlZEluZGV4ID0g
c2tpcHBlZE5vZGVzLmxhc3QoKTsKKyAgICAgICAgICAgIHNraXBwZWROb2Rlcy5yZW1vdmVMYXN0
KCk7CisgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtza2lwcGVkSW5kZXhdOworCisg
ICAgICAgICAgICBpZiAobm9kZS5vcCAmIE5vZGVNdXN0R2VuZXJhdGUpCisgICAgICAgICAgICAg
ICAgbm9kZS5yZWYoKTsKKworICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFzVmFyQXJn
cykgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0
Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hpbGRyZW4o
KTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGR4ID0g
bV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG1fZ3JhcGhbY2hpbGR4XS5yZWYoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBw
ZWROb2Rlcy5hcHBlbmQoY2hpbGR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZDEgPSBub2RlLmNoaWxkcmVu
LmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQyID0gbm9kZS5j
aGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9
IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQzOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxk
MSAhPSBOb05vZGUgJiYgbV9ncmFwaFtjaGlsZDFdLnJlZigpKQorICAgICAgICAgICAgICAgICAg
ICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hp
bGQyICE9IE5vTm9kZSAmJiBtX2dyYXBoW2NoaWxkMl0ucmVmKCkpCisgICAgICAgICAgICAgICAg
ICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoY2hpbGQyKTsKKworICAgICAgICAgICAgICAgIGlmIChj
aGlsZDMgIT0gTm9Ob2RlICYmIG1fZ3JhcGhbY2hpbGQzXS5yZWYoKSkKKyAgICAgICAgICAgICAg
ICAgICAgc2tpcHBlZE5vZGVzLmFwcGVuZChjaGlsZDMpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtSG9pc3QoTm9kZUluZGV4IGluZGV4LCBCYXNp
Y0Jsb2NrJiB0YXJnZXRCbG9jaywgdW5zaWduZWQmIGhvaXN0ZWQpCisgICAgeworICAgICAgICBO
b2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CisKKyAgICAgICAgaWYgKCFob2lzdGVkKQorICAg
ICAgICAgICAgdGFyZ2V0QmxvY2suYmVnaW4gPSBtX2dyYXBoLnNpemUoKTsKKworICAgICAgICBt
X2dyYXBoLmFwcGVuZChub2RlKTsKKyAgICAgICAgTm9kZSYgcmVwbGFjZW1lbnQgPSBtX2dyYXBo
Lmxhc3QoKTsKKyAgICAgICAgcmVwbGFjZW1lbnQuc2V0UmVmQ291bnQoIW5vZGUuaGFzUmVzdWx0
KCkgJiYgKG5vZGUub3AgJiBOb2RlTXVzdEdlbmVyYXRlKSA/IDEgOiAwKTsKKyAgICAgICAgLy8g
T25seSBwZXJmb3JtIGNoaWxkcmVuIHN1YnN0aXR1dGlvbiBmb3IgdGhlIHJlcGxhY2VtZW50IG5v
ZGUuCisgICAgICAgIGlmIChyZXBsYWNlbWVudC5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxkSWR4ID0gcmVwbGFjZW1lbnQuZmlyc3RDaGlsZCgp
OyBjaGlsZElkeCA8IHJlcGxhY2VtZW50LmZpcnN0Q2hpbGQoKSArIHJlcGxhY2VtZW50Lm51bUNo
aWxkcmVuKCk7IGNoaWxkSWR4KyspCisgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlv
bihtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdLCByZXBsYWNlbWVudC5yZWZDb3Vu
dCgpKTsgLy8gRG9uJ3QgcmVmZXJlbmNlIHRoZSBuZXcgY2hpbGQgaGVyZS4KKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRy
ZW4uZml4ZWQuY2hpbGQxLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAgIHBl
cmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQyLCByZXBs
YWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVw
bGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQzLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsK
KyAgICAgICAgfQorI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAg
ICAgICAgcHJpbnRmKCIgICBSZXBsYWNpbmcgQCV1IC0+IEAldSIsIGluZGV4LCBtX2dyYXBoLnNp
emUoKSAtIDEpOworI2VuZGlmCisgICAgICAgIG1fcmVwbGFjZW1lbnRzW21fY29tcGlsZUluZGV4
XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsKKyAgICAgICAgTm9kZSYgbmV3Tm9kZSA9IG1fZ3JhcGhb
bV9jb21waWxlSW5kZXhdOyAvLyBUaGlzIGNhbiBkaWZmZXIgZnJvbSAibm9kZSIgYmVjYXVzZSBt
X2dyYXBoIGlzIGV4cGFuZGVkCisgICAgICAgIG5ld05vZGUuc2V0UmVmQ291bnQoMCk7CisgICAg
ICAgICsraG9pc3RlZDsKKyAgICAgICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7
CisgICAgfQorCisgICAgdm9pZCBob2lzdEdldExvY2FsKExvb3BTaWRlRWZmZWN0cyYgbG9vcElu
Zm8sIHVuc2lnbmVkJiBob2lzdGVkKQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3Jh
cGhbbV9jb21waWxlSW5kZXhdOworICAgICAgICBBU1NFUlQobm9kZS5vcCA9PSBHZXRMb2NhbCk7
CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHBy
aW50ZigiICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhbbV9jb21waWxlSW5kZXhd
Lm9wKSwgbV9jb21waWxlSW5kZXgpOworI2VuZGlmCisKKyAgICAgICAgaWYgKCFub2RlLnNob3Vs
ZEdlbmVyYXRlKCkKKyAgICAgICAgICAgIHx8IGhvaXN0ZWQgPj0gTUFYX0hPSVNURURfTE9PUF9J
TlZBUklBTlRTIC0gMQorICAgICAgICAgICAgfHwgIWlzSG9pc3RDYW5kaWRhdGUobm9kZSwgbG9v
cEluZm8pCisgICAgICAgICAgICB8fCBub2RlLmNoaWxkMSgpID09IE5vTm9kZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBCYXNpY0Jsb2NrJiBwcmVIZWFkZXJCbG9jayA9ICptX2dy
YXBoLm1fYmxvY2tzW2xvb3BJbmZvLnByZUhlYWRlckluZGV4XTsKKyAgICAgICAgaW50IG9wZXJh
bmQgPSBub2RlLmxvY2FsKCk7CisgICAgICAgIE5vZGVJbmRleCBsYXN0RGVmaW5lSW5kZXggPSBO
b05vZGU7CisgICAgICAgIGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkKKyAgICAgICAg
ICAgIGxhc3REZWZpbmVJbmRleCA9IHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1
bWVudChvcGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGxhc3REZWZpbmVJbmRleCA9IHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2Nh
bChvcGVyYW5kKTsKKworICAgICAgICBBU1NFUlQobGFzdERlZmluZUluZGV4ICE9IE5vTm9kZSk7
CisgICAgICAgIE5vZGUmIGxhc3REZWZpbmUgPSBtX2dyYXBoW2xhc3REZWZpbmVJbmRleF07Cisg
ICAgICAgIGlmIChsYXN0RGVmaW5lLm9wID09IEdldExvY2FsKSB7CisjaWYgREZHX0VOQUJMRShE
RUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRmKCIgICBSZXBsYWNp
bmcgQCV1IC0+IEAldVxuIiwgbV9jb21waWxlSW5kZXggKyAxLCBsYXN0RGVmaW5lSW5kZXgpOwor
I2VuZGlmCisgICAgICAgICAgICBtX3JlcGxhY2VtZW50c1ttX2NvbXBpbGVJbmRleF0gPSBsYXN0
RGVmaW5lSW5kZXg7CisgICAgICAgICAgICBub2RlLnNldFJlZkNvdW50KDApOworICAgICAgICAg
ICAgcmV0dXJuOyAvLyBXZSdyZSBkb25lLgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RE
ZWZpbmUub3AgPT0gU2V0TG9jYWwpIHsKKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgcmVh
Y2ggaGVyZSBiZWNhdXNlIGEgU2V0TG9jYWwgd2l0aCB0aGlzIG9wZXJhbmQKKyAgICAgICAgICAg
IC8vIHNob3VsZCBub3QgYmUgaG9pc3RlZCB0byB0aGlzIGJsb2NrIAorICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdERlZmluZS5v
cCA9PSBQaGkpIHsKKyAgICAgICAgICAgIGlmICghaG9pc3RlZCkKKyAgICAgICAgICAgICAgICBw
cmVIZWFkZXJCbG9jay5iZWdpbiA9IG1fZ3JhcGguc2l6ZSgpOworICAgICAgICAgICAgbV9ncmFw
aC5hcHBlbmQobV9ncmFwaFttX2NvbXBpbGVJbmRleF0pOworICAgICAgICAgICAgTm9kZSYgZ2V0
TG9jYWxOb2RlID0gbV9ncmFwaFttX2NvbXBpbGVJbmRleF07CisgICAgICAgICAgICBOb2RlJiBn
ZXRMb2NhbFJlcGxhY2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgICAgICBnZXRMb2Nh
bFJlcGxhY2VtZW50LnNldFJlZkNvdW50KDApOworICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNl
bWVudC5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSBsYXN0RGVmaW5lSW5kZXg7CisgICAgICAgICAg
ICBtX3JlcGxhY2VtZW50c1ttX2NvbXBpbGVJbmRleF0gPSBtX2dyYXBoLnNpemUoKSAtIDE7Cisj
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJp
bnRmKCIgICBSZXBsYWNpbmcgQCV1IC0+IEAldVxuIiwgbV9jb21waWxlSW5kZXgsIG1fZ3JhcGgu
c2l6ZSgpIC0gMSk7CisjZW5kaWYKKyAgICAgICAgICAgIGdldExvY2FsTm9kZS5zZXRSZWZDb3Vu
dCgwKTsKKyAgICAgICAgICAgICsraG9pc3RlZDsKKyAgICAgICAgICAgIHByZUhlYWRlckJsb2Nr
LmVuZCA9IG1fZ3JhcGguc2l6ZSgpOworCisgICAgICAgICAgICBpZiAob3BlcmFuZElzQXJndW1l
bnQob3BlcmFuZCkpCisgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVzQXRU
YWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKSA9IG1fZ3JhcGguc2l6ZSgp
IC0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmVIZWFkZXJCbG9jay52
YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbChCbG9j
a0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBjaGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29w
SW5mbykKKyAgICB7CisgICAgICAgIE5vZGUmIGNoaWxkTm9kZSA9IG1fZ3JhcGhbY2hpbGRdOwor
ICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07Cisg
ICAgICAgIEFTU0VSVChyZXBsYWNlbWVudCAhPSBOb05vZGUpOworICAgICAgICBBU1NFUlQoY2hp
bGROb2RlLm9wICE9IEdldExvY2FsICYmIGNoaWxkTm9kZS5vcCAhPSBQaGkgJiYgY2hpbGROb2Rl
Lm9wICE9IFNldExvY2FsKTsKKyAgICAgICAgTm9kZSYgc2V0TG9jYWxOb2RlID0gbV9ncmFwaFty
ZXBsYWNlbWVudCArIDFdOworICAgICAgICBBU1NFUlQoc2V0TG9jYWxOb2RlLm9wID09IFNldExv
Y2FsKTsKKyAgICAgICAgQVNTRVJUKHNldExvY2FsTm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDEg
PT0gcmVwbGFjZW1lbnQpOworCisgICAgICAgIGNoaWxkTm9kZS5vcCA9IEdldExvY2FsOworICAg
ICAgICByZWZlcmVuY2VNYXlCZVNraXBwZWROb2RlKHJlcGxhY2VtZW50ICsgMSk7CisgICAgICAg
IGNoaWxkTm9kZS5zZXRWYXJpYWJsZUFjY2Vzc0RhdGEoc2V0TG9jYWxOb2RlLnZhcmlhYmxlQWNj
ZXNzRGF0YSgpKTsKKyAgICAgICAgaW50IG9wZXJhbmQgPSBjaGlsZE5vZGUubG9jYWwoKTsKKyAg
ICAgICAgQmFzaWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29w
SW5mby5wcmVIZWFkZXJJbmRleF07CisgICAgICAgIEJhc2ljQmxvY2smIGN1cnJlbnRCbG9jayA9
ICptX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBOb2RlSW5kZXggZmlyc3RE
ZWZpbmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuYXBw
ZW5kKG9wZXJhbmQpOworICAgICAgICBpZiAob3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpIHsK
KyAgICAgICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChvcGVy
YW5kVG9Bcmd1bWVudChvcGVyYW5kKSkgPSByZXBsYWNlbWVudCArIDE7CisgICAgICAgICAgICBm
aXJzdERlZmluZUluZGV4ID0gY3VycmVudEJsb2NrLnZhcmlhYmxlc0F0SGVhZC5hcmd1bWVudChv
cGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBwcmVIZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCkgPSByZXBsYWNl
bWVudCArIDE7CisgICAgICAgICAgICBmaXJzdERlZmluZUluZGV4ID0gY3VycmVudEJsb2NrLnZh
cmlhYmxlc0F0SGVhZC5sb2NhbChvcGVyYW5kKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBy
ZWFkcyBvZiB0ZW1wb3JhcmllcyBmcm9tIHByaW9yIGJsb2NrcywKKyAgICAgICAgICAgIC8vIGV4
cGFuZCBtX3ByZXNlcnZlZFZhcnMgdG8gY292ZXIgdGhlc2UuCisgICAgICAgICAgICBtX2dyYXBo
Lm1fcHJlc2VydmVkVmFycy5zZXQob3BlcmFuZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBB
U1NFUlQoZmlyc3REZWZpbmVJbmRleCAhPSBOb05vZGUpOworICAgICAgICBpZiAoZmlyc3REZWZp
bmVJbmRleCAhPSBOb05vZGUgJiYgbV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5vcCA9PSBHZXRM
b2NhbCkKKyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBtX2dyYXBoW2ZpcnN0RGVmaW5l
SW5kZXhdLmNoaWxkMSgpOworCisgICAgICAgIGNoaWxkTm9kZS5jaGlsZHJlbi5maXhlZC5jaGls
ZDEgPSBmaXJzdERlZmluZUluZGV4OworICAgICAgICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQu
Y2hpbGQyID0gTm9Ob2RlOworICAgICAgICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQz
ID0gTm9Ob2RlOworICAgIH0KKworICAgIGJvb2wgZml4SG9pc3RlZENoaWxkKEJsb2NrSW5kZXgg
YmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQor
ICAgIHsKKyAgICAgICAgYm9vbCBzdWNjZXNzZnVsID0gdHJ1ZTsKKyAgICAgICAgTm9kZUluZGV4
IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVw
bGFjZW1lbnQgIT0gTm9Ob2RlKTsgLy8gQ2hpbGRyZW4gb2YgYSBob2lzdGVkIG5vZGUgbXVzdCBo
YXZlIGJlZW4gaG9pc3RlZCBhcyB3ZWxsLgorCisgICAgICAgIG1fZ3JhcGhbY2hpbGRdLnJlZigp
OworICAgICAgICBpZiAobV9ncmFwaFtjaGlsZF0ucmVmQ291bnQoKSA9PSAxKSB7CisgICAgICAg
ICAgICAvLyBPbmx5IGZpeCB0aGlzIGNoaWxkIG9uY2UuCisgICAgICAgICAgICBpZiAobV9ncmFw
aFtjaGlsZF0ub3AgIT0gR2V0TG9jYWwgJiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0gSlNDb25zdGFu
dCAmJiBtX2dyYXBoW2NoaWxkXS5vcCAhPSBXZWFrSlNDb25zdGFudCkgeworICAgICAgICAgICAg
ICAgIEFTU0VSVChtX2dyYXBoW2NoaWxkXS5vcCAhPSBQaGkgJiYgbV9ncmFwaFtjaGlsZF0ub3Ag
IT0gU2V0TG9jYWwpOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA8IG1fZ3JhcGgu
c2l6ZSgpIC0gMSAmJiBtX2dyYXBoW3JlcGxhY2VtZW50ICsgMV0ub3AgPT0gU2V0TG9jYWwpCisg
ICAgICAgICAgICAgICAgICAgIGZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbChibG9ja0luZGV4
LCBjaGlsZCwgbG9vcEluZm8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICAgICAgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KG1fZ3JhcGhbY2hpbGRdLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkKKyAgICAgICAgICAgICAgICBt
X2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1
bDsKKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJsb2Nr
SW5kZXgsIE5vZGVJbmRleCBjaGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7
CisgICAgICAgIGlmIChmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQsIGxvb3BJbmZv
KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZml4IHRo
aXMgY2hpbGQsIHdlIG5lZWQgdG8gYmFjayB0cmFjay4KKyAgICAgICAgVmVjdG9yPE5vZGVJbmRl
eCwgMz4gaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsOworICAgICAgICBob2lzdGVkQ2hp
bGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkKTsKKyAgICAgICAgd2hpbGUgKCFob2lz
dGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBOb2Rl
JiBub2RlID0gbV9ncmFwaFtob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwubGFzdCgpXTsK
KyAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5yZW1vdmVMYXN0KCk7
CisgICAgICAgICAgICBpZiAobm9kZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBjaGlsZElk
eCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKSB7
CisgICAgICAgICAgICAgICAgICAgIE5vZGVJbmRleCYgY2hpbGR4ID0gbV9ncmFwaC5tX3ZhckFy
Z0NoaWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkeCAhPSBO
b05vZGUgJiYgIWZpeEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZHgsIGxvb3BJbmZvKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5h
cHBlbmQoY2hpbGR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIE5vZGVJbmRleCYgY2hpbGQxID0gbm9kZS5jaGlsZHJlbi5maXhlZC5j
aGlsZDE7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4JiBjaGlsZDIgPSBub2RlLmNoaWxkcmVu
LmZpeGVkLmNoaWxkMjsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNoaWxkMyA9IG5vZGUu
Y2hpbGRyZW4uZml4ZWQuY2hpbGQzOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMSAhPSBO
b05vZGUgJiYgIWZpeEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZDEsIGxvb3BJbmZvKSkK
KyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVu
ZChjaGlsZDEpOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUgJiYgIWZp
eEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZDIsIGxvb3BJbmZvKSkKKyAgICAgICAgICAg
ICAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZDIpOwor
CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMyAhPSBOb05vZGUgJiYgIWZpeEhvaXN0ZWRDaGls
ZChibG9ja0luZGV4LCBjaGlsZDMsIGxvb3BJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgaG9p
c3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZDMpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWRvcHQgdGhlIGRvbWluYW5jZSBhbGdvcml0
aG0gYnkgQ29vcGVyLCBLZWl0aCBELjsgSGFydmV5LCBUaW1vdGh5IEo7IGFuZCBLZW5uZWR5LCBL
ZW4gKDIwMDEpLiAKKyAgICAvLyAiQSBTaW1wbGUsIEZhc3QgRG9taW5hbmNlIEFsZ29yaXRobSIK
KyAgICAvLyBodHRwOi8vd3d3LmhpcGVyc29mdC5yaWNlLmVkdS9ncmFkcy9wdWJsaWNhdGlvbnMv
ZG9tMTQucGRmCisgICAgdW5zaWduZWQgaW50ZXJzZWN0KHVuc2lnbmVkIGIxLCB1bnNpZ25lZCBi
MiwgVmVjdG9yPHVuc2lnbmVkPiYgZG9tVHJlZSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGZp
bmdlcjEgPSBiMTsKKyAgICAgICAgdW5zaWduZWQgZmluZ2VyMiA9IGIyOworCisgICAgICAgIHdo
aWxlIChmaW5nZXIxICE9IGZpbmdlcjIpIHsKKyAgICAgICAgICAgIHdoaWxlIChmaW5nZXIxID4g
ZmluZ2VyMikKKyAgICAgICAgICAgICAgIGZpbmdlcjEgPSBkb21UcmVlW2ZpbmdlcjFdOworICAg
ICAgICAgICAgd2hpbGUgKGZpbmdlcjIgPiBmaW5nZXIxKQorICAgICAgICAgICAgICAgZmluZ2Vy
MiA9IGRvbVRyZWVbZmluZ2VyMl07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmluZ2Vy
MTsKKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVEb21pbmF0b3JzKEJsb2NrSW5kZXggYmVnaW4s
IEJsb2NrSW5kZXggZW5kLCBWZWN0b3I8QmxvY2tJbmRleCwgOD4mIGRvbWluYXRvcnMpCisgICAg
eworICAgICAgICAvLyBGaXJzdGx5IGNvbXB1dGUgdGhlIGRvbWluYXRvciB0cmVlLgorICAgICAg
ICAvLyBUaGUgdHJlZSBub2RlIGluZGV4IGlzIHRoZSBibG9jayBpbmRleCBvZmZzZXRlZCBieSB0
aGUgYmVnaW4gYmxvY2sgaW5kZXguCisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZD4gZG9tVHJlZTsK
KyAgICAgICAgdW5zaWduZWQgc2l6ZSA9IGVuZCAtIGJlZ2luICsgMTsKKworICAgICAgICBkb21U
cmVlLnJlc2l6ZShzaXplKTsKKyAgICAgICAgZG9tVHJlZVswXSA9IDA7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDE7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBkb21UcmVlW2ldID0g
c2l6ZTsKKworICAgICAgICBib29sIGNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIHdoaWxlIChj
aGFuZ2VkKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAo
IW1fZ3JhcGgubV9ibG9ja3NbYmVnaW4gKyBpXS0+aXNSZWFjaGFibGUpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFZlcmlmeSBhbmQg
ZW5zdXJlIHRoYXQgdGhlIHByZWNlc3NvcnMgYXJlIG9yZGVyZWQgYnkgaW5kZXguCisgICAgICAg
ICAgICAgICAgUHJlZGVjZXNzb3JMaXN0JiBwcmVkZWNlc3NvcnMgPSBtX2dyYXBoLm1fYmxvY2tz
W2JlZ2luICsgaV0tPm1fcHJlZGVjZXNzb3JzOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGog
PSAwOworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHByZWRlY2Vzc29yIGluIHRo
aXMgc3ViZ3JhcGgKKyAgICAgICAgICAgICAgICB3aGlsZSAocHJlZGVjZXNzb3JzW2pdIDwgYmVn
aW4pCisgICAgICAgICAgICAgICAgICAgIGorKzsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVk
IG5ld0lEb20gPSBwcmVkZWNlc3NvcnNbal0gLSBiZWdpbjsKKyAgICAgICAgICAgICAgICBBU1NF
UlQoZG9tVHJlZVtuZXdJRG9tXSAhPSBzaXplKTsgLy8gTXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2Vk
LgorICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IHByZWRl
Y2Vzc29ycy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwcmVk
ID0gcHJlZGVjZXNzb3JzW2pdIC0gYmVnaW47CisgICAgICAgICAgICAgICAgICAgIGlmIChkb21U
cmVlW3ByZWRdICE9IHNpemUpIC8vIE1lYW5zIGl0J3MgYWxyZWFkeSBjYWxjdWxhdGVkLgorICAg
ICAgICAgICAgICAgICAgICAgICAgbmV3SURvbSA9IGludGVyc2VjdChwcmVkLCBuZXdJRG9tLCBk
b21UcmVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvbVRyZWVb
aV0gIT0gbmV3SURvbSkgeworICAgICAgICAgICAgICAgICAgICBkb21UcmVlW2ldID0gbmV3SURv
bTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGgubV9sb29wUHJlSGVhZGVyQmxvY2tzLmNv
bnRhaW5zKGJlZ2luICsgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY29u
ZGl0aW9uYWwgaW5uZXIgbG9vcHMgaWYgcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgIE5v
ZGUmIGp1bXAgPSBtX2dyYXBoW21fZ3JhcGgubV9ibG9ja3NbYmVnaW4gKyBpXS0+ZW5kIC0gMV07
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChqdW1wLm9wID09IEp1bXApOworICAgICAgICAg
ICAgICAgICAgICBpID0ganVtcC50YWtlbkJsb2NrSW5kZXgoKSAtIGJlZ2luIC0gMTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVu
IHRyYXZlcnNlIHRoZSBkb21pbmF0b3IgdHJlZSB0byBnZXQgdGhlIGRvbWluYXRvcnMgb2YgdGhl
IGxhc3QgYmxvY2suCisgICAgICAgIHVuc2lnbmVkIGlkb20gPSBkb21UcmVlLmxhc3QoKTsKKyAg
ICAgICAgd2hpbGUgKGlkb20pIHsKKyAgICAgICAgICAgIGRvbWluYXRvcnMuYXBwZW5kKGlkb20g
KyBiZWdpbik7CisgICAgICAgICAgICBpZG9tID0gZG9tVHJlZVtpZG9tXTsKKyAgICAgICAgfQor
ICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChiZWdpbik7CisgICAgfQorCisgICAgdm9pZCBwZXJm
b3JtTElDTShCbG9ja0luZGV4IHByZUhlYWRlckluZGV4KQorICAgIHsKKyAgICAgICAgQmFzaWNC
bG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1twcmVIZWFkZXJJbmRleF07
CisgICAgICAgIEJsb2NrSW5kZXggbG9vcEhlYWRlckluZGV4ID0gbV9ncmFwaFtwcmVIZWFkZXJC
bG9jay5lbmQgLSAxXS50YWtlbkJsb2NrSW5kZXgoKTsKKyAgICAgICAgQmFzaWNCbG9jayYgYmxv
Y2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29wSGVhZGVySW5kZXhdOworICAgICAgICBCbG9ja0lu
ZGV4IGxhc3RMb29wQmxvY2tJbmRleCA9IGxvb3BIZWFkZXJJbmRleDsKKyAgICAgICAgdW5zaWdu
ZWQgaSA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsb2NrLm1fcHJlZGVjZXNzb3Jz
LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmxvY2subV9wcmVkZWNlc3NvcnNbaV0g
PiBsYXN0TG9vcEJsb2NrSW5kZXgpCisgICAgICAgICAgICAgICAgbGFzdExvb3BCbG9ja0luZGV4
ID0gYmxvY2subV9wcmVkZWNlc3NvcnNbaV07IC8vIFRoZSBmcm9tIGJsb2NrIG9mIHRoZSBiYWNr
IGVkZ2UuCisgICAgICAgIH0KKworICAgICAgICBCbG9ja0luZGV4IGZpcnN0TG9vcEJsb2NrSW5k
ZXggPSBwcmVIZWFkZXJJbmRleCArIDE7CisgICAgICAgIFZlY3RvcjxCbG9ja0luZGV4LCA4PiBt
dXN0UmVhY2hCbG9ja3NJbkxvb3A7CisgICAgICAgIG11c3RSZWFjaEJsb2Nrc0luTG9vcC5hcHBl
bmQobGFzdExvb3BCbG9ja0luZGV4KTsKKyAgICAgICAgY29tcHV0ZURvbWluYXRvcnMoZmlyc3RM
b29wQmxvY2tJbmRleCwgbGFzdExvb3BCbG9ja0luZGV4LCBtdXN0UmVhY2hCbG9ja3NJbkxvb3Ap
OworCisgICAgICAgIHVuc2lnbmVkIGhvaXN0ZWQgPSAwOworICAgICAgICAvLyBib29sIG1ldElu
bGluZSA9IGZhbHNlOworICAgICAgICB1bnNpZ25lZCBwcmVIZWFkZXJFbmRCZWZvcmVMSUNNID0g
cHJlSGVhZGVyQmxvY2suZW5kOworICAgICAgICB1bnNpZ25lZCBsYXN0QmVmb3JlSG9pc3QgPSBt
X2dyYXBoLnNpemUoKTsKKyAgICAgICAgTG9vcFNpZGVFZmZlY3RzIGxvb3BJbmZvKHByZUhlYWRl
ckluZGV4KTsKKyAgICAgICAgYW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyhtX2dyYXBoLm1fYmxvY2tz
W2ZpcnN0TG9vcEJsb2NrSW5kZXhdLT5iZWdpbiwgbV9ncmFwaC5tX2Jsb2Nrc1tsYXN0TG9vcEJs
b2NrSW5kZXhdLT5lbmQsIGxvb3BJbmZvKTsKKworICAgICAgICB3aGlsZSAoIW11c3RSZWFjaEJs
b2Nrc0luTG9vcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggYmxvY2tJbmRl
eCA9IG11c3RSZWFjaEJsb2Nrc0luTG9vcC5sYXN0KCk7CisgICAgICAgICAgICBtdXN0UmVhY2hC
bG9ja3NJbkxvb3AucmVtb3ZlTGFzdCgpOworCisjaWYgMAorICAgICAgICAgICAgLy8gRklYTUU6
IHJlY29uc2lkZXIgdGhpcyBsYXRlciB0byBiYWxhbmNlIHRoZSBleGVjdXRpb24gcGVyZm9ybWFu
Y2UgYW5kIGNvbXBpbGUgdGltZS4KKyAgICAgICAgICAgIGlmIChtZXRJbmxpbmUpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgZm9yIChtX2NvbXBpbGVJbmRl
eCA9IG1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmJlZ2luOyBtX2NvbXBpbGVJbmRleCA8
IG1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmVuZDsgKyttX2NvbXBpbGVJbmRleCkgewor
ICAgICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsKKwor
I2lmIDAKKyAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiB3ZSBtZWV0IGlubGluZWQgYm9k
aWVzIGluIHRoZSBsb29wLgorICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IElubGluZVN0
YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIG1ldElubGluZSA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAg
ICAgICAgaWYgKG5vZGUub3AgPT0gUGhpIHx8IG5vZGUub3AgPT0gRmx1c2gpIHsKKyAgICAgICAg
ICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxk
MSk7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9kZS5jaGlsZHJl
bi5maXhlZC5jaGlsZDIpOworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9u
KG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0g
R2V0TG9jYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RHZXRMb2NhbChsb29wSW5mbywg
aG9pc3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkR2VuZXJhdGUgPSBub2RlLnNob3VsZEdl
bmVyYXRlKCk7CisgICAgICAgICAgICAgICAgYm9vbCBjYW5Ib2lzdCA9IGhvaXN0ZWQgPCBNQVhf
SE9JU1RFRF9MT09QX0lOVkFSSUFOVFMgLSAxCisgICAgICAgICAgICAgICAgICAgICYmIGlzSG9p
c3RDYW5kaWRhdGUobm9kZSwgbG9vcEluZm8pOworCisgICAgICAgICAgICAgICAgLy8gTG9vayBv
bmUgc3RlcCBhaGVhZC4KKyAgICAgICAgICAgICAgICBpZiAobV9ncmFwaFttX2NvbXBpbGVJbmRl
eCArIDFdLm9wID09IFNldExvY2FsICYmIGxvb3BJbmZvLnBvbGx1dGVkTG9jYWxzLmNvbnRhaW5z
KG1fZ3JhcGhbbV9jb21waWxlSW5kZXggKyAxXS5sb2NhbCgpKSkKKyAgICAgICAgICAgICAgICAg
ICAgY2FuSG9pc3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgs
IDM+IGhvaXN0ZWRDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBjYW5Ib2lzdCAmPSBub2RlQ2Fu
QmVIb2lzdGVkKG5vZGUsIHByZUhlYWRlckJsb2NrLCBob2lzdGVkQ2hpbGRyZW4pOworCisgICAg
ICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBob2lzdCB0aGUgU2V0TG9jYWwgbm9kZSB3aGF0ZXZl
ci4KKyAgICAgICAgICAgICAgICBpZiAoIXNob3VsZEdlbmVyYXRlICYmIG5vZGUub3AgIT0gU2V0
TG9jYWwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyNpZiBERkdf
RU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgcHJpbnRm
KCIgICAlcyBAJXU6ICIsIEdyYXBoOjpvcE5hbWUobV9ncmFwaFttX2NvbXBpbGVJbmRleF0ub3Ap
LCBtX2NvbXBpbGVJbmRleCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmIChjYW5Ib2lz
dCkKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUhvaXN0KG1fY29tcGlsZUluZGV4LCBwcmVI
ZWFkZXJCbG9jaywgaG9pc3RlZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hvdWxkR2Vu
ZXJhdGUgJiYgIWhvaXN0ZWRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gVGhpcyBub2RlIGNhbm5vdCBiZSBob2lzdGVkIGJ1dCBpdCBjb250YWlucyBzb21lIHJl
ZmVyZW5jZXMgdG8gdGhlIGhvaXN0ZWQgbm9kZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIEFk
anVzdCBzdWNoIHJlZmVyZW5jZXMgYnkgdXRpbGl6aW5nIFNldExvY2FsL0dldExvY2FsIGZvciBj
cm9zcyBibG9jayByZWZlcmVuY2VzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgaG9pc3RlZENoaWxkcmVuLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgaGFuZGxlSG9pc3RlZENoaWxkKGJsb2NrSW5kZXgsIGhvaXN0ZWRDaGlsZHJlbltp
XSwgbG9vcEluZm8pOworICAgICAgICAgICAgICAgIH0KKworI2lmIERGR19FTkFCTEUoREVCVUdf
UFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisjZW5k
aWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChob2lzdGVkID4gMCkg
eworICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbcHJlSGVhZGVyRW5kQmVmb3JlTElDTSAtIDFd
Lm9wID09IEp1bXApOworICAgICAgICAgICAgbV9ncmFwaC5hcHBlbmQobV9ncmFwaFtwcmVIZWFk
ZXJFbmRCZWZvcmVMSUNNIC0gMV0pOworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChsYXN0QmVm
b3JlSG9pc3QsIHByZUhlYWRlckJsb2NrLmJlZ2luID09IGxhc3RCZWZvcmVIb2lzdCk7CisgICAg
ICAgICAgICBwcmVIZWFkZXJCbG9jay5lbmQgPSBtX2dyYXBoLnNpemUoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHZvaWQgbG9vcEludmFyaWFudENvZGVNb3Rpb24oKQorICAgIHsKKyNpZiBE
RkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiUGVy
Zm9ybWluZyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbjoiKTsKKyNlbmRpZgorICAgICAgICB1
bnNpZ25lZCBpID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fZ3JhcGgubV9sb29wUHJl
SGVhZGVyQmxvY2tzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgcGVyZm9ybUxJQ00obV9ncmFw
aC5tX2xvb3BQcmVIZWFkZXJCbG9ja3NbaV0pOworCisgICAgICAgIC8vIFNvbWUgUGhpIG5vZGVz
IG1heSBub3QgZ2V0IHVwZGF0ZWQgY2hpbGRyZW4gZm9yIG5vdy4KKyAgICAgICAgZm9yIChpID0g
bV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IG1fZ3JhcGgubV9vcmlnaW5hbFNpemU7
IGkrKykgeworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihtX2dyYXBoW2ldLmNoaWxk
cmVuLmZpeGVkLmNoaWxkMSk7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG1fZ3Jh
cGhbaV0uY2hpbGRyZW4uZml4ZWQuY2hpbGQyKTsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0
dXRpb24obV9ncmFwaFtpXS5jaGlsZHJlbi5maXhlZC5jaGlsZDMpOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gQ2xlYW4tdXAuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX3JlcGxhY2VtZW50
cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0gTm9Ob2RlOwog
ICAgIH0KICAgICAKICAgICB2b2lkIGFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycygpCkBAIC0xNjQ5
LDggKzIzNDIsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgcHJpbnRmKCJcbiIpOwogI2VuZGlmCiAg
ICAgICAgIFNjb3JlQm9hcmQgc2NvcmVCb2FyZChtX2dyYXBoLCBtX2dyYXBoLm1fcHJlc2VydmVk
VmFycyk7Ci0gICAgICAgIHVuc2lnbmVkIHNpemVFeGNsdWRpbmdQaGlOb2RlcyA9IG1fZ3JhcGgu
bV9ibG9ja3MubGFzdCgpLT5lbmQ7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6
ZUV4Y2x1ZGluZ1BoaU5vZGVzOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2dyYXBoLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBwaGkgbm9k
ZXMKKyAgICAgICAgICAgIGlmIChpID49IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQgJiYg
aSA8IG1fZ3JhcGgubV9vcmlnaW5hbFNpemUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisK
ICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2ldOwogICAgICAgICAKICAgICAgICAg
ICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKQpAQCAtMTcwMyw2ICsyMzk5LDggQEAgcHJp
dmF0ZToKICAgICAgICAgcHJpbnRmKCIgICBCbG9jayAjJXUgKGJjIyV1KTpcbiIsIGJsb2NrSW5k
ZXgsIGJsb2NrLT5ieXRlY29kZUJlZ2luKTsKICNlbmRpZgogICAgICAgICBzdGF0ZS5iZWdpbkJh
c2ljQmxvY2soYmxvY2spOworICAgICAgICBibG9jay0+Y2ZhU2hvdWxkUmV2aXNpdCA9IGZhbHNl
OworICAgICAgICBibG9jay0+Y2ZhSGFzVmlzaXRlZCA9IHRydWU7CiAjaWYgREZHX0VOQUJMRShE
RUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICBwcmludGYoIiAgICAgIGhlYWQgdmFy
czogIik7CiAgICAgICAgIGR1bXBPcGVyYW5kcyhibG9jay0+dmFsdWVzQXRIZWFkLCBzdGRvdXQp
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJ
VC5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
U3BlY3VsYXRpdmVKSVQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MjAsNyArOTIwLDggQEAgdm9p
ZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZU1vdkhpbnQoTm9kZQogdm9pZCBTcGVjdWxhdGl2ZUpJ
VDo6Y29tcGlsZShCYXNpY0Jsb2NrJiBibG9jaykKIHsKICAgICBBU1NFUlQobV9jb21waWxlT2th
eSk7Ci0gICAgQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKKyAgICAvLyBB
U1NFUlQobV9jb21waWxlSW5kZXggPT0gYmxvY2suYmVnaW4pOworICAgIG1fY29tcGlsZUluZGV4
ID0gYmxvY2suYmVnaW47CiAgICAgCiAgICAgaWYgKCFibG9jay5pc1JlYWNoYWJsZSkgewogICAg
ICAgICBtX2NvbXBpbGVJbmRleCA9IGJsb2NrLmVuZDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkocmV2aXNpb24gMTA2MzQz
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzcwOCw2ICszNzA4LDExIEBAIHNraXBfaWRfY3VzdG9tX3NlbGY6
CiAgICAgICAgIHZQQyArPSBPUENPREVfTEVOR1RIKG9wX2xvb3BfaGludCk7CiAgICAgICAgIE5F
WFRfSU5TVFJVQ1RJT04oKTsKICAgICB9CisgICAgREVGSU5FX09QQ09ERShvcF9sb29wX3ByZWhl
YWRlcikgeworICAgICAgICAvLyBUaGlzIGlzIGEgbm8tb3AgdW5sZXNzIHdlIGludGVuZCBvbiBk
b2luZyBPU1IgZnJvbSB0aGUgaW50ZXJwcmV0ZXIuCisgICAgICAgIHZQQyArPSBPUENPREVfTEVO
R1RIKG9wX2xvb3BfcHJlaGVhZGVyKTsKKyAgICAgICAgTkVYVF9JTlNUUlVDVElPTigpOworICAg
IH0KICAgICBERUZJTkVfT1BDT0RFKG9wX2xvb3BfaWZfdHJ1ZSkgewogICAgICAgICAvKiBsb29w
X2lmX3RydWUgY29uZChyKSB0YXJnZXQob2Zmc2V0KQogICAgICAgICAgCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L0pJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2ppdC9KSVQuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkwLDcgQEAgSklUOjpK
SVQoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhLCBDb2RlQgogI2Vsc2UKICAgICAsIG1fcmFuZG9t
R2VuZXJhdG9yKHN0YXRpY19jYXN0PHVuc2lnbmVkPihyYW5kb21OdW1iZXIoKSAqIDB4RkZGRkZG
RikpCiAjZW5kaWYKKyAgICAsIG1fbGFzdExvb3BQcmVIZWFkZXJPZmZzZXQoKHVuc2lnbmVkKS0x
KQogewogfQogCkBAIC0xMDIsNyArMTAzLDcgQEAgdm9pZCBKSVQ6OmVtaXRPcHRpbWl6YXRpb25D
aGVjayhPcHRpbWl6YQogICAgIEp1bXAgc2tpcE9wdGltaXplID0gYnJhbmNoQWRkMzIoU2lnbmVk
LCBUcnVzdGVkSW1tMzIoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBPcHRpb25zOjpl
eGVjdXRpb25Db3VudGVySW5jcmVtZW50Rm9yTG9vcCA6IE9wdGlvbnM6OmV4ZWN1dGlvbkNvdW50
ZXJJbmNyZW1lbnRGb3JSZXR1cm4pLCBBYnNvbHV0ZUFkZHJlc3MobV9jb2RlQmxvY2stPmFkZHJl
c3NPZkpJVEV4ZWN1dGVDb3VudGVyKCkpKTsKICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlz
LCBraW5kID09IExvb3BPcHRpbWl6YXRpb25DaGVjayA/IGN0aV9vcHRpbWl6ZV9mcm9tX2xvb3Ag
OiBjdGlfb3B0aW1pemVfZnJvbV9yZXQpOwogICAgIGlmIChraW5kID09IExvb3BPcHRpbWl6YXRp
b25DaGVjaykKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIobV9ieXRlY29kZU9m
ZnNldCkpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMihtX2xhc3RMb29wUHJl
SGVhZGVyT2Zmc2V0KSk7CiAgICAgc3R1YkNhbGwuY2FsbCgpOwogICAgIHNraXBPcHRpbWl6ZS5s
aW5rKHRoaXMpOwogfQpAQCAtMjkxLDYgKzI5Miw3IEBAIHZvaWQgSklUOjpwcml2YXRlQ29tcGls
ZU1haW5QYXNzKCkKICAgICAgICAgREVGSU5FX09QKG9wX2p0cnVlKQogICAgICAgICBERUZJTkVf
T1Aob3BfbG9vcCkKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaGludCkKKyAgICAgICAgREVG
SU5FX09QKG9wX2xvb3BfcHJlaGVhZGVyKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9s
ZXNzKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9sZXNzZXEpCiAgICAgICAgIERFRklO
RV9PUChvcF9sb29wX2lmX2dyZWF0ZXIpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0
L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmgJKHJl
dmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmgJKHdvcmtp
bmcgY29weSkKQEAgLTgyMSw2ICs4MjEsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgdm9p
ZCBlbWl0X29wX2p0cnVlKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29w
KEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2hpbnQoSW5zdHJ1Y3Rp
b24qKTsKKyAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9uKik7
CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3MoSW5zdHJ1Y3Rpb24qKTsKICAgICAg
ICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfbGVzc2VxKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZv
aWQgZW1pdF9vcF9sb29wX2lmX2dyZWF0ZXIoSW5zdHJ1Y3Rpb24qKTsKQEAgLTEwODksNiArMTA5
MCw3IEBAIG5hbWVzcGFjZSBKU0MgewogI2lmIEVOQUJMRShWQUxVRV9QUk9GSUxFUikKICAgICAg
ICAgYm9vbCBtX2NhbkJlT3B0aW1pemVkOwogI2VuZGlmCisgICAgICAgIHVuc2lnbmVkIG1fbGFz
dExvb3BQcmVIZWFkZXJPZmZzZXQ7CiAgICAgfSBKSVRfQ0xBU1NfQUxJR05NRU5UOwogCiAgICAg
aW5saW5lIHZvaWQgSklUOjplbWl0X29wX2xvb3AoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVj
dGlvbikKQEAgLTExMDIsNiArMTEwNCwxMSBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgZW1p
dE9wdGltaXphdGlvbkNoZWNrKExvb3BPcHRpbWl6YXRpb25DaGVjayk7CiAgICAgfQogCisgICAg
aW5saW5lIHZvaWQgSklUOjplbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9uKikKKyAg
ICB7CisgICAgICAgIG1fbGFzdExvb3BQcmVIZWFkZXJPZmZzZXQgPSBtX2J5dGVjb2RlT2Zmc2V0
OworICAgIH0KKwogICAgIGlubGluZSB2b2lkIEpJVDo6ZW1pdF9vcF9sb29wX2lmX3RydWUoSW5z
dHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKICAgICB7CiAgICAgICAgIGVtaXRUaW1lb3V0
Q2hlY2soKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124942</attachid>
            <date>2012-02-01 06:28:06 -0800</date>
            <delta_ts>2012-02-02 01:26:08 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.8.patch</filename>
            <type>text/plain</type>
            <size>54830</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgxIEBA
CisyMDEyLTAxLTMwICBZdXFpYW5nIFhpYW4gIDx5dXFpYW5nLnhpYW5AaW50ZWwuY29tPgorCisg
ICAgICAgIExvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGluIEpTQyBERkcKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzcwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV29yay1pbi1wcm9ncmVzcy4KKwor
ICAgICAgICBUaGUgZnJhbWV3b3JrIHRvIHN1cHBvcnQgbW92aW5nIGEgREZHIG5vZGUgKGFuZCB0
aGUgbm9kZXMgY2hhaW5lZCB3aXRoCisgICAgICAgIHJlZmVyZW5jZXMpIHRvIGEgZGlmZmVyZW50
IGJhc2ljIGJsb2NrIGlzIHN1cHBvc2VkIHRvIHdvcmssIGFzIHdlbGwgYXMKKyAgICAgICAgdGhl
IG1lY2hhbmlzbSB0byBzdXBwb3J0IGNyb3NzLWJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgIEEg
YmFzaWMgYmxvY2sgZG9taW5hbmNlIGFuYWx5c2lzIGFsZ29yaXRobSBpcyBpbnRyb2R1Y2VkIHRv
IGRldGVybWluZQorICAgICAgICB3aGljaCBsb29wIGJsb2NrcyBzaG91bGQgYmUgY29uc2lkZXJl
ZCBmb3IgY29kZSBtb3Rpb246IHRoZSBibG9ja3MKKyAgICAgICAgdGhhdCBkb21pbmF0ZSB0aGUg
bG9vcCBleGl0LgorICAgICAgICBUaGUgT1NSIGVudHJ5IGlzIG1vZGlmaWVkLiBUaGVyZSdzIGEg
ZGVkaWNhdGVkIGxvb3AgcHJlaGVhZGVyIGJsb2NrIGFzCisgICAgICAgIHRoZSBPU1IgZW50cnku
CisgICAgICAgIFNpZGUgZWZmZWN0cyBhbmFseXNpcyBvZiBhIGxvb3AgaXMgcGVyZm9ybWVkIHRv
IGZpbmQgb3V0IGlmIHRoZXJlJ3JlCisgICAgICAgIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8g
dGhlIHByb3BlcnRpZXMgb3IgdGhlIHN0cnVjdHVyZXMsIGFuZCBpZgorICAgICAgICB0aGVyZSdy
ZSBwb3NzaWJsZSBtb2RpZmljYXRpb25zIHRvIHRoZSBsb2NhbCBvciB0aGUgZ2xvYmFsIHZhcmlh
YmxlcywKKyAgICAgICAgdG8gaGVscCB1cyBtb3JlIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHdoZXRo
ZXIgYSBERkcgbm9kZSBpcyBpbmRlZWQgbG9vcAorICAgICAgICBpbnZhcmlhbnQgb3Igbm90Lgor
CisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJs
b2NrOjpkdW1wKToKKyAgICAgICAgKiBieXRlY29kZS9PcGNvZGUuaDoKKyAgICAgICAgKiBieXRl
Y29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdl
bmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5oOgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3Bw
OgorICAgICAgICAoSlNDOjpEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpT
Qzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JOb2RlOjplbWl0
Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAg
ICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkFic3Ry
YWN0U3RhdGU6Om1lcmdlU3RhdGVBdFRhaWwpOgorICAgICAgICAoSlNDOjpERkc6OkFic3RyYWN0
U3RhdGU6Om1lcmdlVmFyaWFibGVCZXR3ZWVuQmxvY2tzKToKKyAgICAgICAgKiBkZmcvREZHQnl0
ZUNvZGVQYXJzZXIuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUJsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2UpOgorICAg
ICAgICAqIGRmZy9ERkdDYXBhYmlsaXRpZXMuaDoKKyAgICAgICAgKEpTQzo6REZHOjpjYW5Db21w
aWxlT3Bjb2RlKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpkdW1wKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguaDoKKyAgICAgICAgKiBk
ZmcvREZHTm9kZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OnNldFZhcmlhYmxlQWNjZXNz
RGF0YSk6CisgICAgICAgICogZGZnL0RGR1Byb3BhZ2F0b3IuY3BwOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6OmZpeHBvaW50KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
Ojpwcm9wYWdhdGVOb2RlUHJlZGljdGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OnBlcmZvcm1TdWJzdGl0dXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6
OmxvY2FsQ1NFKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjppc0hvaXN0Q2FuZGlk
YXRlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpub2RlQ2FuQmVIb2lzdGVkKToK
KyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpyZWZlcmVuY2VNYXlCZVNraXBwZWROb2Rl
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtSG9pc3QpOgorICAgICAg
ICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnZhcmlhYmxlRGVmaW5lZEluTG9vcCk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6aG9pc3RHZXRMb2NhbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkV2l0aFNldExvY2FsKToKKyAgICAgICAgKEpT
Qzo6REZHOjpQcm9wYWdhdG9yOjpmaXhIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6
OlByb3BhZ2F0b3I6OmhhbmRsZUhvaXN0ZWRDaGlsZCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJv
cGFnYXRvcjo6aW50ZXJzZWN0KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpjb21w
dXRlRG9taW5hdG9ycyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUxJ
Q00pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Omxvb3BJbnZhcmlhbnRDb2RlTW90
aW9uKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjphbGxvY2F0ZVZpcnR1YWxSZWdp
c3RlcnMpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAqIGludGVycHJldGVy
L0ludGVycHJldGVyLmNwcDoKKyAgICAgICAgKEpTQzo6SW50ZXJwcmV0ZXI6OnByaXZhdGVFeGVj
dXRlKToKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAgICAgKEpTQzo6SklUOjpKSVQpOgor
ICAgICAgICAoSlNDOjpKSVQ6OmVtaXRPcHRpbWl6YXRpb25DaGVjayk6CisgICAgICAgIChKU0M6
OkpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcyk6CisgICAgICAgICogaml0L0pJVC5oOgorICAg
ICAgICAoSlNDOjpKSVQ6OmVtaXRfb3BfbG9vcF9oaW50KToKKyAgICAgICAgKEpTQzo6SklUOjpl
bWl0X29wX2xvb3BfcHJlaGVhZGVyKToKKwogMjAxMi0wMS0zMCAgT2xpdmVyIEh1bnQgIDxvbGl2
ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIGdldF9ieV92YWxfYXJndW1lbnRzIGlzIGJyb2tlbiBp
biB0aGUgaW50ZXJwcmV0ZXIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9D
b2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA5NCw3ICsxMDk0
LDEyIEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wKEV4ZWNTdGF0ZSogZXhlYywgY28KICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Ugb3BfbG9vcF9oaW50OiB7Ci0gICAg
ICAgICAgICBwcmludGYoIlslNGRdIGxvb3BfaGludFxuIiwgbG9jYXRpb24pOworICAgICAgICAg
ICAgaW50IG9mZnNldCA9ICgrK2l0KS0+dS5vcGVyYW5kOworICAgICAgICAgICAgcHJpbnRmKCJb
JTRkXSBsb29wX2hpbnRcdFx0IHByZUhlYWRlcigtPiVkKVxuIiwgbG9jYXRpb24sIGxvY2F0aW9u
ICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
b3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIHByaW50ZigiWyU0ZF0gbG9vcF9wcmVo
ZWFkZXJcbiIsIGxvY2F0aW9uKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAg
ICAgIGNhc2Ugb3Bfc3dpdGNoX2ltbTogewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9PcGNvZGUuaAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb2RlL09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNTYsNyArMTU2LDggQEAgbmFt
ZXNwYWNlIEpTQyB7CiAgICAgICAgIG1hY3JvKG9wX2xvb3BfaWZfbGVzc2VxLCA0KSBcCiAgICAg
ICAgIG1hY3JvKG9wX2xvb3BfaWZfZ3JlYXRlciwgNCkgXAogICAgICAgICBtYWNybyhvcF9sb29w
X2lmX2dyZWF0ZXJlcSwgNCkgXAotICAgICAgICBtYWNybyhvcF9sb29wX2hpbnQsIDEpIFwKKyAg
ICAgICAgbWFjcm8ob3BfbG9vcF9oaW50LCAyKSBcCisgICAgICAgIG1hY3JvKG9wX2xvb3BfcHJl
aGVhZGVyLCAxKSBcCiAgICAgICAgIG1hY3JvKG9wX3N3aXRjaF9pbW0sIDQpIFwKICAgICAgICAg
bWFjcm8ob3Bfc3dpdGNoX2NoYXIsIDQpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX3N0cmlu
ZywgNCkgXApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29k
ZUdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC02NzksMTAgKzY3OSwxOSBAQCBWYWx1ZVByb2ZpbGUqIEJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0UHJvCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBCeXRlY29kZUdl
bmVyYXRvcjo6ZW1pdExvb3BIaW50KCkKK3ZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29w
SGludChMYWJlbCogcHJlSGVhZGVyKQogewogI2lmIEVOQUJMRShERkdfSklUKQorICAgIHNpemVf
dCBiZWdpbiA9IGluc3RydWN0aW9ucygpLnNpemUoKTsKICAgICBlbWl0T3Bjb2RlKG9wX2xvb3Bf
aGludCk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByZUhlYWRlci0+YmluZChiZWdpbiwg
aW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKSk7CisjZW5kaWYKK30KKwordm9pZCBCeXRlY29kZUdlbmVy
YXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIoKQoreworI2lmIEVOQUJMRShERkdfSklUKQorICAgIGVt
aXRPcGNvZGUob3BfbG9vcF9wcmVoZWFkZXIpOwogI2VuZGlmCiB9CiAKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmgJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGls
ZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzQ1LDcgKzM0NSw4IEBA
IG5hbWVzcGFjZSBKU0MgewogICAgICAgICB2b2lkIGVtaXRUb1ByaW1pdGl2ZShSZWdpc3RlcklE
KiBkc3QsIFJlZ2lzdGVySUQqIHNyYyk7CiAKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1p
dExhYmVsKExhYmVsKik7Ci0gICAgICAgIHZvaWQgZW1pdExvb3BIaW50KCk7CisgICAgICAgIHZv
aWQgZW1pdExvb3BIaW50KExhYmVsKiBwcmVIZWFkZXIpOworICAgICAgICB2b2lkIGVtaXRMb29w
UHJlSGVhZGVyKCk7CiAgICAgICAgIFBhc3NSZWZQdHI8TGFiZWw+IGVtaXRKdW1wKExhYmVsKiB0
YXJnZXQpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBlbWl0SnVtcElmVHJ1ZShSZWdpc3Rl
cklEKiBjb25kLCBMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1p
dEp1bXBJZkZhbHNlKFJlZ2lzdGVySUQqIGNvbmQsIExhYmVsKiB0YXJnZXQpOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNw
cAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxl
ci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTMwLDkgKzE1MzAsMTMgQEAg
UmVnaXN0ZXJJRCogRG9XaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeQogewogICAgIFJlZlB0cjxM
YWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVsU2NvcGU6Okxv
b3ApOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xh
YmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsKKyAg
ICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKKwogICAgIFJlZlB0cjxMYWJlbD4gdG9w
T2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0
b3BPZkxvb3AuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsKKyAgICBnZW5l
cmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5l
bWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUo
KSk7CiAgICAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXRO
b2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwpAQCAtMTU1NiwxNSArMTU2MCwxOCBAQCBSZWdpc3RlcklE
KiBXaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiB7CiAgICAgUmVmUHRyPExhYmVsU2NvcGU+
IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TG9vcCk7CiAKKyAg
ICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAg
ICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIuZ2V0KCkpOworICAgIGdlbmVyYXRv
ci5lbWl0TG9vcFByZUhlYWRlcigpOwogICAgIGdlbmVyYXRvci5lbWl0SnVtcChzY29wZS0+Y29u
dGludWVUYXJnZXQoKSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRv
ci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsK
LSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KCk7Ci0gICAgCisKICAgICBnZW5lcmF0b3IuZW1p
dE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7CiAKICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3Bl
LT5jb250aW51ZVRhcmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVI
ZWFkZXIuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3Rh
dGVtZW50LCBtX2V4cHItPmxpbmVObygpLCBtX2V4cHItPmxpbmVObygpKTsKIAogICAgIGlmICht
X2V4cHItPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkpCkBAIC0xNTkxLDEyICsxNTk4LDE1
IEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY28KICAgICBpZiAobV9l
eHByMSkKICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0
KCksIG1fZXhwcjEpOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJh
dG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdl
dCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKKwogICAgIFJlZlB0cjxM
YWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVt
aXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9wT2ZMb29w
LmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KCk7CiAKICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwog
CkBAIC0xNjA2LDYgKzE2MTYsNyBAQCBSZWdpc3RlcklEKiBGb3JOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvCiAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShnZW5lcmF0b3IuaWdub3JlZFJlc3Vs
dCgpLCBtX2V4cHIzKTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoY29uZGl0aW9uLmdldCgp
KTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwogICAg
IGlmIChtX2V4cHIyKSB7CiAgICAgICAgIGlmIChtX2V4cHIyLT5oYXNDb25kaXRpb25Db250ZXh0
Q29kZWdlbigpKQogICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlSW5Db25kaXRpb25Db250
ZXh0KG1fZXhwcjIsIHRvcE9mTG9vcC5nZXQoKSwgc2NvcGUtPmJyZWFrVGFyZ2V0KCksIGZhbHNl
KTsKQEAgLTE2NDAsMTEgKzE2NTEsMTQgQEAgUmVnaXN0ZXJJRCogRm9ySW5Ob2RlOjplbWl0Qnl0
ZWNvZGUoQnl0ZQogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzaXplID0gZ2VuZXJhdG9yLm5ld1Rl
bXBvcmFyeSgpOwogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBleHBlY3RlZFN1YnNjcmlwdDsKICAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gaXRlciA9IGdlbmVyYXRvci5lbWl0R2V0UHJvcGVydHlOYW1l
cyhnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGJhc2UuZ2V0KCksIGkuZ2V0KCksIHNpemUuZ2V0
KCksIHNjb3BlLT5icmVha1RhcmdldCgpKTsKKworICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhl
YWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9v
cFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CiAg
ICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsKIAogICAgIFJl
ZlB0cjxMYWJlbD4gbG9vcFN0YXJ0ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJh
dG9yLmVtaXRMYWJlbChsb29wU3RhcnQuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0TG9vcEhp
bnQoKTsKIAogICAgIFJlZ2lzdGVySUQqIHByb3BlcnR5TmFtZTsKICAgICBib29sIG9wdGltaXpl
ZEZvcmluQWNjZXNzID0gZmFsc2U7CkBAIC0xNjkwLDYgKzE3MDQsNyBAQCBSZWdpc3RlcklEKiBG
b3JJbk5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiAgICAgICAgIGdlbmVyYXRvci5wb3BPcHRpbWlz
ZWRGb3JJbigpOwogCiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+Y29udGludWVUYXJn
ZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludChsb29wUHJlSGVhZGVyLmdldCgpKTsK
ICAgICBnZW5lcmF0b3IuZW1pdE5leHRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lLCBiYXNlLmdl
dCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBpdGVyLmdldCgpLCBsb29wU3RhcnQuZ2V0KCkpOwog
ICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExp
bmUoKSwgbGFzdExpbmUoKSk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+YnJlYWtU
YXJnZXQoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3Rh
dGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJh
Y3RTdGF0ZS5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkyLDggKzkyLDYgQEAg
dm9pZCBBYnN0cmFjdFN0YXRlOjpiZWdpbkJhc2ljQmxvY2soQmFzaQogICAgICAgICB9CiAgICAg
fQogICAgIAotICAgIGJhc2ljQmxvY2stPmNmYVNob3VsZFJldmlzaXQgPSBmYWxzZTsKLSAgICBi
YXNpY0Jsb2NrLT5jZmFIYXNWaXNpdGVkID0gdHJ1ZTsKICAgICBtX2Jsb2NrID0gYmFzaWNCbG9j
azsKICAgICBtX2lzVmFsaWQgPSB0cnVlOwogfQpAQCAtOTM2LDE1ICs5MzQsMjAgQEAgaW5saW5l
IGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VAogICAgICAgICAKICAgICBBYnN0cmFj
dFZhbHVlKiBzb3VyY2U7CiAgICAgICAgIAotICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW25vZGVJ
bmRleF07Ci0gICAgaWYgKCFub2RlLnJlZkNvdW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBOb2RlKiBub2RlUHRyID0gJm1fZ3JhcGhbbm9kZUluZGV4XTsKKyAgICBpZiAoIW5vZGVQ
dHItPnJlZkNvdW50KCkpIHsKKyAgICAgICAgaWYgKG5vZGVQdHItPm9wID09IEdldExvY2FsKSB7
CisgICAgICAgICAgICBBU1NFUlQobm9kZVB0ci0+Y2hpbGQxKCkgIT0gTm9Ob2RlKTsKKyAgICAg
ICAgICAgIG5vZGVQdHIgPSAmbV9ncmFwaFtub2RlUHRyLT5jaGlsZDEoKV07CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAKICNpZiBERkdfRU5B
QkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgICAgICBwcmludGYoIiAgICAg
ICAgICBJdCdzIGxpdmUsIG5vZGUgQCV1LlxuIiwgbm9kZUluZGV4KTsKICNlbmRpZgogCi0gICAg
c3dpdGNoIChub2RlLm9wKSB7CisgICAgc3dpdGNoIChub2RlUHRyLT5vcCkgewogICAgIGNhc2Ug
UGhpOgogICAgIGNhc2UgU2V0QXJndW1lbnQ6CiAgICAgY2FzZSBGbHVzaDoKQEAgLTk2Niw3ICs5
NjksNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVN0YXRlQXRUCiAgICAgY2Fz
ZSBTZXRMb2NhbDoKICAgICAgICAgLy8gVGhlIGJsb2NrIHNldHMgdGhlIHZhcmlhYmxlLCBhbmQg
cG90ZW50aWFsbHkgcmVmaW5lcyBpdCwgYm90aAogICAgICAgICAvLyBiZWZvcmUgYW5kIGFmdGVy
IHNldHRpbmcgaXQuCi0gICAgICAgIHNvdXJjZSA9ICZmb3JOb2RlKG5vZGUuY2hpbGQxKCkpOwor
ICAgICAgICBzb3VyY2UgPSAmZm9yTm9kZShub2RlUHRyLT5jaGlsZDEoKSk7CiAjaWYgREZHX0VO
QUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICBwcmludGYoIiAgICAgICAg
ICBTZXR0aW5nLlxuIik7CiAjZW5kaWYKQEAgLTEwNDcsMTEgKzEwNTAsMTEgQEAgaW5saW5lIGJv
b2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VUb1N1Y2NlcwogCiBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0
YXRlOjptZXJnZVZhcmlhYmxlQmV0d2VlbkJsb2NrcyhBYnN0cmFjdFZhbHVlJiBkZXN0aW5hdGlv
biwgQWJzdHJhY3RWYWx1ZSYgc291cmNlLCBOb2RlSW5kZXggZGVzdGluYXRpb25Ob2RlSW5kZXgs
IE5vZGVJbmRleCBzb3VyY2VOb2RlSW5kZXgpCiB7Ci0gICAgaWYgKGRlc3RpbmF0aW9uTm9kZUlu
ZGV4ID09IE5vTm9kZSkKKyAgICAvLyBGSVhNRTogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzb3Vy
Y2UgaXMgTm9Ob2RlIGJ1dCB0aGUgZGVzdCBpc24ndCwKKyAgICAvLyBiZWNhdXNlIHdlIGRpZCBM
SUNNIGFuZCB0aGUgZGVzdCBpcyBpbiBhIGxvb3AgcHJlSGVhZGVyLgorICAgIGlmIChkZXN0aW5h
dGlvbk5vZGVJbmRleCA9PSBOb05vZGUgfHwgc291cmNlTm9kZUluZGV4ID09IE5vTm9kZSkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIAotICAgIEFTU0VSVF9VTlVTRUQoc291cmNlTm9kZUlu
ZGV4LCBzb3VyY2VOb2RlSW5kZXggIT0gTm9Ob2RlKTsKLSAgICAKICAgICAvLyBGSVhNRTogV2Ug
Y291bGQgZG8gc29tZSBzcGFyc2UgY29uZGl0aW9uYWwgcHJvcGFnYXRpb24gaGVyZSEKICAgICAK
ICAgICByZXR1cm4gZGVzdGluYXRpb24ubWVyZ2Uoc291cmNlKTsKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCShyZXZpc2lvbiAxMDYz
NDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjE2Miw3ICsyMTYyLDE3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6
OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ugb3BfbG9vcF9o
aW50OiB7Ci0gICAgICAgICAgICAvLyBCYXNlbGluZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxv
b3AgaGludHMuIFRoZSBERkcgYXNzdW1lcyB0aGF0IEJhc2VsaW5lLT5ERkcKKyAgICAgICAgICAg
IEFTU0VSVF9VTlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdpbik7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEVtaXQgYSBwaGFudG9tIG5vZGUgdG8gZW5z
dXJlIHRoYXQgdGhlcmUgaXMgYSBwbGFjZWhvbGRlciBub2RlIGZvciB0aGlzIGJ5dGVjb2RlCisg
ICAgICAgICAgICAvLyBvcC4KKyAgICAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2xvb3BfaGludCk7CisgICAgICAg
IH0KKworICAgICAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOiB7CisgICAgICAgICAgICAvLyBC
YXNlbGluZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxvb3AgcHJlaGVhZGVycy4gVGhlIERGRyBh
c3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRwogICAgICAgICAgICAgLy8gT1NSIGNhbiBvbmx5IGhh
cHBlbiBhdCBiYXNpYyBibG9jayBib3VuZGFyaWVzLiBBc3NlcnQgdGhhdCB0aGVzZSB0d28gc3Rh
dGVtZW50cwogICAgICAgICAgICAgLy8gYXJlIGNvbXBhdGlibGUuCiAgICAgICAgICAgICBBU1NF
UlRfVU5VU0VEKGJsb2NrQmVnaW4sIG1fY3VycmVudEluZGV4ID09IGJsb2NrQmVnaW4pOwpAQCAt
MjE3Nyw3ICsyMTg3LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25l
ZAogICAgICAgICAgICAgLy8gb3AuCiAgICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20pOwog
ICAgICAgICAgICAgCi0gICAgICAgICAgICBORVhUX09QQ09ERShvcF9sb29wX2hpbnQpOworICAg
ICAgICAgICAgbV9ncmFwaC5tX2xvb3BQcmVIZWFkZXJCbG9ja3MuYXBwZW5kKG1fZ3JhcGgubV9i
bG9ja3Muc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBORVhUX09QQ09ERShvcF9sb29wX3ByZWhl
YWRlcik7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtMjYwOCw2ICsyNjE5LDcg
QEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2UoKQogICAgIG1fZ3JhcGgubV9wcmVzZXJ2ZWRW
YXJzID0gbV9wcmVzZXJ2ZWRWYXJzOwogICAgIG1fZ3JhcGgubV9sb2NhbFZhcnMgPSBtX251bUxv
Y2FsczsKICAgICBtX2dyYXBoLm1fcGFyYW1ldGVyU2xvdHMgPSBtX3BhcmFtZXRlclNsb3RzOwor
ICAgIG1fZ3JhcGgubV9vcmlnaW5hbFNpemUgPSBtX2dyYXBoLnNpemUoKTsKIAogICAgIHJldHVy
biB0cnVlOwogfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRp
ZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxp
dGllcy5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0NhcGFiaWxpdGllcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzAsNiArMTMwLDcgQEAgaW5saW5l
IGJvb2wgY2FuQ29tcGlsZU9wY29kZShPcGNvZGVJRCBvcAogICAgIGNhc2Ugb3Bfam5ncmVhdGVy
OgogICAgIGNhc2Ugb3Bfam5ncmVhdGVyZXE6CiAgICAgY2FzZSBvcF9sb29wX2hpbnQ6CisgICAg
Y2FzZSBvcF9sb29wX3ByZWhlYWRlcjoKICAgICBjYXNlIG9wX2xvb3BfaWZfbGVzczoKICAgICBj
YXNlIG9wX2xvb3BfaWZfbGVzc2VxOgogICAgIGNhc2Ugb3BfbG9vcF9pZl9ncmVhdGVyOgpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHJldmlzaW9uIDEwNjM0MykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMjYsNyArMTI2LDcgQEAgdm9pZCBHcmFwaDo6ZHVtcChOb2RlSW5kZXggbm9kZUluZGV4
LCBDbwogCiAgICAgdW5zaWduZWQgcmVmQ291bnQgPSBub2RlLnJlZkNvdW50KCk7CiAgICAgYm9v
bCBza2lwcGVkID0gIXJlZkNvdW50OwotICAgIGJvb2wgbXVzdEdlbmVyYXRlID0gbm9kZS5tdXN0
R2VuZXJhdGUoKTsKKyAgICBib29sIG11c3RHZW5lcmF0ZSA9IHJlZkNvdW50ICYmIG5vZGUubXVz
dEdlbmVyYXRlKCk7CiAgICAgaWYgKG11c3RHZW5lcmF0ZSkgewogICAgICAgICBBU1NFUlQocmVm
Q291bnQpOwogICAgICAgICAtLXJlZkNvdW50OwpAQCAtMjk0LDcgKzI5NCw3IEBAIHZvaWQgR3Jh
cGg6OmR1bXAoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiAgICAgICAgIHByaW50ZigiXG4iKTsKICAg
ICB9CiAgICAgcHJpbnRmKCJQaGkgTm9kZXM6XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9i
bG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBzaXplKCk7ICsraSkKKyAgICBmb3IgKHNpemVfdCBpID0g
bV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBtX29yaWdpbmFsU2l6ZTsgKytpKQogICAgICAgICBk
dW1wKGksIGNvZGVCbG9jayk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHR3JhcGguaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dy
YXBoLmgJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
R3JhcGguaAkod29ya2luZyBjb3B5KQpAQCAtMjM5LDYgKzIzOSw3IEBAIHB1YmxpYzoKICAgICB9
CiAKICAgICBWZWN0b3I8IE93blB0cjxCYXNpY0Jsb2NrPiAsIDg+IG1fYmxvY2tzOworICAgIFZl
Y3RvcjxCbG9ja0luZGV4LCA4PiBtX2xvb3BQcmVIZWFkZXJCbG9ja3M7CiAgICAgVmVjdG9yPE5v
ZGVJbmRleCwgMTY+IG1fdmFyQXJnQ2hpbGRyZW47CiAgICAgVmVjdG9yPFN0b3JhZ2VBY2Nlc3NE
YXRhPiBtX3N0b3JhZ2VBY2Nlc3NEYXRhOwogICAgIFZlY3RvcjxSZXNvbHZlR2xvYmFsRGF0YT4g
bV9yZXNvbHZlR2xvYmFsRGF0YTsKQEAgLTI0OSw2ICsyNTAsNyBAQCBwdWJsaWM6CiAgICAgQml0
VmVjdG9yIG1fcHJlc2VydmVkVmFyczsKICAgICB1bnNpZ25lZCBtX2xvY2FsVmFyczsKICAgICB1
bnNpZ25lZCBtX3BhcmFtZXRlclNsb3RzOworICAgIHVuc2lnbmVkIG1fb3JpZ2luYWxTaXplOyAv
LyBUaGUgZ3JhcGggc2l6ZSBiZWZvcmUgd2UgZG8gb3B0aW1pemF0aW9ucyB3aGljaCB3aWxsIGV4
cGFuZCB0aGUgZ3JhcGguCiBwcml2YXRlOgogICAgIAogICAgIC8vIFdoZW4gYSBub2RlJ3MgcmVm
Q291bnQgZ29lcyBmcm9tIDAgdG8gMSwgaXQgbXVzdCAobG9naWNhbGx5KSByZWN1cnNpdmVseSBy
ZWYgYWxsIG9mIGl0cyBjaGlsZHJlbiwgYW5kIHZpY2UgdmVyc2EuCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtpbmcgY29weSkK
QEAgLTMyMSwxNCArMzIxLDE0IEBAIHB1YmxpYzoKICAgICAgICAgLy8gdmFsdWUgb2YgKE5vbmUs
IFtdKS4gQnV0IHRoZSBvbGQgSklUIG1heSBzdGFzaCBzb21lIHZhbHVlcyB0aGVyZS4gU28gd2Ug
cmVhbGx5CiAgICAgICAgIC8vIG5lZWQgKFRvcCwgVE9QKS4KICAgICAgICAgZm9yIChzaXplX3Qg
YXJndW1lbnQgPSAwOyBhcmd1bWVudCA8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLm51bWJl
ck9mQXJndW1lbnRzKCk7ICsrYXJndW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChiYXNpY0Jsb2Nr
LnZhcmlhYmxlc0F0SGVhZC5hcmd1bWVudChhcmd1bWVudCkgPT0gTm9Ob2RlKQorICAgICAgICAg
ICAgaWYgKCFiYXNpY0Jsb2NrLmNmYUhhc1Zpc2l0ZWQgfHwgYmFzaWNCbG9jay52YXJpYWJsZXNB
dEhlYWQuYXJndW1lbnQoYXJndW1lbnQpID09IE5vTm9kZSkKICAgICAgICAgICAgICAgICBlbnRy
eS0+bV9leHBlY3RlZFZhbHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgpOwogICAgICAg
ICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNpY0Jsb2NrLnZh
cmlhYmxlc0F0SGVhZC5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CiAgICAgICAgICAgICBO
b2RlSW5kZXggbm9kZUluZGV4ID0gYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwobG9j
YWwpOwotICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSBOb05vZGUpCisgICAgICAgICAgICBp
ZiAoIWJhc2ljQmxvY2suY2ZhSGFzVmlzaXRlZCB8fCBub2RlSW5kZXggPT0gTm9Ob2RlKQogICAg
ICAgICAgICAgICAgIGVudHJ5LT5tX2V4cGVjdGVkVmFsdWVzLmxvY2FsKGxvY2FsKS5tYWtlVG9w
KCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChtX2dyYXBoW25vZGVJbmRleF0udmFyaWFibGVBY2Nl
c3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKQorICAgICAgICAgICAgaWYgKG5vZGVJ
bmRleCAhPSBOb05vZGUgJiYgbV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNjZXNzRGF0YSgp
LT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9sb2Nh
bHNGb3JjZWREb3VibGUuc2V0KGxvY2FsKTsKICAgICAgICAgfQogI2Vsc2UKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDk5LDYgKzQ5OSwx
MiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIHJldHVybiB2YXJpYWJsZUFjY2Vzc0RhdGEoKS0+
bG9jYWwoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldFZhcmlhYmxlQWNjZXNzRGF0YSh2b2lkKiBk
YXRhKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGhhc1ZhcmlhYmxlQWNjZXNzRGF0YSgpKTsKKyAg
ICAgICAgbV9vcEluZm8gPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGF0YSk7CisgICAg
fQorCiAjaWZuZGVmIE5ERUJVRwogICAgIGJvb2wgaGFzSWRlbnRpZmllcigpCiAgICAgewpAQCAt
MTAzNSw3ICsxMDQxLDcgQEAgc3RydWN0IE5vZGUgewogICAgIHsKICAgICAgICAgcmV0dXJuIG5v
ZGVDYW5TcGVjdWxhdGVJbnRlZ2VyKGFyaXRoTm9kZUZsYWdzKCkpOwogICAgIH0KLSAgICAKKwog
I2lmbmRlZiBOREVCVUcKICAgICB2b2lkIGR1bXBDaGlsZHJlbihGSUxFKiBvdXQpCiAgICAgewpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQcm9wYWdhdG9yLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCShyZXZp
c2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3Iu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3NSwxMyBAQCBwdWJsaWM6CiAgICAgICAgIG1f
Z3JhcGguZHVtcChtX2NvZGVCbG9jayk7CiAjZW5kaWYKIAorICAgICAgICBsb29wSW52YXJpYW50
Q29kZU1vdGlvbigpOworCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NF
KQorICAgICAgICBwcmludGYoIkdyYXBoIGFmdGVyIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9u
OlxuIik7CisgICAgICAgIG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7CisjZW5kaWYKKwogICAg
ICAgICBhbGxvY2F0ZVZpcnR1YWxSZWdpc3RlcnMoKTsKIAogI2lmIERGR19FTkFCTEUoREVCVUdf
UFJPUEFHQVRJT05fVkVSQk9TRSkKQEAgLTI4OSw3ICsyOTYsNyBAQCBwcml2YXRlOgogICAgIAog
ICAgIHZvaWQgcHJvcGFnYXRlTm9kZVByZWRpY3Rpb25zKE5vZGUmIG5vZGUpCiAgICAgewotICAg
ICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgaWYgKCFub2RlLnNob3Vs
ZEdlbmVyYXRlKCkgJiYgbm9kZS5vcCAhPSBTZXRMb2NhbCkKICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgCiAgICAgICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKQEAgLTExMDEsNiArMTEw
OCwxMyBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQp
ICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCk7CiAgICAgfQogICAgIAorICAgIGJvb2wgY29t
cGFyZUVxSXNQdXJlKE5vZGUmIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gaXNQcmVkaWN0
ZWROdW1lcmljYWwobm9kZSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0ZUZp
bmFsT2JqZWN0KG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0p
CisgICAgICAgICAgICB8fCBOb2RlOjpzaG91bGRTcGVjdWxhdGVBcnJheShtX2dyYXBoW25vZGUu
Y2hpbGQxKCldLCBtX2dyYXBoW25vZGUuY2hpbGQyKCldKTsKKyAgICB9CisKICAgICBib29sIGxv
Z2ljYWxOb3RJc1B1cmUoTm9kZSYgbm9kZSkKICAgICB7CiAgICAgICAgIFByZWRpY3RlZFR5cGUg
cHJlZGljdGlvbiA9IG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpOwpAQCAtMTEy
OCw4ICsxMTQyLDkgQEAgcHJpdmF0ZToKICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgogICAg
ICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6
Ci0gICAgICAgIGNhc2UgQ29tcGFyZUVxOgogICAgICAgICAgICAgcmV0dXJuICFpc1ByZWRpY3Rl
ZE51bWVyaWNhbChub2RlKTsKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICBy
ZXR1cm4gIWNvbXBhcmVFcUlzUHVyZShub2RlKTsKICAgICAgICAgY2FzZSBMb2dpY2FsTm90Ogog
ICAgICAgICAgICAgcmV0dXJuICFsb2dpY2FsTm90SXNQdXJlKG5vZGUpOwogICAgICAgICBjYXNl
IEdldEJ5VmFsOgpAQCAtMTQyMyw3ICsxNDM4LDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBlcmZv
cm1TdWJzdGl0dXRpb24oTm9kZUluZGV4JiBjaGlsZCwgYm9vbCBhZGRSZWYgPSB0cnVlKQogICAg
IHsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYW5kIGlzIGFjdHVhbGx5IHVudXNlZC4K
LSAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSkKKyAgICAgICAgaWYgKGNoaWxkID09IE5vTm9k
ZSB8fCBjaGlsZCA+PSBtX3JlcGxhY2VtZW50cy5zaXplKCkpCiAgICAgICAgICAgICByZXR1cm47
CiAgICAgICAgIAogICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcmVwbGFjZW1lbnQu
CkBAIC0xNDM1LDEwICsxNDUwLDEwIEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICAvLyBU
aGVyZSBpcyBkZWZpbml0ZWx5IGEgcmVwbGFjZW1lbnQuIEFzc2VydCB0aGF0IHRoZSByZXBsYWNl
bWVudCBkb2VzIG5vdAogICAgICAgICAvLyBoYXZlIGEgcmVwbGFjZW1lbnQuCi0gICAgICAgIEFT
U0VSVChtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNo
aWxkID49IG1fcmVwbGFjZW1lbnRzLnNpemUoKSB8fCBtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0g
Tm9Ob2RlKTsKICAgICAgICAgCiAgICAgICAgIGlmIChhZGRSZWYpCi0gICAgICAgICAgICBtX2dy
YXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgICAgIHJlZmVyZW5jZU1heUJlU2tpcHBlZE5vZGUo
Y2hpbGQpOwogICAgIH0KICAgICAKICAgICB2b2lkIHNldFJlcGxhY2VtZW50KE5vZGVJbmRleCBy
ZXBsYWNlbWVudCkKQEAgLTE2MzksNiArMTY1NCw2ODQgQEAgcHJpdmF0ZToKICNlbmRpZgogICAg
ICAgICBmb3IgKHVuc2lnbmVkIGJsb2NrID0gMDsgYmxvY2sgPCBtX2dyYXBoLm1fYmxvY2tzLnNp
emUoKTsgKytibG9jaykKICAgICAgICAgICAgIHBlcmZvcm1CbG9ja0NTRSgqbV9ncmFwaC5tX2Js
b2Nrc1tibG9ja10pOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3JlcGxh
Y2VtZW50cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0gTm9O
b2RlOworICAgIH0KKyAgICAKKyNkZWZpbmUgTUFYX0hPSVNURURfTE9PUF9JTlZBUklBTlRTIDI1
NgorCisgICAgc3RydWN0IExvb3BTaWRlRWZmZWN0cyB7CisgICAgICAgIGVudW0gQ2xvYmJlcktp
bmQgeworICAgICAgICAgICAgQ2xvYmJlckdldEdsb2JhbFZhciwKKyAgICAgICAgICAgIENsb2Ji
ZXJHZXRCeVZhbCwKKyAgICAgICAgICAgIENsb2JiZXJDaGVja1N0cnVjdHVyZSwKKyAgICAgICAg
ICAgIENsb2JiZXJHZXRCeU9mZnNldCwKKyAgICAgICAgICAgIENsb2JiZXJHZXRQcm9wZXJ0eVN0
b3JhZ2UsCisgICAgICAgICAgICBDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSwKKyAg
ICAgICAgICAgIENsb2JiZXJHZXRBcnJheUxlbmd0aCwKKyAgICAgICAgICAgIENsb2JiZXJHZXRT
dHJpbmdMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICBMb29wU2lkZUVmZmVjdHMoQmxvY2tJ
bmRleCBwcmVIZWFkZXIpCisgICAgICAgICAgICA6IHByZUhlYWRlckluZGV4KHByZUhlYWRlcikK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEdsb2JhbFZh
cigpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEdsb2JhbFZhcik7IH0KKyAgICAg
ICAgYm9vbCBjYW5Ib2lzdEdldEJ5VmFsKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVy
R2V0QnlWYWwpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RDaGVja1N0cnVjdHVyZSgpIHsgcmV0
dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckNoZWNrU3RydWN0dXJlKTsgfQorICAgICAgICBib29s
IGNhbkhvaXN0R2V0QnlPZmZzZXQoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRC
eU9mZnNldCk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldFByb3BlcnR5U3RvcmFnZSgpIHsg
cmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAg
ICAgYm9vbCBjYW5Ib2lzdEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKSB7IHJldHVybiAhY2xv
YmJlcnMuZ2V0KENsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICBi
b29sIGNhbkhvaXN0R2V0QXJyYXlMZW5ndGgoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2Ji
ZXJHZXRBcnJheUxlbmd0aCk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldFN0cmluZ0xlbmd0
aCgpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldFN0cmluZ0xlbmd0aCk7IH0KKwor
ICAgICAgICB2b2lkIGNsb2JiZXJHZXRHbG9iYWxWYXIoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVy
R2V0R2xvYmFsVmFyKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRCeVZhbCgpIHsgY2xvYmJl
cnMuc2V0KENsb2JiZXJHZXRCeVZhbCk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyQ2hlY2tTdHJ1
Y3R1cmUoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUpOyB9CisgICAgICAg
IHZvaWQgY2xvYmJlckdldEJ5T2Zmc2V0KCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEJ5T2Zm
c2V0KTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKSB7IGNsb2Ji
ZXJzLnNldChDbG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICB2b2lkIGNsb2Ji
ZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldElu
ZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldEFycmF5TGVu
Z3RoKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEFycmF5TGVuZ3RoKTsgfQorICAgICAgICB2
b2lkIGNsb2JiZXJHZXRTdHJpbmdMZW5ndGgoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0U3Ry
aW5nTGVuZ3RoKTsgfQorCisgICAgICAgIFZlY3RvcjxpbnQsIDg+IHBvbGx1dGVkTG9jYWxzOwor
ICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDQ+IHBvbGx1dGVkR2xvYmFsczsKKyAgICAgICAgVmVj
dG9yPE5vZGVJbmRleCwgND4gbm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzOworICAgICAgICBW
ZWN0b3I8dW5zaWduZWQsIDQ+IHBvbGx1dGVkSWRlbnRpZmllcnM7CisgICAgICAgIFZlY3Rvcjxp
bnQsIDg+IGdldExvY2FsczsKKyAgICAgICAgQml0VmVjdG9yIGNsb2JiZXJzOworICAgICAgICBC
bG9ja0luZGV4IHByZUhlYWRlckluZGV4OworICAgIH07CisKKyAgICB2b2lkIGFuYWx5emVMb29w
U2lkZUVmZmVjdHMoTm9kZUluZGV4IGxvb3BCZWdpbiwgTm9kZUluZGV4IGxvb3BFbmQsIExvb3BT
aWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBmb3IgKE5vZGVJbmRleCBpbmRl
eCA9IGxvb3BCZWdpbjsgaW5kZXggPCBsb29wRW5kOyBpbmRleCsrKSB7CisgICAgICAgICAgICBO
b2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CisKKyAgICAgICAgICAgIGlmICghbm9kZS5zaG91
bGRHZW5lcmF0ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBz
d2l0Y2ggKG5vZGUub3ApIHsKKyAgICAgICAgICAgIGNhc2UgUHV0QnlWYWw6CisgICAgICAgICAg
ICBjYXNlIFB1dEJ5VmFsQWxpYXM6CisgICAgICAgICAgICAgICAgLy8gSWYgUHV0QnlWYWwgc3Bl
Y3VsYXRlcyB0aGF0IGl0J3MgYWNjZXNzaW5nIGFuIGFycmF5IHdpdGggYW4KKyAgICAgICAgICAg
ICAgICAvLyBpbnRlZ2VyIGluZGV4LCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1
c2UgYSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuCisgICAgICAgICAgICAg
ICAgaWYgKCFieVZhbElzUHVyZShub2RlKSkgeworICAgICAgICAgICAgICAgICAgICBsb29wSW5m
by5jbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8u
Y2xvYmJlckdldEJ5T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2Ji
ZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHV0QnlWYWxB
bGlhcyBjYW4ndCBjaGFuZ2UgdGhlIGluZGV4ZWQgc3RvcmFnZSBwb2ludGVyCisgICAgICAgICAg
ICAgICAgICAgIGlmIChub2RlLm9wID09IFB1dEJ5VmFsKQorICAgICAgICAgICAgICAgICAgICAg
ICAgbG9vcEluZm8uY2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKG5vZGUub3AgPT0gUHV0QnlWYWwgJiYgIWlzRml4ZWRJbmRleGVk
U3RvcmFnZU9iamVjdFByZWRpY3Rpb24obV9ncmFwaFtub2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9u
KCkpKQorICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0SW5kZXhlZFByb3Bl
cnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYXNzdW1lIHRoYXQgdGhl
IFB1dEJ5VmFsIHdpbGwgY2xvYmJlciB0aGUgbG9jYXRpb24gd2UncmUgZ2V0dGluZyBmcm9tLgor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gZG8gYmV0dGVyOyBpZiB3ZSBrbm93IHRo
YXQgdGhlIFB1dEJ5VmFsIGlzIGFjY2Vzc2luZyBhbiBhcnJheSBvZiBhCisgICAgICAgICAgICAg
ICAgLy8gZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgR2V0QnlWYWwsIHRoZW4gd2Uga25vdyB0aGF0
IHRoZXkgd29uJ3QgY2xvYmJlciBlYWNoIG90aGVyLgorICAgICAgICAgICAgICAgIGxvb3BJbmZv
LmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBQdXRTdHJ1Y3R1cmU6CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgdGhlIHN0cnVj
dHVyZSBvciBwdXR0aW5nIHRvIHRoZSBzdG9yYWdlIGNhbm5vdAorICAgICAgICAgICAgICAgIC8v
IGNoYW5nZSB0aGUgcHJvcGVydHkgc3RvcmFnZSBwb2ludGVyLgorICAgICAgICAgICAgICAgIC8v
IENoYW5naW5nIHRoZSBzdHJ1Y3R1cmUgY2Fubm90IGNoYW5nZSB0aGUgb3V0Y29tZSBvZiBhIHBy
b3BlcnR5IGdldC4KKyAgICAgICAgICAgICAgICBsb29wSW5mby5ub2Rlc1dpdGhQb2xsdXRlZFN0
cnVjdHVyZXMuYXBwZW5kKG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgY2FzZSBQdXRCeU9mZnNldDoKKyAgICAgICAgICAgICAgICAvLyBTZXR0aW5n
IGEgcHJvcGVydHkgY2Fubm90IGNoYW5nZSB0aGUgc3RydWN0dXJlLgorICAgICAgICAgICAgICAg
IGxvb3BJbmZvLnBvbGx1dGVkSWRlbnRpZmllcnMuYXBwZW5kKG1fZ3JhcGgubV9zdG9yYWdlQWNj
ZXNzRGF0YVtub2RlLnN0b3JhZ2VBY2Nlc3NEYXRhSW5kZXgoKV0uaWRlbnRpZmllck51bWJlcik7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFycmF5UG9wOgorICAg
ICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAg
IC8vIGZhbGwtdGhyb3VnaC4KKyAgICAgICAgICAgIGNhc2UgQXJyYXlQdXNoOgorICAgICAgICAg
ICAgICAgIC8vIEEgcHVzaCBjYW5ub3QgYWZmZWN0IHByZXZpb3VzbHkgZXhpc3RpbmcgZWxlbWVu
dHMgaW4gdGhlIGFycmF5LgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRBcnJh
eUxlbmd0aCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRH
bG9iYWxWYXI6CisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRHbG9iYWxzLmFwcGVu
ZChub2RlLnZhck51bWJlcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgU2V0TG9jYWw6CisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMu
YXBwZW5kKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIEdldExvY2FsOgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmdldExvY2Fscy5hcHBl
bmQobm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGNsb2JiZXJzV29ybGQoaW5kZXgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJDaGVja1N0cnVjdHVyZSgpOworICAgICAg
ICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlPZmZzZXQoKTsKKyAgICAgICAgICAg
ICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAg
ICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOwor
ICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlWYWwoKTsKKyAgICAgICAg
ICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAg
ICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRTdHJpbmdMZW5ndGgoKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKG5vZGUub3AgPT0gQ2FsbCB8fCBub2RlLm9wID09IENvbnN0cnVjdCkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRHbG9iYWxWYXIoKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzSG9pc3RDYW5kaWRhdGUoTm9kZSYgbm9kZSwg
TG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7CisgICAgICAgIGJvb2wgaXNDYW5kaWRh
dGUgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKKworICAgICAgICBjYXNl
IENvbnZlcnRUaGlzOgorICAgICAgICBjYXNlIEdldENhbGxlZToKKyAgICAgICAgY2FzZSBDaGVj
a0Z1bmN0aW9uOgorICAgICAgICBjYXNlIFN0cmluZ0NoYXJDb2RlQXQ6CisgICAgICAgIGNhc2Ug
U3RyaW5nQ2hhckF0OgorICAgICAgICBjYXNlIENoZWNrSGFzSW5zdGFuY2U6CisgICAgICAgIGNh
c2UgSW5zdGFuY2VPZjoKKyAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgIGNh
c2UgQml0QW5kOgorICAgICAgICBjYXNlIEJpdE9yOgorICAgICAgICBjYXNlIEJpdFhvcjoKKyAg
ICAgICAgY2FzZSBCaXRMU2hpZnQ6CisgICAgICAgIGNhc2UgQml0UlNoaWZ0OgorICAgICAgICBj
YXNlIEJpdFVSU2hpZnQ6CisgICAgICAgIGNhc2UgVmFsdWVUb0ludDMyOgorICAgICAgICBjYXNl
IFVJbnQzMlRvTnVtYmVyOgorICAgICAgICBjYXNlIEFyaXRoQWRkOgorICAgICAgICBjYXNlIEFy
aXRoU3ViOgorICAgICAgICBjYXNlIEFyaXRoTXVsOgorICAgICAgICBjYXNlIEFyaXRoTW9kOgor
ICAgICAgICBjYXNlIEFyaXRoRGl2OgorICAgICAgICBjYXNlIEFyaXRoQWJzOgorICAgICAgICBj
YXNlIEFyaXRoTWluOgorICAgICAgICBjYXNlIEFyaXRoTWF4OgorICAgICAgICBjYXNlIEFyaXRo
U3FydDoKKyAgICAgICAgY2FzZSBWYWx1ZVRvTnVtYmVyOgorICAgICAgICBjYXNlIFZhbHVlVG9E
b3VibGU6CisgICAgICAgIGNhc2UgSlNDb25zdGFudDoKKyAgICAgICAgY2FzZSBXZWFrSlNDb25z
dGFudDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFZhbHVlQWRkOgorICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAg
ICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6Cisg
ICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6Cisg
ICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGlzUHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTG9naWNhbE5vdDoKKyAgICAgICAgICAgIGlz
Q2FuZGlkYXRlID0gbG9naWNhbE5vdElzUHVyZShub2RlKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIENoZWNrU3RydWN0dXJlOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBs
b29wSW5mby5jYW5Ib2lzdENoZWNrU3RydWN0dXJlKCkgJiYgIWxvb3BJbmZvLm5vZGVzV2l0aFBv
bGx1dGVkU3RydWN0dXJlcy5jb250YWlucyhub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIEdldEJ5VmFsOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBi
eVZhbElzUHVyZShub2RlKSAmJiBsb29wSW5mby5jYW5Ib2lzdEdldEJ5VmFsKCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRQcm9wZXJ0eVN0b3JhZ2U6CisgICAgICAgICAg
ICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0UHJvcGVydHlTdG9yYWdlKCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdl
OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEluZGV4ZWRQ
cm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEJ5
T2Zmc2V0OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEJ5
T2Zmc2V0KCkgJiYgIWxvb3BJbmZvLnBvbGx1dGVkSWRlbnRpZmllcnMuY29udGFpbnMobV9ncmFw
aC5tX3N0b3JhZ2VBY2Nlc3NEYXRhW25vZGUuc3RvcmFnZUFjY2Vzc0RhdGFJbmRleCgpXS5pZGVu
dGlmaWVyTnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEFycmF5
TGVuZ3RoOgorICAgICAgICBjYXNlIEdldEJ5dGVBcnJheUxlbmd0aDoKKyAgICAgICAgICAgIGlz
Q2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9pc3RHZXRBcnJheUxlbmd0aCgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0U3RyaW5nTGVuZ3RoOgorICAgICAgICAgICAgaXND
YW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldFN0cmluZ0xlbmd0aCgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0R2xvYmFsVmFyOgorICAgICAgICAgICAgaXNDYW5k
aWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEdsb2JhbFZhcigpICYmICFsb29wSW5mby5wb2xs
dXRlZEdsb2JhbHMuY29udGFpbnMobm9kZS52YXJOdW1iZXIoKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBHZXRMb2NhbDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gIWxv
b3BJbmZvLnBvbGx1dGVkTG9jYWxzLmNvbnRhaW5zKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgLy8gRGFuZ2Vyb3VzISBQYXkgbW9yZSBhdHRlbnRpb24gcGxlYXNl
LgorICAgICAgICBjYXNlIFNldExvY2FsOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSAhbG9v
cEluZm8ucG9sbHV0ZWRMb2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgpKSAmJiAhbG9vcEluZm8u
Z2V0TG9jYWxzLmNvbnRhaW5zKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIGlzQ2FuZGlkYXRlOworICAgIH0KKworICAgIGJvb2wgbm9kZUNhbkJlSG9pc3RlZChO
b2RlJiBub2RlLCBCYXNpY0Jsb2NrJiB0YXJnZXRCbG9jaywgVmVjdG9yPE5vZGVJbmRleCwgMz4m
IGhvaXN0ZWRDaGlsZHJlbikKKyAgICB7CisgICAgICAgIGJvb2wgY2FuSG9pc3QgPSB0cnVlOwor
CisgICAgICAgIGlmIChub2RlLm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2Rl
LmZpcnN0Q2hpbGQoKSArIG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAg
ICAgICAgICAgIE5vZGVJbmRleCBjaGlsZCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGls
ZElkeF07CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IE5vTm9kZSkgeworICAgICAgICAg
ICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07
CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdp
biAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5v
ZGVJbmRleCBjaGlsZDEgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAg
IE5vZGVJbmRleCBjaGlsZDIgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMjsKKyAgICAgICAg
ICAgIE5vZGVJbmRleCBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAg
ICAgICAgICAgaWYgKGNoaWxkMSAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5k
ZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDFdOworICAgICAgICAgICAgICAg
IGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRh
cmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVu
ZChjaGlsZDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2Fu
SG9pc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDIgIT0g
Tm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBs
YWNlbWVudHNbY2hpbGQyXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFy
Z2V0QmxvY2suYmVnaW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAg
ICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQyKTsKKyAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSkgeworICAgICAgICAgICAg
ICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkM107CisgICAg
ICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxh
Y2VtZW50IDwgdGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hp
bGRyZW4uYXBwZW5kKGNoaWxkMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgcmV0dXJuIGNhbkhvaXN0OworICAgIH0KKworICAgIHZvaWQgcmVmZXJlbmNlTWF5QmVT
a2lwcGVkTm9kZShOb2RlSW5kZXggaW5kZXgpCisgICAgeworICAgICAgICBpZiAoaW5kZXggPT0g
Tm9Ob2RlIHx8ICFtX2dyYXBoW2luZGV4XS5yZWYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICAvLyBJdCBiZWNvbWVzIG1vcmUgY29tcGxleCBpZiB0aGUgcmVmZXJlbmNlIGlzIGEg
c2tpcHBlZCBub2RlLgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSByZWZlcmVu
Y2UgY2hhaW4gdG8gZml4IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICAgICBWZWN0b3I8Tm9k
ZUluZGV4LCA0PiBza2lwcGVkTm9kZXM7CisgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoaW5k
ZXgpOworCisgICAgICAgIHdoaWxlICghc2tpcHBlZE5vZGVzLmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgTm9kZUluZGV4IHNraXBwZWRJbmRleCA9IHNraXBwZWROb2Rlcy5sYXN0KCk7CisgICAg
ICAgICAgICBza2lwcGVkTm9kZXMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgTm9kZSYgbm9k
ZSA9IG1fZ3JhcGhbc2tpcHBlZEluZGV4XTsKKworICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBO
b2RlTXVzdEdlbmVyYXRlKQorICAgICAgICAgICAgICAgIG5vZGUucmVmKCk7CisKKyAgICAgICAg
ICAgIGlmIChub2RlLm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGNoaWxkSWR4ID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5m
aXJzdENoaWxkKCkgKyBub2RlLm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAg
ICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltj
aGlsZElkeF07CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkeF0ucmVmKCkp
CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkeCk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBO
b2RlSW5kZXggY2hpbGQxID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDE7CisgICAgICAgICAg
ICAgICAgTm9kZUluZGV4IGNoaWxkMiA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyOworICAg
ICAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxk
MzsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmIG1fZ3JhcGhbY2hp
bGQxXS5yZWYoKSkKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFwcGVuZChjaGls
ZDEpOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUgJiYgbV9ncmFwaFtj
aGlsZDJdLnJlZigpKQorICAgICAgICAgICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNo
aWxkMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSAmJiBtX2dyYXBo
W2NoaWxkM10ucmVmKCkpCisgICAgICAgICAgICAgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQo
Y2hpbGQzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVy
Zm9ybUhvaXN0KE5vZGVJbmRleCBpbmRleCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVuc2ln
bmVkJiBob2lzdGVkKQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhd
OworCisgICAgICAgIGlmICghaG9pc3RlZCkKKyAgICAgICAgICAgIHRhcmdldEJsb2NrLmJlZ2lu
ID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAgICAgbV9ncmFwaC5hcHBlbmQobm9kZSk7CisgICAg
ICAgIE5vZGUmIHJlcGxhY2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgIHJlcGxhY2Vt
ZW50LnNldFJlZkNvdW50KCFub2RlLmhhc1Jlc3VsdCgpICYmIChub2RlLm9wICYgTm9kZU11c3RH
ZW5lcmF0ZSkgPyAxIDogMCk7CisgICAgICAgIC8vIE9ubHkgcGVyZm9ybSBjaGlsZHJlbiBzdWJz
dGl0dXRpb24gZm9yIHRoZSByZXBsYWNlbWVudCBub2RlLgorICAgICAgICBpZiAocmVwbGFjZW1l
bnQub3AgJiBOb2RlSGFzVmFyQXJncykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGls
ZElkeCA9IHJlcGxhY2VtZW50LmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCByZXBsYWNlbWVudC5m
aXJzdENoaWxkKCkgKyByZXBsYWNlbWVudC5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAg
ICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVu
W2NoaWxkSWR4XSwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7IC8vIERvbid0IHJlZmVyZW5jZSB0
aGUgbmV3IGNoaWxkIGhlcmUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJmb3Jt
U3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSwgcmVwbGFjZW1l
bnQucmVmQ291bnQoKSk7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2Vt
ZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMiwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAg
ICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNo
aWxkMywgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAgICAgIH0KKyNpZiBERkdfRU5BQkxF
KERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5n
IEAldSAtPiBAJXUiLCBpbmRleCwgbV9ncmFwaC5zaXplKCkgLSAxKTsKKyNlbmRpZgorICAgICAg
ICBtX3JlcGxhY2VtZW50c1ttX2NvbXBpbGVJbmRleF0gPSBtX2dyYXBoLnNpemUoKSAtIDE7Cisg
ICAgICAgIE5vZGUmIG5ld05vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsgLy8gVGhpcyBj
YW4gZGlmZmVyIGZyb20gIm5vZGUiIGJlY2F1c2UgbV9ncmFwaCBpcyBleHBhbmRlZAorICAgICAg
ICBuZXdOb2RlLnNldFJlZkNvdW50KDApOworICAgICAgICArK2hvaXN0ZWQ7CisgICAgICAgIHRh
cmdldEJsb2NrLmVuZCA9IG1fZ3JhcGguc2l6ZSgpOworICAgIH0KKworICAgIHZvaWQgaG9pc3RH
ZXRMb2NhbChMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvLCB1bnNpZ25lZCYgaG9pc3RlZCkKKyAg
ICB7CisgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW21fY29tcGlsZUluZGV4XTsKKyAgICAg
ICAgQVNTRVJUKG5vZGUub3AgPT0gR2V0TG9jYWwpOworCisjaWYgREZHX0VOQUJMRShERUJVR19Q
Uk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIiAgICVzIEAldTogIiwgR3JhcGg6
Om9wTmFtZShtX2dyYXBoW21fY29tcGlsZUluZGV4XS5vcCksIG1fY29tcGlsZUluZGV4KTsKKyNl
bmRpZgorCisgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpCisgICAgICAgICAgICB8
fCBob2lzdGVkID49IE1BWF9IT0lTVEVEX0xPT1BfSU5WQVJJQU5UUyAtIDEKKyAgICAgICAgICAg
IHx8ICFpc0hvaXN0Q2FuZGlkYXRlKG5vZGUsIGxvb3BJbmZvKQorICAgICAgICAgICAgfHwgbm9k
ZS5jaGlsZDEoKSA9PSBOb05vZGUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQmFz
aWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29wSW5mby5wcmVI
ZWFkZXJJbmRleF07CisgICAgICAgIGludCBvcGVyYW5kID0gbm9kZS5sb2NhbCgpOworICAgICAg
ICBOb2RlSW5kZXggbGFzdERlZmluZUluZGV4ID0gTm9Ob2RlOworICAgICAgICBpZiAob3BlcmFu
ZElzQXJndW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICBsYXN0RGVmaW5lSW5kZXggPSBwcmVI
ZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3Bl
cmFuZCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0RGVmaW5lSW5kZXggPSBwcmVI
ZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCk7CisKKyAgICAgICAgQVNT
RVJUKGxhc3REZWZpbmVJbmRleCAhPSBOb05vZGUpOworICAgICAgICBOb2RlJiBsYXN0RGVmaW5l
ID0gbV9ncmFwaFtsYXN0RGVmaW5lSW5kZXhdOworICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9
PSBHZXRMb2NhbCkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
KyAgICAgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBAJXVcbiIsIG1fY29tcGls
ZUluZGV4ICsgMSwgbGFzdERlZmluZUluZGV4KTsKKyNlbmRpZgorICAgICAgICAgICAgbV9yZXBs
YWNlbWVudHNbbV9jb21waWxlSW5kZXhdID0gbGFzdERlZmluZUluZGV4OworICAgICAgICAgICAg
bm9kZS5zZXRSZWZDb3VudCgwKTsKKyAgICAgICAgICAgIHJldHVybjsgLy8gV2UncmUgZG9uZS4K
KyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RGVmaW5lLm9wID09IFNldExvY2FsKSB7Cisg
ICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHJlYWNoIGhlcmUgYmVjYXVzZSBhIFNldExvY2Fs
IHdpdGggdGhpcyBvcGVyYW5kCisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIGhvaXN0ZWQg
dG8gdGhpcyBibG9jayAKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gUGhpKSB7CisgICAgICAgICAgICBp
ZiAoIWhvaXN0ZWQpCisgICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2suYmVnaW4gPSBtX2dy
YXBoLnNpemUoKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbbV9jb21waWxl
SW5kZXhdKTsKKyAgICAgICAgICAgIE5vZGUmIGdldExvY2FsTm9kZSA9IG1fZ3JhcGhbbV9jb21w
aWxlSW5kZXhdOworICAgICAgICAgICAgTm9kZSYgZ2V0TG9jYWxSZXBsYWNlbWVudCA9IG1fZ3Jh
cGgubGFzdCgpOworICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNlbWVudC5zZXRSZWZDb3VudCgw
KTsKKyAgICAgICAgICAgIGdldExvY2FsUmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQx
ID0gbGFzdERlZmluZUluZGV4OworICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbbV9jb21waWxl
SW5kZXhdID0gbV9ncmFwaC5zaXplKCkgLSAxOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBA
JXVcbiIsIG1fY29tcGlsZUluZGV4LCBtX2dyYXBoLnNpemUoKSAtIDEpOworI2VuZGlmCisgICAg
ICAgICAgICBnZXRMb2NhbE5vZGUuc2V0UmVmQ291bnQoMCk7CisgICAgICAgICAgICArK2hvaXN0
ZWQ7CisgICAgICAgICAgICBwcmVIZWFkZXJCbG9jay5lbmQgPSBtX2dyYXBoLnNpemUoKTsKKwor
ICAgICAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKQorICAgICAgICAgICAg
ICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChvcGVyYW5kVG9Bcmd1
bWVudChvcGVyYW5kKSkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJh
bmQpID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBm
aXhIb2lzdGVkQ2hpbGRXaXRoU2V0TG9jYWwoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2RlSW5k
ZXggY2hpbGQsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBOb2Rl
JiBjaGlsZE5vZGUgPSBtX2dyYXBoW2NoaWxkXTsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxhY2Vt
ZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1lbnQg
IT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkTm9kZS5vcCAhPSBHZXRMb2NhbCAmJiBj
aGlsZE5vZGUub3AgIT0gUGhpICYmIGNoaWxkTm9kZS5vcCAhPSBTZXRMb2NhbCk7CisgICAgICAg
IE5vZGUmIHNldExvY2FsTm9kZSA9IG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAxXTsKKyAgICAgICAg
QVNTRVJUKHNldExvY2FsTm9kZS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFTU0VSVChzZXRM
b2NhbE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID09IHJlcGxhY2VtZW50KTsKKworICAgICAg
ICBjaGlsZE5vZGUub3AgPSBHZXRMb2NhbDsKKyAgICAgICAgcmVmZXJlbmNlTWF5QmVTa2lwcGVk
Tm9kZShyZXBsYWNlbWVudCArIDEpOworICAgICAgICBjaGlsZE5vZGUuc2V0VmFyaWFibGVBY2Nl
c3NEYXRhKHNldExvY2FsTm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKSk7CisgICAgICAgIGludCBv
cGVyYW5kID0gY2hpbGROb2RlLmxvY2FsKCk7CisgICAgICAgIEJhc2ljQmxvY2smIHByZUhlYWRl
ckJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbbG9vcEluZm8ucHJlSGVhZGVySW5kZXhdOworICAg
ICAgICBCYXNpY0Jsb2NrJiBjdXJyZW50QmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tibG9ja0lu
ZGV4XTsKKyAgICAgICAgTm9kZUluZGV4IGZpcnN0RGVmaW5lSW5kZXggPSBOb05vZGU7CisgICAg
ICAgIGxvb3BJbmZvLnBvbGx1dGVkTG9jYWxzLmFwcGVuZChvcGVyYW5kKTsKKyAgICAgICAgaWYg
KG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKSB7CisgICAgICAgICAgICBwcmVIZWFkZXJCbG9j
ay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkpID0g
cmVwbGFjZW1lbnQgKyAxOworICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJlbnRC
bG9jay52YXJpYWJsZXNBdEhlYWQuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVz
QXRUYWlsLmxvY2FsKG9wZXJhbmQpID0gcmVwbGFjZW1lbnQgKyAxOworICAgICAgICAgICAgZmly
c3REZWZpbmVJbmRleCA9IGN1cnJlbnRCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwob3BlcmFu
ZCk7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVhZHMgb2YgdGVtcG9yYXJpZXMgZnJvbSBw
cmlvciBibG9ja3MsCisgICAgICAgICAgICAvLyBleHBhbmQgbV9wcmVzZXJ2ZWRWYXJzIHRvIGNv
dmVyIHRoZXNlLgorICAgICAgICAgICAgbV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMuc2V0KG9wZXJh
bmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQVNTRVJUKGZpcnN0RGVmaW5lSW5kZXggIT0g
Tm9Ob2RlKTsKKyAgICAgICAgaWYgKGZpcnN0RGVmaW5lSW5kZXggIT0gTm9Ob2RlICYmIG1fZ3Jh
cGhbZmlyc3REZWZpbmVJbmRleF0ub3AgPT0gR2V0TG9jYWwpCisgICAgICAgICAgICBmaXJzdERl
ZmluZUluZGV4ID0gbV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5jaGlsZDEoKTsKKworICAgICAg
ICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID0gZmlyc3REZWZpbmVJbmRleDsKKyAg
ICAgICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IE5vTm9kZTsKKyAgICAgICAg
Y2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IE5vTm9kZTsKKyAgICB9CisKKyAgICBi
b29sIGZpeEhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBjaGls
ZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7CisgICAgICAgIGJvb2wgc3VjY2Vz
c2Z1bCA9IHRydWU7CisgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1l
bnRzW2NoaWxkXTsKKyAgICAgICAgQVNTRVJUKHJlcGxhY2VtZW50ICE9IE5vTm9kZSk7IC8vIENo
aWxkcmVuIG9mIGEgaG9pc3RlZCBub2RlIG11c3QgaGF2ZSBiZWVuIGhvaXN0ZWQgYXMgd2VsbC4K
KworICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgaWYgKG1fZ3JhcGhbY2hp
bGRdLnJlZkNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgLy8gT25seSBmaXggdGhpcyBjaGls
ZCBvbmNlLgorICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLm9wICE9IEdldExvY2FsICYm
IG1fZ3JhcGhbY2hpbGRdLm9wICE9IEpTQ29uc3RhbnQgJiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0g
V2Vha0pTQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9ncmFwaFtjaGlsZF0u
b3AgIT0gUGhpICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IFNldExvY2FsKTsKKyAgICAgICAgICAg
ICAgICBpZiAocmVwbGFjZW1lbnQgPCBtX2dyYXBoLnNpemUoKSAtIDEgJiYgbV9ncmFwaFtyZXBs
YWNlbWVudCArIDFdLm9wID09IFNldExvY2FsKQorICAgICAgICAgICAgICAgICAgICBmaXhIb2lz
dGVkQ2hpbGRXaXRoU2V0TG9jYWwoYmxvY2tJbmRleCwgY2hpbGQsIGxvb3BJbmZvKTsKKyAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkXS5vcCAmIE5vZGVN
dXN0R2VuZXJhdGUpCisgICAgICAgICAgICAgICAgbV9ncmFwaFtjaGlsZF0ucmVmKCk7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7CisgICAgfQorCisgICAgdm9pZCBoYW5k
bGVIb2lzdGVkQ2hpbGQoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2RlSW5kZXggY2hpbGQsIExv
b3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBpZiAoZml4SG9pc3RlZENo
aWxkKGJsb2NrSW5kZXgsIGNoaWxkLCBsb29wSW5mbykpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGZpeCB0aGlzIGNoaWxkLCB3ZSBuZWVkIHRvIGJhY2sg
dHJhY2suCisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDM+IGhvaXN0ZWRDaGlsZHJlbldpdGhv
dXRTZXRMb2NhbDsKKyAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVu
ZChjaGlsZCk7CisgICAgICAgIHdoaWxlICghaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2Fs
LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaG9pc3RlZENo
aWxkcmVuV2l0aG91dFNldExvY2FsLmxhc3QoKV07CisgICAgICAgICAgICBob2lzdGVkQ2hpbGRy
ZW5XaXRob3V0U2V0TG9jYWwucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgaWYgKG5vZGUub3Ag
JiBOb2RlSGFzVmFyQXJncykgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hpbGRJ
ZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSArIG5v
ZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBOb2Rl
SW5kZXgmIGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07CisgICAg
ICAgICAgICAgICAgICAgIGlmIChjaGlsZHggIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQo
YmxvY2tJbmRleCwgY2hpbGR4LCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICBo
b2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkeCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXgm
IGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxOworICAgICAgICAgICAgICAgIE5v
ZGVJbmRleCYgY2hpbGQyID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAgICAg
ICAgICAgTm9kZUluZGV4JiBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKwor
ICAgICAgICAgICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQo
YmxvY2tJbmRleCwgY2hpbGQxLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0
ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQxKTsKKworICAgICAgICAgICAg
ICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwg
Y2hpbGQyLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldp
dGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQyKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGls
ZDMgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQzLCBsb29w
SW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2Nh
bC5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIEFkb3B0IHRoZSBkb21pbmFuY2UgYWxnb3JpdGhtIGJ5IENvb3BlciwgS2VpdGggRC47IEhh
cnZleSwgVGltb3RoeSBKOyBhbmQgS2VubmVkeSwgS2VuICgyMDAxKS4gCisgICAgLy8gIkEgU2lt
cGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0aG0iCisgICAgLy8gaHR0cDovL3d3dy5oaXBlcnNv
ZnQucmljZS5lZHUvZ3JhZHMvcHVibGljYXRpb25zL2RvbTE0LnBkZgorICAgIHVuc2lnbmVkIGlu
dGVyc2VjdCh1bnNpZ25lZCBiMSwgdW5zaWduZWQgYjIsIFZlY3Rvcjx1bnNpZ25lZD4mIGRvbVRy
ZWUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBmaW5nZXIxID0gYjE7CisgICAgICAgIHVuc2ln
bmVkIGZpbmdlcjIgPSBiMjsKKworICAgICAgICB3aGlsZSAoZmluZ2VyMSAhPSBmaW5nZXIyKSB7
CisgICAgICAgICAgICB3aGlsZSAoZmluZ2VyMSA+IGZpbmdlcjIpCisgICAgICAgICAgICAgICBm
aW5nZXIxID0gZG9tVHJlZVtmaW5nZXIxXTsKKyAgICAgICAgICAgIHdoaWxlIChmaW5nZXIyID4g
ZmluZ2VyMSkKKyAgICAgICAgICAgICAgIGZpbmdlcjIgPSBkb21UcmVlW2ZpbmdlcjJdOworICAg
ICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbmdlcjE7CisgICAgfQorCisgICAgdm9pZCBjb21w
dXRlRG9taW5hdG9ycyhCbG9ja0luZGV4IGJlZ2luLCBCbG9ja0luZGV4IGVuZCwgVmVjdG9yPEJs
b2NrSW5kZXgsIDg+JiBkb21pbmF0b3JzKQorICAgIHsKKyAgICAgICAgLy8gRmlyc3RseSBjb21w
dXRlIHRoZSBkb21pbmF0b3IgdHJlZS4KKyAgICAgICAgLy8gVGhlIHRyZWUgbm9kZSBpbmRleCBp
cyB0aGUgYmxvY2sgaW5kZXggb2Zmc2V0ZWQgYnkgdGhlIGJlZ2luIGJsb2NrIGluZGV4LgorICAg
ICAgICBWZWN0b3I8dW5zaWduZWQ+IGRvbVRyZWU7CisgICAgICAgIHVuc2lnbmVkIHNpemUgPSBl
bmQgLSBiZWdpbiArIDE7CisKKyAgICAgICAgZG9tVHJlZS5yZXNpemUoc2l6ZSk7CisgICAgICAg
IGRvbVRyZWVbMF0gPSAwOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsg
aSsrKQorICAgICAgICAgICAgZG9tVHJlZVtpXSA9IHNpemU7CisKKyAgICAgICAgYm9vbCBjaGFu
Z2VkID0gdHJ1ZTsKKworICAgICAgICB3aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hh
bmdlZCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgc2l6
ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsg
aV0tPmlzUmVhY2hhYmxlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkgYW5kIGVuc3VyZSB0aGF0IHRoZSBwcmVjZXNzb3Jz
IGFyZSBvcmRlcmVkIGJ5IGluZGV4LgorICAgICAgICAgICAgICAgIFByZWRlY2Vzc29yTGlzdCYg
cHJlZGVjZXNzb3JzID0gbV9ncmFwaC5tX2Jsb2Nrc1tiZWdpbiArIGldLT5tX3ByZWRlY2Vzc29y
czsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBqID0gMDsKKyAgICAgICAgICAgICAgICAvLyBG
aW5kIHRoZSBmaXJzdCBwcmVkZWNlc3NvciBpbiB0aGlzIHN1YmdyYXBoCisgICAgICAgICAgICAg
ICAgd2hpbGUgKHByZWRlY2Vzc29yc1tqXSA8IGJlZ2luKQorICAgICAgICAgICAgICAgICAgICBq
Kys7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBuZXdJRG9tID0gcHJlZGVjZXNzb3JzW2pd
IC0gYmVnaW47CisgICAgICAgICAgICAgICAgQVNTRVJUKGRvbVRyZWVbbmV3SURvbV0gIT0gc2l6
ZSk7IC8vIE11c3QgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgICAgICAgICAgICAgICBqKys7Cisg
ICAgICAgICAgICAgICAgZm9yICg7IGogPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyBqKyspIHsKKyAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHJlZCA9IHByZWRlY2Vzc29yc1tqXSAtIGJlZ2lu
OworICAgICAgICAgICAgICAgICAgICBpZiAoZG9tVHJlZVtwcmVkXSAhPSBzaXplKSAvLyBNZWFu
cyBpdCdzIGFscmVhZHkgY2FsY3VsYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lE
b20gPSBpbnRlcnNlY3QocHJlZCwgbmV3SURvbSwgZG9tVHJlZSk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIGlmIChkb21UcmVlW2ldICE9IG5ld0lEb20pIHsKKyAgICAgICAg
ICAgICAgICAgICAgZG9tVHJlZVtpXSA9IG5ld0lEb207CisgICAgICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICht
X2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nrcy5jb250YWlucyhiZWdpbiArIGkpKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGNvbmRpdGlvbmFsIGlubmVyIGxvb3BzIGlmIHBv
c3NpYmxlLgorICAgICAgICAgICAgICAgICAgICBOb2RlJiBqdW1wID0gbV9ncmFwaFttX2dyYXBo
Lm1fYmxvY2tzW2JlZ2luICsgaV0tPmVuZCAtIDFdOworICAgICAgICAgICAgICAgICAgICBBU1NF
UlQoanVtcC5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGp1bXAudGFrZW5C
bG9ja0luZGV4KCkgLSBiZWdpbiAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlbiB0cmF2ZXJzZSB0aGUgZG9taW5hdG9yIHRy
ZWUgdG8gZ2V0IHRoZSBkb21pbmF0b3JzIG9mIHRoZSBsYXN0IGJsb2NrLgorICAgICAgICB1bnNp
Z25lZCBpZG9tID0gZG9tVHJlZS5sYXN0KCk7CisgICAgICAgIHdoaWxlIChpZG9tKSB7CisgICAg
ICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChpZG9tICsgYmVnaW4pOworICAgICAgICAgICAgaWRv
bSA9IGRvbVRyZWVbaWRvbV07CisgICAgICAgIH0KKyAgICAgICAgZG9taW5hdG9ycy5hcHBlbmQo
YmVnaW4pOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUxJQ00oQmxvY2tJbmRleCBwcmVIZWFk
ZXJJbmRleCkKKyAgICB7CisgICAgICAgIEJhc2ljQmxvY2smIHByZUhlYWRlckJsb2NrID0gKm1f
Z3JhcGgubV9ibG9ja3NbcHJlSGVhZGVySW5kZXhdOworICAgICAgICBCbG9ja0luZGV4IGxvb3BI
ZWFkZXJJbmRleCA9IG1fZ3JhcGhbcHJlSGVhZGVyQmxvY2suZW5kIC0gMV0udGFrZW5CbG9ja0lu
ZGV4KCk7CisgICAgICAgIEJhc2ljQmxvY2smIGJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbbG9v
cEhlYWRlckluZGV4XTsKKyAgICAgICAgQmxvY2tJbmRleCBsYXN0TG9vcEJsb2NrSW5kZXggPSBs
b29wSGVhZGVySW5kZXg7CisgICAgICAgIHVuc2lnbmVkIGkgPSAwOworCisgICAgICAgIGZvciAo
aSA9IDE7IGkgPCBibG9jay5tX3ByZWRlY2Vzc29ycy5zaXplKCk7ICsraSkgeworICAgICAgICAg
ICAgaWYgKGJsb2NrLm1fcHJlZGVjZXNzb3JzW2ldID4gbGFzdExvb3BCbG9ja0luZGV4KQorICAg
ICAgICAgICAgICAgIGxhc3RMb29wQmxvY2tJbmRleCA9IGJsb2NrLm1fcHJlZGVjZXNzb3JzW2ld
OyAvLyBUaGUgZnJvbSBibG9jayBvZiB0aGUgYmFjayBlZGdlLgorICAgICAgICB9CisKKyAgICAg
ICAgQmxvY2tJbmRleCBmaXJzdExvb3BCbG9ja0luZGV4ID0gcHJlSGVhZGVySW5kZXggKyAxOwor
ICAgICAgICBWZWN0b3I8QmxvY2tJbmRleCwgOD4gbXVzdFJlYWNoQmxvY2tzSW5Mb29wOworICAg
ICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AuYXBwZW5kKGxhc3RMb29wQmxvY2tJbmRleCk7Cisg
ICAgICAgIGNvbXB1dGVEb21pbmF0b3JzKGZpcnN0TG9vcEJsb2NrSW5kZXgsIGxhc3RMb29wQmxv
Y2tJbmRleCwgbXVzdFJlYWNoQmxvY2tzSW5Mb29wKTsKKworICAgICAgICB1bnNpZ25lZCBob2lz
dGVkID0gMDsKKyAgICAgICAgLy8gYm9vbCBtZXRJbmxpbmUgPSBmYWxzZTsKKyAgICAgICAgdW5z
aWduZWQgcHJlSGVhZGVyRW5kQmVmb3JlTElDTSA9IHByZUhlYWRlckJsb2NrLmVuZDsKKyAgICAg
ICAgdW5zaWduZWQgbGFzdEJlZm9yZUhvaXN0ID0gbV9ncmFwaC5zaXplKCk7CisgICAgICAgIExv
b3BTaWRlRWZmZWN0cyBsb29wSW5mbyhwcmVIZWFkZXJJbmRleCk7CisgICAgICAgIGFuYWx5emVM
b29wU2lkZUVmZmVjdHMobV9ncmFwaC5tX2Jsb2Nrc1tmaXJzdExvb3BCbG9ja0luZGV4XS0+YmVn
aW4sIG1fZ3JhcGgubV9ibG9ja3NbbGFzdExvb3BCbG9ja0luZGV4XS0+ZW5kLCBsb29wSW5mbyk7
CisKKyAgICAgICAgd2hpbGUgKCFtdXN0UmVhY2hCbG9ja3NJbkxvb3AuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXggPSBtdXN0UmVhY2hCbG9ja3NJbkxvb3Au
bGFzdCgpOworICAgICAgICAgICAgbXVzdFJlYWNoQmxvY2tzSW5Mb29wLnJlbW92ZUxhc3QoKTsK
KworI2lmIDAKKyAgICAgICAgICAgIC8vIEZJWE1FOiByZWNvbnNpZGVyIHRoaXMgbGF0ZXIgdG8g
YmFsYW5jZSB0aGUgZXhlY3V0aW9uIHBlcmZvcm1hbmNlIGFuZCBjb21waWxlIHRpbWUuCisgICAg
ICAgICAgICBpZiAobWV0SW5saW5lKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisK
KyAgICAgICAgICAgIGZvciAobV9jb21waWxlSW5kZXggPSBtX2dyYXBoLm1fYmxvY2tzW2Jsb2Nr
SW5kZXhdLT5iZWdpbjsgbV9jb21waWxlSW5kZXggPCBtX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5k
ZXhdLT5lbmQ7ICsrbV9jb21waWxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBOb2RlJiBub2Rl
ID0gbV9ncmFwaFttX2NvbXBpbGVJbmRleF07CisKKyNpZiAwCisgICAgICAgICAgICAgICAgLy8g
QmFpbCBvdXQgaWYgd2UgbWVldCBpbmxpbmVkIGJvZGllcyBpbiB0aGUgbG9vcC4KKyAgICAgICAg
ICAgICAgICBpZiAobm9kZS5vcCA9PSBJbmxpbmVTdGFydCkgeworICAgICAgICAgICAgICAgICAg
ICBtZXRJbmxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IFBoaSB8
fCBub2RlLm9wID09IEZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0
dXRpb24obm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDEpOworICAgICAgICAgICAgICAgICAgICBw
ZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyKTsKKyAgICAgICAg
ICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxk
Myk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IEdldExvY2FsKSB7CisgICAgICAgICAgICAg
ICAgICAgIGhvaXN0R2V0TG9jYWwobG9vcEluZm8sIGhvaXN0ZWQpOworICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29s
IHNob3VsZEdlbmVyYXRlID0gbm9kZS5zaG91bGRHZW5lcmF0ZSgpOworICAgICAgICAgICAgICAg
IGJvb2wgY2FuSG9pc3QgPSBob2lzdGVkIDwgTUFYX0hPSVNURURfTE9PUF9JTlZBUklBTlRTIC0g
MQorICAgICAgICAgICAgICAgICAgICAmJiBpc0hvaXN0Q2FuZGlkYXRlKG5vZGUsIGxvb3BJbmZv
KTsKKworICAgICAgICAgICAgICAgIC8vIExvb2sgb25lIHN0ZXAgYWhlYWQuCisgICAgICAgICAg
ICAgICAgaWYgKG1fZ3JhcGhbbV9jb21waWxlSW5kZXggKyAxXS5vcCA9PSBTZXRMb2NhbCAmJiBs
b29wSW5mby5wb2xsdXRlZExvY2Fscy5jb250YWlucyhtX2dyYXBoW21fY29tcGlsZUluZGV4ICsg
MV0ubG9jYWwoKSkpCisgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisKKyAg
ICAgICAgICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCAzPiBob2lzdGVkQ2hpbGRyZW47CisgICAg
ICAgICAgICAgICAgY2FuSG9pc3QgJj0gbm9kZUNhbkJlSG9pc3RlZChub2RlLCBwcmVIZWFkZXJC
bG9jaywgaG9pc3RlZENoaWxkcmVuKTsKKworICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8g
aG9pc3QgdGhlIFNldExvY2FsIG5vZGUgd2hhdGV2ZXIuCisgICAgICAgICAgICAgICAgaWYgKCFz
aG91bGRHZW5lcmF0ZSAmJiBub2RlLm9wICE9IFNldExvY2FsKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9W
RVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BO
YW1lKG1fZ3JhcGhbbV9jb21waWxlSW5kZXhdLm9wKSwgbV9jb21waWxlSW5kZXgpOworI2VuZGlm
CisKKyAgICAgICAgICAgICAgICBpZiAoY2FuSG9pc3QpCisgICAgICAgICAgICAgICAgICAgIHBl
cmZvcm1Ib2lzdChtX2NvbXBpbGVJbmRleCwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWQpOworICAg
ICAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZEdlbmVyYXRlICYmICFob2lzdGVkQ2hpbGRyZW4u
aXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBjYW5ub3QgYmUg
aG9pc3RlZCBidXQgaXQgY29udGFpbnMgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBob2lzdGVkIG5v
ZGVzLgorICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgc3VjaCByZWZlcmVuY2VzIGJ5IHV0
aWxpemluZyBTZXRMb2NhbC9HZXRMb2NhbCBmb3IgY3Jvc3MgYmxvY2sgcmVmZXJlbmNlcy4KKyAg
ICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGhvaXN0ZWRDaGlsZHJl
bi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhvaXN0ZWRDaGls
ZChibG9ja0luZGV4LCBob2lzdGVkQ2hpbGRyZW5baV0sIGxvb3BJbmZvKTsKKyAgICAgICAgICAg
ICAgICB9CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAg
ICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAoaG9pc3RlZCA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2dy
YXBoW3ByZUhlYWRlckVuZEJlZm9yZUxJQ00gLSAxXS5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAg
IG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbcHJlSGVhZGVyRW5kQmVmb3JlTElDTSAtIDFdKTsKKyAg
ICAgICAgICAgIEFTU0VSVF9VTlVTRUQobGFzdEJlZm9yZUhvaXN0LCBwcmVIZWFkZXJCbG9jay5i
ZWdpbiA9PSBsYXN0QmVmb3JlSG9pc3QpOworICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2suZW5k
ID0gbV9ncmFwaC5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvb3BJbnZh
cmlhbnRDb2RlTW90aW9uKCkKKyAgICB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElP
Tl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIlBlcmZvcm1pbmcgbG9vcCBpbnZhcmlhbnQgY29k
ZSBtb3Rpb246Iik7CisjZW5kaWYKKyAgICAgICAgdW5zaWduZWQgaSA9IDA7CisgICAgICAgIGZv
ciAoaSA9IDA7IGkgPCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlckJsb2Nrcy5zaXplKCk7ICsraSkK
KyAgICAgICAgICAgIHBlcmZvcm1MSUNNKG1fZ3JhcGgubV9sb29wUHJlSGVhZGVyQmxvY2tzW2ld
KTsKKworICAgICAgICAvLyBTb21lIFBoaSBub2RlcyBtYXkgbm90IGdldCB1cGRhdGVkIGNoaWxk
cmVuIGZvciBub3cuCisgICAgICAgIGZvciAoaSA9IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5l
bmQ7IGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHBlcmZv
cm1TdWJzdGl0dXRpb24obV9ncmFwaFtpXS5jaGlsZHJlbi5maXhlZC5jaGlsZDEpOworICAgICAg
ICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihtX2dyYXBoW2ldLmNoaWxkcmVuLmZpeGVkLmNoaWxk
Mik7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4u
Zml4ZWQuY2hpbGQzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFuLXVwLgorICAgICAg
ICBmb3IgKGkgPSAwOyBpIDwgbV9yZXBsYWNlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICBtX3JlcGxhY2VtZW50c1tpXSA9IE5vTm9kZTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBhbGxv
Y2F0ZVZpcnR1YWxSZWdpc3RlcnMoKQpAQCAtMTY0OSw4ICsyMzQyLDExIEBAIHByaXZhdGU6CiAg
ICAgICAgIHByaW50ZigiXG4iKTsKICNlbmRpZgogICAgICAgICBTY29yZUJvYXJkIHNjb3JlQm9h
cmQobV9ncmFwaCwgbV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMpOwotICAgICAgICB1bnNpZ25lZCBz
aXplRXhjbHVkaW5nUGhpTm9kZXMgPSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kOwotICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVFeGNsdWRpbmdQaGlOb2RlczsgKytpKSB7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGhpIG5vZGVzCisgICAgICAgICAgICBpZiAoaSA+PSBt
X2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kICYmIGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxTaXpl
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBOb2RlJiBub2RlID0g
bV9ncmFwaFtpXTsKICAgICAgICAgCiAgICAgICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJh
dGUoKSkKQEAgLTE3MDMsNiArMjM5OSw4IEBAIHByaXZhdGU6CiAgICAgICAgIHByaW50ZigiICAg
QmxvY2sgIyV1IChiYyMldSk6XG4iLCBibG9ja0luZGV4LCBibG9jay0+Ynl0ZWNvZGVCZWdpbik7
CiAjZW5kaWYKICAgICAgICAgc3RhdGUuYmVnaW5CYXNpY0Jsb2NrKGJsb2NrKTsKKyAgICAgICAg
YmxvY2stPmNmYVNob3VsZFJldmlzaXQgPSBmYWxzZTsKKyAgICAgICAgYmxvY2stPmNmYUhhc1Zp
c2l0ZWQgPSB0cnVlOwogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
ICAgICAgICAgcHJpbnRmKCIgICAgICBoZWFkIHZhcnM6ICIpOwogICAgICAgICBkdW1wT3BlcmFu
ZHMoYmxvY2stPnZhbHVlc0F0SGVhZCwgc3Rkb3V0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtOTIwLDcgKzkyMCw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVN
b3ZIaW50KE5vZGUKIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYgYmxv
Y2spCiB7CiAgICAgQVNTRVJUKG1fY29tcGlsZU9rYXkpOwotICAgIEFTU0VSVChtX2NvbXBpbGVJ
bmRleCA9PSBibG9jay5iZWdpbik7CisgICAgLy8gQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJs
b2NrLmJlZ2luKTsKKyAgICBtX2NvbXBpbGVJbmRleCA9IGJsb2NrLmJlZ2luOwogICAgIAogICAg
IGlmICghYmxvY2suaXNSZWFjaGFibGUpIHsKICAgICAgICAgbV9jb21waWxlSW5kZXggPSBibG9j
ay5lbmQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9J
bnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3MDgsNiAr
MzcwOCwxMSBAQCBza2lwX2lkX2N1c3RvbV9zZWxmOgogICAgICAgICB2UEMgKz0gT1BDT0RFX0xF
TkdUSChvcF9sb29wX2hpbnQpOwogICAgICAgICBORVhUX0lOU1RSVUNUSU9OKCk7CiAgICAgfQor
ICAgIERFRklORV9PUENPREUob3BfbG9vcF9wcmVoZWFkZXIpIHsKKyAgICAgICAgLy8gVGhpcyBp
cyBhIG5vLW9wIHVubGVzcyB3ZSBpbnRlbmQgb24gZG9pbmcgT1NSIGZyb20gdGhlIGludGVycHJl
dGVyLgorICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9sb29wX3ByZWhlYWRlcik7Cisg
ICAgICAgIE5FWFRfSU5TVFJVQ1RJT04oKTsKKyAgICB9CiAgICAgREVGSU5FX09QQ09ERShvcF9s
b29wX2lmX3RydWUpIHsKICAgICAgICAgLyogbG9vcF9pZl90cnVlIGNvbmQocikgdGFyZ2V0KG9m
ZnNldCkKICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAkocmV2aXNp
b24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMDEsOCArMTAxLDEwIEBAIHZvaWQgSklUOjplbWl0T3B0aW1pemF0aW9uQ2hl
Y2soT3B0aW1pemEKICAgICAKICAgICBKdW1wIHNraXBPcHRpbWl6ZSA9IGJyYW5jaEFkZDMyKFNp
Z25lZCwgVHJ1c3RlZEltbTMyKGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gT3B0aW9u
czo6ZXhlY3V0aW9uQ291bnRlckluY3JlbWVudEZvckxvb3AgOiBPcHRpb25zOjpleGVjdXRpb25D
b3VudGVySW5jcmVtZW50Rm9yUmV0dXJuKSwgQWJzb2x1dGVBZGRyZXNzKG1fY29kZUJsb2NrLT5h
ZGRyZXNzT2ZKSVRFeGVjdXRlQ291bnRlcigpKSk7CiAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwo
dGhpcywga2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBjdGlfb3B0aW1pemVfZnJvbV9s
b29wIDogY3RpX29wdGltaXplX2Zyb21fcmV0KTsKLSAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1p
emF0aW9uQ2hlY2spCi0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0ZWNv
ZGVPZmZzZXQpKTsKKyAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2spIHsKKyAg
ICAgICAgSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY29kZUJsb2NrLT5pbnN0
cnVjdGlvbnMoKS5iZWdpbigpICsgbV9ieXRlY29kZU9mZnNldDsKKyAgICAgICAgc3R1YkNhbGwu
YWRkQXJndW1lbnQoSW1tMzIobV9ieXRlY29kZU9mZnNldCArIGN1cnJlbnRJbnN0cnVjdGlvblsx
XS51Lm9wZXJhbmQpKTsKKyAgICB9CiAgICAgc3R1YkNhbGwuY2FsbCgpOwogICAgIHNraXBPcHRp
bWl6ZS5saW5rKHRoaXMpOwogfQpAQCAtMjkxLDYgKzI5Myw3IEBAIHZvaWQgSklUOjpwcml2YXRl
Q29tcGlsZU1haW5QYXNzKCkKICAgICAgICAgREVGSU5FX09QKG9wX2p0cnVlKQogICAgICAgICBE
RUZJTkVfT1Aob3BfbG9vcCkKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaGludCkKKyAgICAg
ICAgREVGSU5FX09QKG9wX2xvb3BfcHJlaGVhZGVyKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9v
cF9pZl9sZXNzKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9sZXNzZXEpCiAgICAgICAg
IERFRklORV9PUChvcF9sb29wX2lmX2dyZWF0ZXIpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaml0L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklU
LmgJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmgJ
KHdvcmtpbmcgY29weSkKQEAgLTgyMSw2ICs4MjEsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAg
ICAgdm9pZCBlbWl0X29wX2p0cnVlKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9v
cF9sb29wKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2hpbnQoSW5z
dHJ1Y3Rpb24qKTsKKyAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0
aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3MoSW5zdHJ1Y3Rpb24qKTsK
ICAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfbGVzc2VxKEluc3RydWN0aW9uKik7CiAgICAg
ICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2dyZWF0ZXIoSW5zdHJ1Y3Rpb24qKTsKQEAgLTExMDIs
NiArMTEwMywxMCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgZW1pdE9wdGltaXphdGlvbkNo
ZWNrKExvb3BPcHRpbWl6YXRpb25DaGVjayk7CiAgICAgfQogCisgICAgaW5saW5lIHZvaWQgSklU
OjplbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9uKikKKyAgICB7CisgICAgfQorCiAg
ICAgaW5saW5lIHZvaWQgSklUOjplbWl0X29wX2xvb3BfaWZfdHJ1ZShJbnN0cnVjdGlvbiogY3Vy
cmVudEluc3RydWN0aW9uKQogICAgIHsKICAgICAgICAgZW1pdFRpbWVvdXRDaGVjaygpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125098</attachid>
            <date>2012-02-02 01:26:08 -0800</date>
            <delta_ts>2012-02-03 01:27:29 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.11.patch</filename>
            <type>text/plain</type>
            <size>76902</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2NTQxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyMyBA
QAorMjAxMi0wMi0wMiAgWXVxaWFuZyBYaWFuICA8eXVxaWFuZy54aWFuQGludGVsLmNvbT4KKwor
ICAgICAgICBMb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBpbiBKU0MgREZHCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3MuCisK
KyAgICAgICAgVGhlIGZyYW1ld29yayB0byBzdXBwb3J0IG1vdmluZyBhIERGRyBub2RlIChhbmQg
dGhlIG5vZGVzIGNoYWluZWQgd2l0aAorICAgICAgICByZWZlcmVuY2VzKSB0byBhIGRpZmZlcmVu
dCBiYXNpYyBibG9jayBpcyBzdXBwb3NlZCB0byB3b3JrLCBhcyB3ZWxsIGFzCisgICAgICAgIHRo
ZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBjcm9zcy1ibG9jayByZWZlcmVuY2VzLgorICAgICAgICBB
IGJhc2ljIGJsb2NrIGRvbWluYW5jZSBhbmFseXNpcyBhbGdvcml0aG0gaXMgaW50cm9kdWNlZCB0
byBkZXRlcm1pbmUKKyAgICAgICAgd2hpY2ggbG9vcCBibG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVy
ZWQgZm9yIGNvZGUgbW90aW9uOiB0aGUgYmxvY2tzCisgICAgICAgIHRoYXQgZG9taW5hdGUgdGhl
IGxvb3AgZXhpdC4KKyAgICAgICAgVGhlIE9TUiBlbnRyeSBpcyBtb2RpZmllZC4gVGhlcmUncyBh
IGRlZGljYXRlZCBsb29wIHByZWhlYWRlciBibG9jayBhcworICAgICAgICB0aGUgT1NSIGVudHJ5
LgorICAgICAgICBTaWRlIGVmZmVjdHMgYW5hbHlzaXMgb2YgYSBsb29wIGlzIHBlcmZvcm1lZCB0
byBmaW5kIG91dCBpZiB0aGVyZSdyZQorICAgICAgICBwb3NzaWJsZSBtb2RpZmljYXRpb25zIHRv
IHRoZSBwcm9wZXJ0aWVzIG9yIHRoZSBzdHJ1Y3R1cmVzLCBhbmQgaWYKKyAgICAgICAgdGhlcmUn
cmUgcG9zc2libGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgbG9jYWwgb3IgdGhlIGdsb2JhbCB2YXJp
YWJsZXMsCisgICAgICAgIHRvIGhlbHAgdXMgbW9yZSBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGV0
aGVyIGEgREZHIG5vZGUgaXMgaW5kZWVkIGxvb3AKKyAgICAgICAgaW52YXJpYW50IG9yIG5vdC4K
KworICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6CisgICAgICAgIChKU0M6OkNvZGVC
bG9jazo6ZHVtcCk6CisgICAgICAgICogYnl0ZWNvZGUvT3Bjb2RlLmg6CisgICAgICAgIChKU0Mp
OgorICAgICAgICAoSlNDOjpwYWRPcGNvZGVOYW1lKToKKyAgICAgICAgKiBieXRlY29tcGlsZXIv
Qnl0ZWNvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6
ZW1pdExvb3BIaW50KToKKyAgICAgICAgKEpTQyk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0TG9vcFByZUhlYWRlcik6CisgICAgICAgICogYnl0ZWNvbXBpbGVyL0J5dGVj
b2RlR2VuZXJhdG9yLmg6CisgICAgICAgIChCeXRlY29kZUdlbmVyYXRvcik6CisgICAgICAgICog
Ynl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHA6CisgICAgICAgIChKU0M6OkRvV2hpbGVOb2Rl
OjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpXaGlsZU5vZGU6OmVtaXRCeXRlY29kZSk6
CisgICAgICAgIChKU0M6OkZvck5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgIChKU0M6OkZv
ckluTm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKiBkZmcvREZHQWJzdHJhY3RTdGF0ZS5j
cHA6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6YmVnaW5CYXNpY0Jsb2NrKToK
KyAgICAgICAgKEpTQzo6REZHOjpBYnN0cmFjdFN0YXRlOjptZXJnZVN0YXRlQXRUYWlsKToKKyAg
ICAgICAgKiBkZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwOgorICAgICAgICAoQnl0ZUNvZGVQYXJz
ZXIpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAg
ICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2UpOgorICAgICAgICAqIGRmZy9E
RkdDYXBhYmlsaXRpZXMuaDoKKyAgICAgICAgKEpTQzo6REZHOjpjYW5Db21waWxlT3Bjb2RlKToK
KyAgICAgICAgKiBkZmcvREZHR3JhcGguY3BwOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjpk
dW1wKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGguaDoKKyAgICAgICAgKExvb3BQcmVIZWFkZXIp
OgorICAgICAgICAoREZHKToKKyAgICAgICAgKEdyYXBoKToKKyAgICAgICAgKiBkZmcvREZHSklU
Q29tcGlsZXIuaDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6bm90aWNlT1NSRW50
cnkpOgorICAgICAgICAqIGRmZy9ERkdOb2RlLmg6CisgICAgICAgIChKU0M6OkRGRzo6Tm9kZTo6
c2V0VmFyaWFibGVBY2Nlc3NEYXRhKToKKyAgICAgICAgKE5vZGUpOgorICAgICAgICAqIGRmZy9E
RkdQcm9wYWdhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpmaXhwb2lu
dCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cHJvcGFnYXRlTm9kZVByZWRpY3Rp
b25zKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpjb21wYXJlRXFJc1B1cmUpOgor
ICAgICAgICAoUHJvcGFnYXRvcik6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Y2xv
YmJlcnNXb3JsZCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybVN1YnN0
aXR1dGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6bG9jYWxDU0UpOgorICAg
ICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6TG9vcFNpZGVFZmZl
Y3RzKToKKyAgICAgICAgKExvb3BTaWRlRWZmZWN0cyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJv
cGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdEdldEdsb2JhbFZhcik6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdEdldEJ5VmFs
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNhbkhv
aXN0Q2hlY2tTdHJ1Y3R1cmUpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRCeU9mZnNldCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJv
cGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdEdldFByb3BlcnR5U3RvcmFnZSk6Cisg
ICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdEdl
dEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6
Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRBcnJheUxlbmd0aCk6CisgICAgICAgIChKU0M6
OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdEdldFN0cmluZ0xlbmd0
aCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9i
YmVyR2V0R2xvYmFsVmFyKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lk
ZUVmZmVjdHM6OmNsb2JiZXJHZXRCeVZhbCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRv
cjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUpOgorICAgICAgICAoSlND
OjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2xvYmJlckdldEJ5T2Zmc2V0KToK
KyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJH
ZXRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2xvYmJlckdldEFycmF5TGVu
Z3RoKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNs
b2JiZXJHZXRTdHJpbmdMZW5ndGgpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmFu
YWx5emVMb29wU2lkZUVmZmVjdHMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Omlz
SG9pc3RDYW5kaWRhdGUpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Om5vZGVDYW5C
ZUhvaXN0ZWQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnJlZmVyZW5jZU1heUJl
U2tpcHBlZE5vZGUpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnBlcmZvcm1Ib2lz
dCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6aG9pc3RHZXRMb2NhbCk6CisgICAg
ICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkV2l0aFNldExvY2FsKToK
KyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpmaXhIb2lzdGVkQ2hpbGQpOgorICAgICAg
ICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmhhbmRsZUhvaXN0ZWRDaGlsZCk6CisgICAgICAgIChK
U0M6OkRGRzo6UHJvcGFnYXRvcjo6aXNMb29wUHJlSGVhZGVyQmxvY2spOgorICAgICAgICAoSlND
OjpERkc6OlByb3BhZ2F0b3I6OmludGVyc2VjdCk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFn
YXRvcjo6Y29tcHV0ZURvbWluYXRvcnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6
OmNvcHlPdXRlckxvb3BJbnZhcmlhbnRzKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
OjpwZXJmb3JtTElDTSk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6bG9vcEludmFy
aWFudENvZGVNb3Rpb24pOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmFsbG9jYXRl
VmlydHVhbFJlZ2lzdGVycyk6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9y
bUJsb2NrQ0ZBKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwOgorICAgICAg
ICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKEpTQzo6REZH
OjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVVJbnQzMlRvTnVtYmVyKToKKyAgICAgICAgKiBkZmcv
REZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcDoK
KyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZSk6CisgICAgICAgICog
aW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwOgorICAgICAgICAoSlNDOjpJbnRlcnByZXRlcjo6
cHJpdmF0ZUV4ZWN1dGUpOgorICAgICAgICAqIGppdC9KSVQuY3BwOgorICAgICAgICAoSlNDOjpK
SVQ6OmVtaXRPcHRpbWl6YXRpb25DaGVjayk6CisgICAgICAgIChKU0M6OkpJVDo6cHJpdmF0ZUNv
bXBpbGVNYWluUGFzcyk6CisgICAgICAgICogaml0L0pJVC5oOgorICAgICAgICAoSklUKToKKyAg
ICAgICAgKEpTQzo6SklUOjplbWl0X29wX2xvb3BfaGludCk6CisgICAgICAgIChKU0MpOgorICAg
ICAgICAoSlNDOjpKSVQ6OmVtaXRfb3BfbG9vcF9wcmVoZWFkZXIpOgorCiAyMDEyLTAyLTAxICBN
aWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAgICAgICAgIFlhcnIgY3Jhc2gg
d2l0aCByZWdleHAgcmVwbGFjZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0NvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL0NvZGVCbG9jay5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDk0LDcgKzEw
OTQsMTIgQEAgdm9pZCBDb2RlQmxvY2s6OmR1bXAoRXhlY1N0YXRlKiBleGVjLCBjbwogICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBvcF9sb29wX2hpbnQ6IHsKLSAg
ICAgICAgICAgIHByaW50ZigiWyU0ZF0gbG9vcF9oaW50XG4iLCBsb2NhdGlvbik7CisgICAgICAg
ICAgICBpbnQgb2Zmc2V0ID0gKCsraXQpLT51Lm9wZXJhbmQ7CisgICAgICAgICAgICBwcmludGYo
IlslNGRdIGxvb3BfaGludFx0XHQgcHJlSGVhZGVyKC0+JWQpXG4iLCBsb2NhdGlvbiwgbG9jYXRp
b24gKyBvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBvcF9sb29wX3ByZWhlYWRlcjogeworICAgICAgICAgICAgcHJpbnRmKCJbJTRkXSBsb29wX3By
ZWhlYWRlclxuIiwgbG9jYXRpb24pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAg
ICAgICAgY2FzZSBvcF9zd2l0Y2hfaW1tOiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL09wY29kZS5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvT3Bjb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTE1Niw3ICsxNTYsOCBAQCBu
YW1lc3BhY2UgSlNDIHsKICAgICAgICAgbWFjcm8ob3BfbG9vcF9pZl9sZXNzZXEsIDQpIFwKICAg
ICAgICAgbWFjcm8ob3BfbG9vcF9pZl9ncmVhdGVyLCA0KSBcCiAgICAgICAgIG1hY3JvKG9wX2xv
b3BfaWZfZ3JlYXRlcmVxLCA0KSBcCi0gICAgICAgIG1hY3JvKG9wX2xvb3BfaGludCwgMSkgXAor
ICAgICAgICBtYWNybyhvcF9sb29wX2hpbnQsIDIpIFwKKyAgICAgICAgbWFjcm8ob3BfbG9vcF9w
cmVoZWFkZXIsIDEpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX2ltbSwgNCkgXAogICAgICAg
ICBtYWNybyhvcF9zd2l0Y2hfY2hhciwgNCkgXAogICAgICAgICBtYWNybyhvcF9zd2l0Y2hfc3Ry
aW5nLCA0KSBcCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVj
b2RlR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0
ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkocmV2aXNpb24gMTA2MzQzKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTY3OSwxMCArNjc5LDE5IEBAIFZhbHVlUHJvZmlsZSogQnl0ZWNvZGVH
ZW5lcmF0b3I6OmVtaXRQcm8KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIEJ5dGVjb2Rl
R2VuZXJhdG9yOjplbWl0TG9vcEhpbnQoKQordm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExv
b3BIaW50KExhYmVsKiBwcmVIZWFkZXIpCiB7CiAjaWYgRU5BQkxFKERGR19KSVQpCisgICAgc2l6
ZV90IGJlZ2luID0gaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpOwogICAgIGVtaXRPcGNvZGUob3BfbG9v
cF9oaW50KTsKKyAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQocHJlSGVhZGVyLT5iaW5kKGJlZ2lu
LCBpbnN0cnVjdGlvbnMoKS5zaXplKCkpKTsKKyNlbmRpZgorfQorCit2b2lkIEJ5dGVjb2RlR2Vu
ZXJhdG9yOjplbWl0TG9vcFByZUhlYWRlcigpCit7CisjaWYgRU5BQkxFKERGR19KSVQpCisgICAg
ZW1pdE9wY29kZShvcF9sb29wX3ByZWhlYWRlcik7CiAjZW5kaWYKIH0KIApJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0
b3IuaAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21w
aWxlci9CeXRlY29kZUdlbmVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNDUsNyArMzQ1LDgg
QEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIHZvaWQgZW1pdFRvUHJpbWl0aXZlKFJlZ2lzdGVy
SUQqIGRzdCwgUmVnaXN0ZXJJRCogc3JjKTsKIAogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBl
bWl0TGFiZWwoTGFiZWwqKTsKLSAgICAgICAgdm9pZCBlbWl0TG9vcEhpbnQoKTsKKyAgICAgICAg
dm9pZCBlbWl0TG9vcEhpbnQoTGFiZWwqIHByZUhlYWRlcik7CisgICAgICAgIHZvaWQgZW1pdExv
b3BQcmVIZWFkZXIoKTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdEp1bXAoTGFiZWwq
IHRhcmdldCk7CiAgICAgICAgIFBhc3NSZWZQdHI8TGFiZWw+IGVtaXRKdW1wSWZUcnVlKFJlZ2lz
dGVySUQqIGNvbmQsIExhYmVsKiB0YXJnZXQpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBl
bWl0SnVtcElmRmFsc2UoUmVnaXN0ZXJJRCogY29uZCwgTGFiZWwqIHRhcmdldCk7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4u
Y3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBp
bGVyL05vZGVzQ29kZWdlbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1MzAsOSArMTUzMCwxMyBA
QCBSZWdpc3RlcklEKiBEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5CiB7CiAgICAgUmVmUHRy
PExhYmVsU2NvcGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6
TG9vcCk7CiAKKyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5lcmF0b3IubmV3
TGFiZWwoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwor
ICAgIGdlbmVyYXRvci5lbWl0TG9vcFByZUhlYWRlcigpOworCiAgICAgUmVmUHRyPExhYmVsPiB0
b3BPZkxvb3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0b3IuZW1pdExhYmVs
KHRvcE9mTG9vcC5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludCgpOworICAgIGdl
bmVyYXRvci5lbWl0TG9vcEhpbnQobG9vcFByZUhlYWRlci5nZXQoKSk7CiAgICAgZ2VuZXJhdG9y
LmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGlu
ZSgpKTsKICAgIAogICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBnZW5lcmF0b3IuZW1p
dE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7CkBAIC0xNTU2LDE1ICsxNTYwLDE4IEBAIFJlZ2lzdGVy
SUQqIFdoaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGUKIHsKICAgICBSZWZQdHI8TGFiZWxTY29w
ZT4gc2NvcGUgPSBnZW5lcmF0b3IubmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsKIAor
ICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhlYWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwor
ICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJh
dG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5j
b250aW51ZVRhcmdldCgpKTsKIAogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJh
dG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkp
OwotICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsKLSAgICAKKwogICAgIGdlbmVyYXRvci5l
bWl0Tm9kZShkc3QsIG1fc3RhdGVtZW50KTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoc2Nv
cGUtPmNvbnRpbnVlVGFyZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQobG9vcFBy
ZUhlYWRlci5nZXQoKSk7CiAgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVT
dGF0ZW1lbnQsIG1fZXhwci0+bGluZU5vKCksIG1fZXhwci0+bGluZU5vKCkpOwogCiAgICAgaWYg
KG1fZXhwci0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVnZW4oKSkKQEAgLTE1OTEsMTIgKzE1OTgs
MTUgQEAgUmVnaXN0ZXJJRCogRm9yTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjbwogICAgIGlmICht
X2V4cHIxKQogICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSwgbV9leHByMSk7CiAKKyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5l
cmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIu
Z2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcFByZUhlYWRlcigpOworCiAgICAgUmVmUHRy
PExhYmVsPiBjb25kaXRpb24gPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0b3Iu
ZW1pdEp1bXAoY29uZGl0aW9uLmdldCgpKTsKIAogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29w
ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxv
b3AuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsKIAogICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiByZXN1bHQgPSBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7
CiAKQEAgLTE2MDYsNiArMTYxNiw3IEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRlY29k
ZShCeXRlY28KICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVyYXRvci5pZ25vcmVkUmVz
dWx0KCksIG1fZXhwcjMpOwogCiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChjb25kaXRpb24uZ2V0
KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQobG9vcFByZUhlYWRlci5nZXQoKSk7CiAg
ICAgaWYgKG1fZXhwcjIpIHsKICAgICAgICAgaWYgKG1fZXhwcjItPmhhc0NvbmRpdGlvbkNvbnRl
eHRDb2RlZ2VuKCkpCiAgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRpdGlvbkNv
bnRleHQobV9leHByMiwgdG9wT2ZMb29wLmdldCgpLCBzY29wZS0+YnJlYWtUYXJnZXQoKSwgZmFs
c2UpOwpAQCAtMTY0MCwxMSArMTY1MSwxNCBAQCBSZWdpc3RlcklEKiBGb3JJbk5vZGU6OmVtaXRC
eXRlY29kZShCeXRlCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNpemUgPSBnZW5lcmF0b3IubmV3
VGVtcG9yYXJ5KCk7CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGV4cGVjdGVkU3Vic2NyaXB0Owog
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiBpdGVyID0gZ2VuZXJhdG9yLmVtaXRHZXRQcm9wZXJ0eU5h
bWVzKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQoKSwgaS5nZXQoKSwgc2l6ZS5n
ZXQoKSwgc2NvcGUtPmJyZWFrVGFyZ2V0KCkpOworCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJl
SGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChs
b29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsK
ICAgICBnZW5lcmF0b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwogCiAgICAg
UmVmUHRyPExhYmVsPiBsb29wU3RhcnQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5l
cmF0b3IuZW1pdExhYmVsKGxvb3BTdGFydC5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRMb29w
SGludCgpOwogCiAgICAgUmVnaXN0ZXJJRCogcHJvcGVydHlOYW1lOwogICAgIGJvb2wgb3B0aW1p
emVkRm9yaW5BY2Nlc3MgPSBmYWxzZTsKQEAgLTE2OTAsNiArMTcwNCw3IEBAIFJlZ2lzdGVySUQq
IEZvckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGUKICAgICAgICAgZ2VuZXJhdG9yLnBvcE9wdGlt
aXNlZEZvckluKCk7CiAKICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5jb250aW51ZVRh
cmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0KCkp
OwogICAgIGdlbmVyYXRvci5lbWl0TmV4dFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUsIGJhc2Uu
Z2V0KCksIGkuZ2V0KCksIHNpemUuZ2V0KCksIGl0ZXIuZ2V0KCksIGxvb3BTdGFydC5nZXQoKSk7
CiAgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0
TGluZSgpLCBsYXN0TGluZSgpKTsKICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5icmVh
a1RhcmdldCgpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RT
dGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdBYnN0
cmFjdFN0YXRlLmNwcAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdBYnN0cmFjdFN0YXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTIsOCArOTIsNiBA
QCB2b2lkIEFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNCbG9jayhCYXNpCiAgICAgICAgIH0KICAg
ICB9CiAgICAgCi0gICAgYmFzaWNCbG9jay0+Y2ZhU2hvdWxkUmV2aXNpdCA9IGZhbHNlOwotICAg
IGJhc2ljQmxvY2stPmNmYUhhc1Zpc2l0ZWQgPSB0cnVlOwogICAgIG1fYmxvY2sgPSBiYXNpY0Js
b2NrOwogICAgIG1faXNWYWxpZCA9IHRydWU7CiB9CkBAIC05MzYsMTUgKzkzNCwyMCBAQCBpbmxp
bmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVN0YXRlQXRUCiAgICAgICAgIAogICAgIEFic3Ry
YWN0VmFsdWUqIHNvdXJjZTsKICAgICAgICAgCi0gICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbbm9k
ZUluZGV4XTsKLSAgICBpZiAoIW5vZGUucmVmQ291bnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIE5vZGUqIG5vZGVQdHIgPSAmbV9ncmFwaFtub2RlSW5kZXhdOworICAgIGlmICghbm9k
ZVB0ci0+cmVmQ291bnQoKSkgeworICAgICAgICBpZiAobm9kZVB0ci0+b3AgPT0gR2V0TG9jYWwp
IHsKKyAgICAgICAgICAgIEFTU0VSVChub2RlUHRyLT5jaGlsZDEoKSAhPSBOb05vZGUpOworICAg
ICAgICAgICAgbm9kZVB0ciA9ICZtX2dyYXBoW25vZGVQdHItPmNoaWxkMSgpXTsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIAogI2lmIERGR19F
TkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKICAgICAgICAgICAgIHByaW50ZigiICAg
ICAgICAgIEl0J3MgbGl2ZSwgbm9kZSBAJXUuXG4iLCBub2RlSW5kZXgpOwogI2VuZGlmCiAKLSAg
ICBzd2l0Y2ggKG5vZGUub3ApIHsKKyAgICBzd2l0Y2ggKG5vZGVQdHItPm9wKSB7CiAgICAgY2Fz
ZSBQaGk6CiAgICAgY2FzZSBTZXRBcmd1bWVudDoKICAgICBjYXNlIEZsdXNoOgpAQCAtOTY2LDcg
Kzk2OSw3IEBAIGlubGluZSBib29sIEFic3RyYWN0U3RhdGU6Om1lcmdlU3RhdGVBdFQKICAgICBj
YXNlIFNldExvY2FsOgogICAgICAgICAvLyBUaGUgYmxvY2sgc2V0cyB0aGUgdmFyaWFibGUsIGFu
ZCBwb3RlbnRpYWxseSByZWZpbmVzIGl0LCBib3RoCiAgICAgICAgIC8vIGJlZm9yZSBhbmQgYWZ0
ZXIgc2V0dGluZyBpdC4KLSAgICAgICAgc291cmNlID0gJmZvck5vZGUobm9kZS5jaGlsZDEoKSk7
CisgICAgICAgIHNvdXJjZSA9ICZmb3JOb2RlKG5vZGVQdHItPmNoaWxkMSgpKTsKICNpZiBERkdf
RU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgIHByaW50ZigiICAgICAg
ICAgIFNldHRpbmcuXG4iKTsKICNlbmRpZgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC05MTIsNiArOTEyLDkgQEAgcHJpdmF0ZToKICAgICAKICAgICAvLyBDYWNoZSBvZiBjb2Rl
IGJsb2NrcyB0aGF0IHdlJ3ZlIGdlbmVyYXRlZCBieXRlY29kZSBmb3IuCiAgICAgQnl0ZUNvZGVD
YWNoZTxjYW5JbmxpbmVGdW5jdGlvbkZvcj4gbV9jb2RlQmxvY2tDYWNoZTsKKworICAgIC8vIFN0
YWNrIHRvIHRyYWNrIHRoZSBsb29wcyBlbmNvdW50ZXJlZCBpbiB0aGlzIGNvZGUgYmxvY2sKKyAg
ICBWZWN0b3I8QmxvY2tJbmRleD4gbV9sb29wU3RhY2s7CiB9OwogCiAjZGVmaW5lIE5FWFRfT1BD
T0RFKG5hbWUpIFwKQEAgLTE5MjAsNiArMTkyMyw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBh
cnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9sb29wOiB7CiAgICAgICAgICAgICB1
bnNpZ25lZCByZWxhdGl2ZU9mZnNldCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7
CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEp1bXAsIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJl
bGF0aXZlT2Zmc2V0KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHko
KSk7CisgICAgICAgICAgICBtX2xvb3BTdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBM
QVNUX09QQ09ERShvcF9sb29wKTsKICAgICAgICAgfQogCkBAIC0xOTQxLDYgKzE5NDYsOCBAQCBi
b29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICB1bnNp
Z25lZCByZWxhdGl2ZU9mZnNldCA9IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CiAg
ICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsx
XS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChCcmFuY2gsIE9wSW5mbyhtX2N1
cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgT1BD
T0RFX0xFTkdUSChvcF9sb29wX2lmX3RydWUpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFT
U0VSVCghbV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJl
bW92ZUxhc3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfdHJ1ZSk7CiAg
ICAgICAgIH0KIApAQCAtMTk0OCw2ICsxOTU1LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFy
c2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgdW5zaWduZWQgcmVsYXRpdmVPZmZzZXQgPSBj
dXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwogICAgICAgICAgICAgTm9kZUluZGV4IGNv
bmRpdGlvbiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kKTsKICAgICAgICAg
ICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyBPUENPREVfTEVO
R1RIKG9wX2xvb3BfaWZfZmFsc2UpKSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgcmVsYXRpdmVP
ZmZzZXQpLCBjb25kaXRpb24pOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0Vt
cHR5KCkpOworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAg
ICAgTEFTVF9PUENPREUob3BfbG9vcF9pZl9mYWxzZSk7CiAgICAgICAgIH0KIApAQCAtMjA0NSw2
ICsyMDU0LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAg
ICAgICAgICAgTm9kZUluZGV4IG9wMiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVy
YW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBjb25kaXRpb24gPSBhZGRUb0dyYXBoKENvbXBh
cmVMZXNzLCBvcDEsIG9wMik7CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZv
KG1fY3VycmVudEluZGV4ICsgcmVsYXRpdmVPZmZzZXQpLCBPcEluZm8obV9jdXJyZW50SW5kZXgg
KyBPUENPREVfTEVOR1RIKG9wX2xvb3BfaWZfbGVzcykpLCBjb25kaXRpb24pOworICAgICAgICAg
ICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0VtcHR5KCkpOworICAgICAgICAgICAgbV9sb29wU3Rh
Y2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgTEFTVF9PUENPREUob3BfbG9vcF9pZl9sZXNz
KTsKICAgICAgICAgfQogCkBAIC0yMDU0LDYgKzIwNjUsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2Vy
OjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICBOb2RlSW5kZXggb3AyID0gZ2V0KGN1
cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IGNv
bmRpdGlvbiA9IGFkZFRvR3JhcGgoQ29tcGFyZUxlc3NFcSwgb3AxLCBvcDIpOwogICAgICAgICAg
ICAgYWRkVG9HcmFwaChCcmFuY2gsIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zm
c2V0KSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2xl
c3NlcSkpLCBjb25kaXRpb24pOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0Vt
cHR5KCkpOworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAg
ICAgTEFTVF9PUENPREUob3BfbG9vcF9pZl9sZXNzZXEpOwogICAgICAgICB9CiAKQEAgLTIwNjMs
NiArMjA3Niw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAg
ICAgICAgICAgIE5vZGVJbmRleCBvcDIgPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3Bl
cmFuZCk7CiAgICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gYWRkVG9HcmFwaChDb21w
YXJlR3JlYXRlciwgb3AxLCBvcDIpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChCcmFuY2gsIE9w
SW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1fY3VycmVudElu
ZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2dyZWF0ZXIpKSwgY29uZGl0aW9uKTsKKyAg
ICAgICAgICAgIEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1f
bG9vcFN0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3Bf
aWZfZ3JlYXRlcik7CiAgICAgICAgIH0KIApAQCAtMjA3Miw2ICsyMDg3LDggQEAgYm9vbCBCeXRl
Q29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgTm9kZUluZGV4IG9w
MiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5v
ZGVJbmRleCBjb25kaXRpb24gPSBhZGRUb0dyYXBoKENvbXBhcmVHcmVhdGVyRXEsIG9wMSwgb3Ay
KTsKICAgICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXgg
KyByZWxhdGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgo
b3BfbG9vcF9pZl9ncmVhdGVyZXEpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCgh
bV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxh
c3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfZ3JlYXRlcmVxKTsKICAg
ICAgICAgfQogCkBAIC0yMTYyLDcgKzIxNzksMTcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFy
c2VCbG9jayh1bnNpZ25lZAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBvcF9sb29wX2hpbnQ6
IHsKLSAgICAgICAgICAgIC8vIEJhc2VsaW5lLT5ERkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBo
aW50cy4gVGhlIERGRyBhc3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRworICAgICAgICAgICAgQVNT
RVJUX1VOVVNFRChibG9ja0JlZ2luLCBtX2N1cnJlbnRJbmRleCA9PSBibG9ja0JlZ2luKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gRW1pdCBhIHBoYW50b20gbm9kZSB0byBlbnN1cmUg
dGhhdCB0aGVyZSBpcyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIHRoaXMgYnl0ZWNvZGUKKyAgICAg
ICAgICAgIC8vIG9wLgorICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgTkVYVF9PUENPREUob3BfbG9vcF9oaW50KTsKKyAgICAgICAgfQor
CisgICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIC8vIEJhc2Vs
aW5lLT5ERkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBwcmVoZWFkZXJzLiBUaGUgREZHIGFzc3Vt
ZXMgdGhhdCBCYXNlbGluZS0+REZHCiAgICAgICAgICAgICAvLyBPU1IgY2FuIG9ubHkgaGFwcGVu
IGF0IGJhc2ljIGJsb2NrIGJvdW5kYXJpZXMuIEFzc2VydCB0aGF0IHRoZXNlIHR3byBzdGF0ZW1l
bnRzCiAgICAgICAgICAgICAvLyBhcmUgY29tcGF0aWJsZS4KICAgICAgICAgICAgIEFTU0VSVF9V
TlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdpbik7CkBAIC0yMTc3
LDcgKzIyMDQsMTMgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAog
ICAgICAgICAgICAgLy8gb3AuCiAgICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20pOwogICAg
ICAgICAgICAgCi0gICAgICAgICAgICBORVhUX09QQ09ERShvcF9sb29wX2hpbnQpOworICAgICAg
ICAgICAgQmxvY2tJbmRleCBjdXJyZW50QmxvY2sgPSBtX2dyYXBoLm1fYmxvY2tzLnNpemUoKSAt
IDE7CisgICAgICAgICAgICBCbG9ja0luZGV4IG91dGVyTG9vcCA9IG1fbG9vcFN0YWNrLmlzRW1w
dHkoKSA/IE5vQmxvY2sgOiBtX2xvb3BTdGFjay5sYXN0KCk7CisgICAgICAgICAgICBtX2xvb3BT
dGFjay5hcHBlbmQoY3VycmVudEJsb2NrKTsKKyAgICAgICAgICAgIExvb3BQcmVIZWFkZXIgcHJl
SGVhZGVyID0ge2N1cnJlbnRCbG9jaywgb3V0ZXJMb29wfTsKKyAgICAgICAgICAgIG1fZ3JhcGgu
bV9sb29wUHJlSGVhZGVycy5hcHBlbmQocHJlSGVhZGVyKTsKKworICAgICAgICAgICAgTkVYVF9P
UENPREUob3BfbG9vcF9wcmVoZWFkZXIpOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoK
QEAgLTI2MDgsNiArMjY0MSw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlKCkKICAgICBt
X2dyYXBoLm1fcHJlc2VydmVkVmFycyA9IG1fcHJlc2VydmVkVmFyczsKICAgICBtX2dyYXBoLm1f
bG9jYWxWYXJzID0gbV9udW1Mb2NhbHM7CiAgICAgbV9ncmFwaC5tX3BhcmFtZXRlclNsb3RzID0g
bV9wYXJhbWV0ZXJTbG90czsKKyAgICBtX2dyYXBoLm1fb3JpZ2luYWxTaXplID0gbV9ncmFwaC5z
aXplKCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTMw
LDYgKzEzMCw3IEBAIGlubGluZSBib29sIGNhbkNvbXBpbGVPcGNvZGUoT3Bjb2RlSUQgb3AKICAg
ICBjYXNlIG9wX2puZ3JlYXRlcjoKICAgICBjYXNlIG9wX2puZ3JlYXRlcmVxOgogICAgIGNhc2Ug
b3BfbG9vcF9oaW50OgorICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6CiAgICAgY2FzZSBvcF9s
b29wX2lmX2xlc3M6CiAgICAgY2FzZSBvcF9sb29wX2lmX2xlc3NlcToKICAgICBjYXNlIG9wX2xv
b3BfaWZfZ3JlYXRlcjoKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGgu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3Bw
CShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBo
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI2LDcgKzEyNiw3IEBAIHZvaWQgR3JhcGg6OmR1bXAo
Tm9kZUluZGV4IG5vZGVJbmRleCwgQ28KIAogICAgIHVuc2lnbmVkIHJlZkNvdW50ID0gbm9kZS5y
ZWZDb3VudCgpOwogICAgIGJvb2wgc2tpcHBlZCA9ICFyZWZDb3VudDsKLSAgICBib29sIG11c3RH
ZW5lcmF0ZSA9IG5vZGUubXVzdEdlbmVyYXRlKCk7CisgICAgYm9vbCBtdXN0R2VuZXJhdGUgPSBy
ZWZDb3VudCAmJiBub2RlLm11c3RHZW5lcmF0ZSgpOwogICAgIGlmIChtdXN0R2VuZXJhdGUpIHsK
ICAgICAgICAgQVNTRVJUKHJlZkNvdW50KTsKICAgICAgICAgLS1yZWZDb3VudDsKQEAgLTI5NCw3
ICsyOTQsNyBAQCB2b2lkIEdyYXBoOjpkdW1wKENvZGVCbG9jayogY29kZUJsb2NrKQogICAgICAg
ICBwcmludGYoIlxuIik7CiAgICAgfQogICAgIHByaW50ZigiUGhpIE5vZGVzOlxuIik7Ci0gICAg
Zm9yIChzaXplX3QgaSA9IG1fYmxvY2tzLmxhc3QoKS0+ZW5kOyBpIDwgc2l6ZSgpOyArK2kpCisg
ICAgZm9yIChzaXplX3QgaSA9IG1fYmxvY2tzLmxhc3QoKS0+ZW5kOyBpIDwgbV9vcmlnaW5hbFNp
emU7ICsraSkKICAgICAgICAgZHVtcChpLCBjb2RlQmxvY2spOwogfQogCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDYgKzYzLDEx
IEBAIHN0cnVjdCBSZXNvbHZlR2xvYmFsRGF0YSB7CiAgICAgdW5zaWduZWQgcmVzb2x2ZUluZm9J
bmRleDsKIH07CiAKK3N0cnVjdCBMb29wUHJlSGVhZGVyIHsKKyAgICBCbG9ja0luZGV4IGJsb2Nr
SW5kZXg7CisgICAgQmxvY2tJbmRleCBvdXRlckxvb3A7Cit9OworCiAvLyAKIC8vID09PSBHcmFw
aCA9PT0KIC8vCkBAIC0yMzksNiArMjQ0LDcgQEAgcHVibGljOgogICAgIH0KIAogICAgIFZlY3Rv
cjwgT3duUHRyPEJhc2ljQmxvY2s+ICwgOD4gbV9ibG9ja3M7CisgICAgVmVjdG9yPExvb3BQcmVI
ZWFkZXIsIDg+IG1fbG9vcFByZUhlYWRlcnM7CiAgICAgVmVjdG9yPE5vZGVJbmRleCwgMTY+IG1f
dmFyQXJnQ2hpbGRyZW47CiAgICAgVmVjdG9yPFN0b3JhZ2VBY2Nlc3NEYXRhPiBtX3N0b3JhZ2VB
Y2Nlc3NEYXRhOwogICAgIFZlY3RvcjxSZXNvbHZlR2xvYmFsRGF0YT4gbV9yZXNvbHZlR2xvYmFs
RGF0YTsKQEAgLTI0OSw2ICsyNTUsNyBAQCBwdWJsaWM6CiAgICAgQml0VmVjdG9yIG1fcHJlc2Vy
dmVkVmFyczsKICAgICB1bnNpZ25lZCBtX2xvY2FsVmFyczsKICAgICB1bnNpZ25lZCBtX3BhcmFt
ZXRlclNsb3RzOworICAgIHVuc2lnbmVkIG1fb3JpZ2luYWxTaXplOyAvLyBUaGUgZ3JhcGggc2l6
ZSBiZWZvcmUgd2UgZG8gb3B0aW1pemF0aW9ucyB3aGljaCB3aWxsIGV4cGFuZCB0aGUgZ3JhcGgu
CiBwcml2YXRlOgogICAgIAogICAgIC8vIFdoZW4gYSBub2RlJ3MgcmVmQ291bnQgZ29lcyBmcm9t
IDAgdG8gMSwgaXQgbXVzdCAobG9naWNhbGx5KSByZWN1cnNpdmVseSByZWYgYWxsIG9mIGl0cyBj
aGlsZHJlbiwgYW5kIHZpY2UgdmVyc2EuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyMSwxNCArMzIx
LDE0IEBAIHB1YmxpYzoKICAgICAgICAgLy8gdmFsdWUgb2YgKE5vbmUsIFtdKS4gQnV0IHRoZSBv
bGQgSklUIG1heSBzdGFzaCBzb21lIHZhbHVlcyB0aGVyZS4gU28gd2UgcmVhbGx5CiAgICAgICAg
IC8vIG5lZWQgKFRvcCwgVE9QKS4KICAgICAgICAgZm9yIChzaXplX3QgYXJndW1lbnQgPSAwOyBh
cmd1bWVudCA8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLm51bWJlck9mQXJndW1lbnRzKCk7
ICsrYXJndW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChiYXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVh
ZC5hcmd1bWVudChhcmd1bWVudCkgPT0gTm9Ob2RlKQorICAgICAgICAgICAgaWYgKCFiYXNpY0Js
b2NrLmNmYUhhc1Zpc2l0ZWQgfHwgYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQuYXJndW1lbnQo
YXJndW1lbnQpID09IE5vTm9kZSkKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9leHBlY3RlZFZh
bHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgpOwogICAgICAgICB9CiAgICAgICAgIGZv
ciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5u
dW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CiAgICAgICAgICAgICBOb2RlSW5kZXggbm9kZUlu
ZGV4ID0gYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwobG9jYWwpOwotICAgICAgICAg
ICAgaWYgKG5vZGVJbmRleCA9PSBOb05vZGUpCisgICAgICAgICAgICBpZiAoIWJhc2ljQmxvY2su
Y2ZhSGFzVmlzaXRlZCB8fCBub2RlSW5kZXggPT0gTm9Ob2RlKQogICAgICAgICAgICAgICAgIGVu
dHJ5LT5tX2V4cGVjdGVkVmFsdWVzLmxvY2FsKGxvY2FsKS5tYWtlVG9wKCk7Ci0gICAgICAgICAg
ICBlbHNlIGlmIChtX2dyYXBoW25vZGVJbmRleF0udmFyaWFibGVBY2Nlc3NEYXRhKCktPnNob3Vs
ZFVzZURvdWJsZUZvcm1hdCgpKQorICAgICAgICAgICAgaWYgKG5vZGVJbmRleCAhPSBOb05vZGUg
JiYgbV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3Vi
bGVGb3JtYXQoKSkKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9sb2NhbHNGb3JjZWREb3VibGUu
c2V0KGxvY2FsKTsKICAgICAgICAgfQogI2Vsc2UKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHTm9kZS5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDk5LDYgKzQ5OSwxMiBAQCBzdHJ1Y3QgTm9k
ZSB7CiAgICAgICAgIHJldHVybiB2YXJpYWJsZUFjY2Vzc0RhdGEoKS0+bG9jYWwoKTsKICAgICB9
CiAKKyAgICB2b2lkIHNldFZhcmlhYmxlQWNjZXNzRGF0YSh2b2lkKiBkYXRhKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKGhhc1ZhcmlhYmxlQWNjZXNzRGF0YSgpKTsKKyAgICAgICAgbV9vcEluZm8g
PSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGF0YSk7CisgICAgfQorCiAjaWZuZGVmIE5E
RUJVRwogICAgIGJvb2wgaGFzSWRlbnRpZmllcigpCiAgICAgewpAQCAtMTAzNSw3ICsxMDQxLDcg
QEAgc3RydWN0IE5vZGUgewogICAgIHsKICAgICAgICAgcmV0dXJuIG5vZGVDYW5TcGVjdWxhdGVJ
bnRlZ2VyKGFyaXRoTm9kZUZsYWdzKCkpOwogICAgIH0KLSAgICAKKwogI2lmbmRlZiBOREVCVUcK
ICAgICB2b2lkIGR1bXBDaGlsZHJlbihGSUxFKiBvdXQpCiAgICAgewpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdQcm9wYWdhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03NSw2ICs3NSwxMyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZ3JhcGguZHVtcChtX2Nv
ZGVCbG9jayk7CiAjZW5kaWYKIAorICAgICAgICBsb29wSW52YXJpYW50Q29kZU1vdGlvbigpOwor
CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmlu
dGYoIkdyYXBoIGFmdGVyIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uOlxuIik7CisgICAgICAg
IG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7CisjZW5kaWYKKwogICAgICAgICBhbGxvY2F0ZVZp
cnR1YWxSZWdpc3RlcnMoKTsKIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVS
Qk9TRSkKQEAgLTI4OSw3ICsyOTYsNyBAQCBwcml2YXRlOgogICAgIAogICAgIHZvaWQgcHJvcGFn
YXRlTm9kZVByZWRpY3Rpb25zKE5vZGUmIG5vZGUpCiAgICAgewotICAgICAgICBpZiAoIW5vZGUu
c2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkgJiYg
bm9kZS5vcCAhPSBTZXRMb2NhbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAg
ICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKQEAgLTExMDEsNiArMTEwOCwxMyBAQCBwcml2YXRl
OgogICAgICAgICByZXR1cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJl
ZGljdGlvbihyaWdodCk7CiAgICAgfQogICAgIAorICAgIGJvb2wgY29tcGFyZUVxSXNQdXJlKE5v
ZGUmIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gaXNQcmVkaWN0ZWROdW1lcmljYWwobm9k
ZSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KG1fZ3Jh
cGhbbm9kZS5jaGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0pCisgICAgICAgICAgICB8
fCBOb2RlOjpzaG91bGRTcGVjdWxhdGVBcnJheShtX2dyYXBoW25vZGUuY2hpbGQxKCldLCBtX2dy
YXBoW25vZGUuY2hpbGQyKCldKTsKKyAgICB9CisKICAgICBib29sIGxvZ2ljYWxOb3RJc1B1cmUo
Tm9kZSYgbm9kZSkKICAgICB7CiAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1f
Z3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpOwpAQCAtMTEyOCw4ICsxMTQyLDkgQEAg
cHJpdmF0ZToKICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgogICAgICAgICBjYXNlIENvbXBh
cmVHcmVhdGVyOgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6Ci0gICAgICAgIGNhc2Ug
Q29tcGFyZUVxOgogICAgICAgICAgICAgcmV0dXJuICFpc1ByZWRpY3RlZE51bWVyaWNhbChub2Rl
KTsKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICByZXR1cm4gIWNvbXBhcmVF
cUlzUHVyZShub2RlKTsKICAgICAgICAgY2FzZSBMb2dpY2FsTm90OgogICAgICAgICAgICAgcmV0
dXJuICFsb2dpY2FsTm90SXNQdXJlKG5vZGUpOwogICAgICAgICBjYXNlIEdldEJ5VmFsOgpAQCAt
MTQyMyw3ICsxNDM4LDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBlcmZvcm1TdWJzdGl0dXRpb24o
Tm9kZUluZGV4JiBjaGlsZCwgYm9vbCBhZGRSZWYgPSB0cnVlKQogICAgIHsKICAgICAgICAgLy8g
Q2hlY2sgaWYgdGhpcyBvcGVyYW5kIGlzIGFjdHVhbGx5IHVudXNlZC4KLSAgICAgICAgaWYgKGNo
aWxkID09IE5vTm9kZSkKKyAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSB8fCBjaGlsZCA+PSBt
X3JlcGxhY2VtZW50cy5zaXplKCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAogICAg
ICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcmVwbGFjZW1lbnQuCkBAIC0xNDM1LDEwICsx
NDUwLDEwIEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICAvLyBUaGVyZSBpcyBkZWZpbml0
ZWx5IGEgcmVwbGFjZW1lbnQuIEFzc2VydCB0aGF0IHRoZSByZXBsYWNlbWVudCBkb2VzIG5vdAog
ICAgICAgICAvLyBoYXZlIGEgcmVwbGFjZW1lbnQuCi0gICAgICAgIEFTU0VSVChtX3JlcGxhY2Vt
ZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkID49IG1fcmVwbGFj
ZW1lbnRzLnNpemUoKSB8fCBtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKICAgICAg
ICAgCiAgICAgICAgIGlmIChhZGRSZWYpCi0gICAgICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYo
KTsKKyAgICAgICAgICAgIHJlZmVyZW5jZU1heUJlU2tpcHBlZE5vZGUoY2hpbGQpOwogICAgIH0K
ICAgICAKICAgICB2b2lkIHNldFJlcGxhY2VtZW50KE5vZGVJbmRleCByZXBsYWNlbWVudCkKQEAg
LTE2MzksNiArMTY1NCw3NTggQEAgcHJpdmF0ZToKICNlbmRpZgogICAgICAgICBmb3IgKHVuc2ln
bmVkIGJsb2NrID0gMDsgYmxvY2sgPCBtX2dyYXBoLm1fYmxvY2tzLnNpemUoKTsgKytibG9jaykK
ICAgICAgICAgICAgIHBlcmZvcm1CbG9ja0NTRSgqbV9ncmFwaC5tX2Jsb2Nrc1tibG9ja10pOwor
CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3JlcGxhY2VtZW50cy5zaXplKCk7
ICsraSkKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0gTm9Ob2RlOworICAgIH0KKyAg
ICAKKyNkZWZpbmUgTUFYX0hPSVNURURfTE9PUF9JTlZBUklBTlRTIDI1NgorCisgICAgc3RydWN0
IExvb3BTaWRlRWZmZWN0cyB7CisgICAgICAgIGVudW0gQ2xvYmJlcktpbmQgeworICAgICAgICAg
ICAgQ2xvYmJlckdldEdsb2JhbFZhciwKKyAgICAgICAgICAgIENsb2JiZXJHZXRCeVZhbCwKKyAg
ICAgICAgICAgIENsb2JiZXJDaGVja1N0cnVjdHVyZSwKKyAgICAgICAgICAgIENsb2JiZXJHZXRC
eU9mZnNldCwKKyAgICAgICAgICAgIENsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UsCisgICAgICAg
ICAgICBDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSwKKyAgICAgICAgICAgIENsb2Ji
ZXJHZXRBcnJheUxlbmd0aCwKKyAgICAgICAgICAgIENsb2JiZXJHZXRTdHJpbmdMZW5ndGgKKyAg
ICAgICAgfTsKKworICAgICAgICBMb29wU2lkZUVmZmVjdHMoQmxvY2tJbmRleCBwcmVIZWFkZXIp
CisgICAgICAgICAgICA6IHByZUhlYWRlckluZGV4KHByZUhlYWRlcikKKyAgICAgICAgeworICAg
ICAgICB9CisKKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEdsb2JhbFZhcigpIHsgcmV0dXJuICFj
bG9iYmVycy5nZXQoQ2xvYmJlckdldEdsb2JhbFZhcik7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lz
dEdldEJ5VmFsKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0QnlWYWwpOyB9Cisg
ICAgICAgIGJvb2wgY2FuSG9pc3RDaGVja1N0cnVjdHVyZSgpIHsgcmV0dXJuICFjbG9iYmVycy5n
ZXQoQ2xvYmJlckNoZWNrU3RydWN0dXJlKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0QnlP
ZmZzZXQoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRCeU9mZnNldCk7IH0KKyAg
ICAgICAgYm9vbCBjYW5Ib2lzdEdldFByb3BlcnR5U3RvcmFnZSgpIHsgcmV0dXJuICFjbG9iYmVy
cy5nZXQoQ2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lz
dEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2Ji
ZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0
QXJyYXlMZW5ndGgoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRBcnJheUxlbmd0
aCk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldFN0cmluZ0xlbmd0aCgpIHsgcmV0dXJuICFj
bG9iYmVycy5nZXQoQ2xvYmJlckdldFN0cmluZ0xlbmd0aCk7IH0KKworICAgICAgICB2b2lkIGNs
b2JiZXJHZXRHbG9iYWxWYXIoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0R2xvYmFsVmFyKTsg
fQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRCeVZhbCgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJH
ZXRCeVZhbCk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUoKSB7IGNsb2Ji
ZXJzLnNldChDbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdl
dEJ5T2Zmc2V0KCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEJ5T2Zmc2V0KTsgfQorICAgICAg
ICB2b2lkIGNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVy
R2V0UHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRJbmRleGVkUHJv
cGVydHlTdG9yYWdlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0
b3JhZ2UpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldEFycmF5TGVuZ3RoKCkgeyBjbG9iYmVy
cy5zZXQoQ2xvYmJlckdldEFycmF5TGVuZ3RoKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRT
dHJpbmdMZW5ndGgoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0U3RyaW5nTGVuZ3RoKTsgfQor
CisgICAgICAgIFZlY3RvcjxpbnQsIDg+IHBvbGx1dGVkTG9jYWxzOworICAgICAgICBWZWN0b3I8
dW5zaWduZWQsIDQ+IHBvbGx1dGVkR2xvYmFsczsKKyAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwg
ND4gbm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzOworICAgICAgICBWZWN0b3I8dW5zaWduZWQs
IDQ+IHBvbGx1dGVkSWRlbnRpZmllcnM7CisgICAgICAgIFZlY3RvcjxpbnQsIDg+IGdldExvY2Fs
czsKKyAgICAgICAgQml0VmVjdG9yIGNsb2JiZXJzOworICAgICAgICBCbG9ja0luZGV4IHByZUhl
YWRlckluZGV4OworICAgIH07CisKKyAgICB2b2lkIGFuYWx5emVMb29wU2lkZUVmZmVjdHMoTm9k
ZUluZGV4IGxvb3BCZWdpbiwgTm9kZUluZGV4IGxvb3BFbmQsIExvb3BTaWRlRWZmZWN0cyYgbG9v
cEluZm8pCisgICAgeworICAgICAgICBmb3IgKE5vZGVJbmRleCBpbmRleCA9IGxvb3BCZWdpbjsg
aW5kZXggPCBsb29wRW5kOyBpbmRleCsrKSB7CisgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9n
cmFwaFtpbmRleF07CisKKyAgICAgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzd2l0Y2ggKG5vZGUub3Ap
IHsKKyAgICAgICAgICAgIGNhc2UgUHV0QnlWYWw6CisgICAgICAgICAgICBjYXNlIFB1dEJ5VmFs
QWxpYXM6CisgICAgICAgICAgICAgICAgLy8gSWYgUHV0QnlWYWwgc3BlY3VsYXRlcyB0aGF0IGl0
J3MgYWNjZXNzaW5nIGFuIGFycmF5IHdpdGggYW4KKyAgICAgICAgICAgICAgICAvLyBpbnRlZ2Vy
IGluZGV4LCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1c2UgYSBzdHJ1Y3R1cmUK
KyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKCFieVZhbElz
UHVyZShub2RlKSkgeworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyQ2hlY2tT
dHJ1Y3R1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5T2Zm
c2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRQcm9wZXJ0eVN0
b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHV0QnlWYWxBbGlhcyBjYW4ndCBjaGFu
Z2UgdGhlIGluZGV4ZWQgc3RvcmFnZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIGlmIChu
b2RlLm9wID09IFB1dEJ5VmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xv
YmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
aWYgKG5vZGUub3AgPT0gUHV0QnlWYWwgJiYgIWlzRml4ZWRJbmRleGVkU3RvcmFnZU9iamVjdFBy
ZWRpY3Rpb24obV9ncmFwaFtub2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCkpKQorICAgICAgICAg
ICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOwor
ICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYXNzdW1lIHRoYXQgdGhlIFB1dEJ5VmFsIHdpbGwg
Y2xvYmJlciB0aGUgbG9jYXRpb24gd2UncmUgZ2V0dGluZyBmcm9tLgorICAgICAgICAgICAgICAg
IC8vIEZJWE1FOiBXZSBjYW4gZG8gYmV0dGVyOyBpZiB3ZSBrbm93IHRoYXQgdGhlIFB1dEJ5VmFs
IGlzIGFjY2Vzc2luZyBhbiBhcnJheSBvZiBhCisgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50
IHR5cGUgdGhhbiB0aGUgR2V0QnlWYWwsIHRoZW4gd2Uga25vdyB0aGF0IHRoZXkgd29uJ3QgY2xv
YmJlciBlYWNoIG90aGVyLgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeVZh
bCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRTdHJ1Y3R1
cmU6CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBvciBwdXR0aW5n
IHRvIHRoZSBzdG9yYWdlIGNhbm5vdAorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgcHJv
cGVydHkgc3RvcmFnZSBwb2ludGVyLgorICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIHRoZSBz
dHJ1Y3R1cmUgY2Fubm90IGNoYW5nZSB0aGUgb3V0Y29tZSBvZiBhIHByb3BlcnR5IGdldC4KKyAg
ICAgICAgICAgICAgICBsb29wSW5mby5ub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXMuYXBwZW5k
KG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBQdXRCeU9mZnNldDoKKyAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIGEgcHJvcGVydHkgY2Fu
bm90IGNoYW5nZSB0aGUgc3RydWN0dXJlLgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLnBvbGx1
dGVkSWRlbnRpZmllcnMuYXBwZW5kKG1fZ3JhcGgubV9zdG9yYWdlQWNjZXNzRGF0YVtub2RlLnN0
b3JhZ2VBY2Nlc3NEYXRhSW5kZXgoKV0uaWRlbnRpZmllck51bWJlcik7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFycmF5UG9wOgorICAgICAgICAgICAgICAgIGxv
b3BJbmZvLmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3Vn
aC4KKyAgICAgICAgICAgIGNhc2UgQXJyYXlQdXNoOgorICAgICAgICAgICAgICAgIC8vIEEgcHVz
aCBjYW5ub3QgYWZmZWN0IHByZXZpb3VzbHkgZXhpc3RpbmcgZWxlbWVudHMgaW4gdGhlIGFycmF5
LgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRBcnJheUxlbmd0aCgpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRHbG9iYWxWYXI6CisgICAg
ICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRHbG9iYWxzLmFwcGVuZChub2RlLnZhck51bWJl
cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2V0TG9jYWw6
CisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuYXBwZW5kKG5vZGUubG9j
YWwoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdldExvY2Fs
OgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmdldExvY2Fscy5hcHBlbmQobm9kZS5sb2NhbCgp
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgaWYgKGNsb2JiZXJzV29ybGQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAg
IGxvb3BJbmZvLmNsb2JiZXJDaGVja1N0cnVjdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBs
b29wSW5mby5jbG9iYmVyR2V0QnlPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcElu
Zm8uY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgICAgICBsb29w
SW5mby5jbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAg
ICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlWYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9v
cEluZm8uY2xvYmJlckdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJ
bmZvLmNsb2JiZXJHZXRTdHJpbmdMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5v
ZGUub3AgPT0gQ2FsbCB8fCBub2RlLm9wID09IENvbnN0cnVjdCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRHbG9iYWxWYXIoKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBib29sIGlzSG9pc3RDYW5kaWRhdGUoTm9kZSYgbm9kZSwgTG9vcFNpZGVFZmZlY3Rz
JiBsb29wSW5mbykKKyAgICB7CisgICAgICAgIGJvb2wgaXNDYW5kaWRhdGUgPSBmYWxzZTsKKwor
ICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKKworICAgICAgICBjYXNlIENvbnZlcnRUaGlzOgor
ICAgICAgICBjYXNlIEdldENhbGxlZToKKyAgICAgICAgY2FzZSBDaGVja0Z1bmN0aW9uOgorICAg
ICAgICBjYXNlIFN0cmluZ0NoYXJDb2RlQXQ6CisgICAgICAgIGNhc2UgU3RyaW5nQ2hhckF0Ogor
ICAgICAgICBjYXNlIENoZWNrSGFzSW5zdGFuY2U6CisgICAgICAgIGNhc2UgSW5zdGFuY2VPZjoK
KyAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgIGNhc2UgQml0QW5kOgorICAg
ICAgICBjYXNlIEJpdE9yOgorICAgICAgICBjYXNlIEJpdFhvcjoKKyAgICAgICAgY2FzZSBCaXRM
U2hpZnQ6CisgICAgICAgIGNhc2UgQml0UlNoaWZ0OgorICAgICAgICBjYXNlIEJpdFVSU2hpZnQ6
CisgICAgICAgIGNhc2UgVmFsdWVUb0ludDMyOgorICAgICAgICBjYXNlIFVJbnQzMlRvTnVtYmVy
OgorICAgICAgICBjYXNlIEFyaXRoQWRkOgorICAgICAgICBjYXNlIEFyaXRoU3ViOgorICAgICAg
ICBjYXNlIEFyaXRoTXVsOgorICAgICAgICBjYXNlIEFyaXRoTW9kOgorICAgICAgICBjYXNlIEFy
aXRoRGl2OgorICAgICAgICBjYXNlIEFyaXRoQWJzOgorICAgICAgICBjYXNlIEFyaXRoTWluOgor
ICAgICAgICBjYXNlIEFyaXRoTWF4OgorICAgICAgICBjYXNlIEFyaXRoU3FydDoKKyAgICAgICAg
Y2FzZSBWYWx1ZVRvTnVtYmVyOgorICAgICAgICBjYXNlIFZhbHVlVG9Eb3VibGU6CisgICAgICAg
IGNhc2UgSlNDb25zdGFudDoKKyAgICAgICAgY2FzZSBXZWFrSlNDb25zdGFudDoKKyAgICAgICAg
ICAgIGlzQ2FuZGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFZhbHVlQWRkOgorICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICBjYXNlIENvbXBh
cmVMZXNzRXE6CisgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6CisgICAgICAgIGNhc2UgQ29t
cGFyZUdyZWF0ZXJFcToKKyAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICBpc0Nh
bmRpZGF0ZSA9IGlzUHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgTG9naWNhbE5vdDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9n
aWNhbE5vdElzUHVyZShub2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENo
ZWNrU3RydWN0dXJlOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lz
dENoZWNrU3RydWN0dXJlKCkgJiYgIWxvb3BJbmZvLm5vZGVzV2l0aFBvbGx1dGVkU3RydWN0dXJl
cy5jb250YWlucyhub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEdldEJ5VmFsOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBieVZhbElzUHVyZShub2Rl
KSAmJiBsb29wSW5mby5jYW5Ib2lzdEdldEJ5VmFsKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBHZXRQcm9wZXJ0eVN0b3JhZ2U6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9
IGxvb3BJbmZvLmNhbkhvaXN0R2V0UHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlOgorICAgICAgICAgICAg
aXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2Uo
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEJ5T2Zmc2V0OgorICAgICAg
ICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEJ5T2Zmc2V0KCkgJiYgIWxv
b3BJbmZvLnBvbGx1dGVkSWRlbnRpZmllcnMuY29udGFpbnMobV9ncmFwaC5tX3N0b3JhZ2VBY2Nl
c3NEYXRhW25vZGUuc3RvcmFnZUFjY2Vzc0RhdGFJbmRleCgpXS5pZGVudGlmaWVyTnVtYmVyKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEFycmF5TGVuZ3RoOgorICAgICAg
ICBjYXNlIEdldEJ5dGVBcnJheUxlbmd0aDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9v
cEluZm8uY2FuSG9pc3RHZXRBcnJheUxlbmd0aCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgR2V0U3RyaW5nTGVuZ3RoOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29w
SW5mby5jYW5Ib2lzdEdldFN0cmluZ0xlbmd0aCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgR2V0R2xvYmFsVmFyOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5m
by5jYW5Ib2lzdEdldEdsb2JhbFZhcigpICYmICFsb29wSW5mby5wb2xsdXRlZEdsb2JhbHMuY29u
dGFpbnMobm9kZS52YXJOdW1iZXIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBHZXRMb2NhbDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gIWxvb3BJbmZvLnBvbGx1dGVk
TG9jYWxzLmNvbnRhaW5zKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgLy8gRGFuZ2Vyb3VzISBQYXkgbW9yZSBhdHRlbnRpb24gcGxlYXNlLgorICAgICAgICBjYXNl
IFNldExvY2FsOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSAhbG9vcEluZm8ucG9sbHV0ZWRM
b2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgpKSAmJiAhbG9vcEluZm8uZ2V0TG9jYWxzLmNvbnRh
aW5zKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlzQ2FuZGlk
YXRlOworICAgIH0KKworICAgIGJvb2wgbm9kZUNhbkJlSG9pc3RlZChOb2RlJiBub2RlLCBCYXNp
Y0Jsb2NrJiB0YXJnZXRCbG9jaywgVmVjdG9yPE5vZGVJbmRleCwgMz4mIGhvaXN0ZWRDaGlsZHJl
bikKKyAgICB7CisgICAgICAgIGJvb2wgY2FuSG9pc3QgPSB0cnVlOworCisgICAgICAgIGlmIChu
b2RlLm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hp
bGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSAr
IG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgIE5vZGVJ
bmRleCBjaGlsZCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07CisgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgICAgICBOb2Rl
SW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07CisgICAgICAgICAgICAg
ICAgICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVu
dCA8IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGls
ZHJlbi5hcHBlbmQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZDEg
PSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgIE5vZGVJbmRleCBjaGls
ZDIgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMjsKKyAgICAgICAgICAgIE5vZGVJbmRleCBj
aGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAgICAgaWYgKGNo
aWxkMSAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQg
PSBtX3JlcGxhY2VtZW50c1tjaGlsZDFdOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVu
dCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVuZCkK
KyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZDEpOworICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlKSB7CisgICAg
ICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGQy
XTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFyZ2V0QmxvY2suYmVnaW4g
JiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAgICAgICAgICAgICAgIGhv
aXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGVJbmRleCBy
ZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkM107CisgICAgICAgICAgICAgICAgaWYg
KHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0
QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW4uYXBwZW5kKGNo
aWxkMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lz
dCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNh
bkhvaXN0OworICAgIH0KKworICAgIHZvaWQgcmVmZXJlbmNlTWF5QmVTa2lwcGVkTm9kZShOb2Rl
SW5kZXggaW5kZXgpCisgICAgeworICAgICAgICBpZiAoaW5kZXggPT0gTm9Ob2RlIHx8ICFtX2dy
YXBoW2luZGV4XS5yZWYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJdCBi
ZWNvbWVzIG1vcmUgY29tcGxleCBpZiB0aGUgcmVmZXJlbmNlIGlzIGEgc2tpcHBlZCBub2RlLgor
ICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSByZWZlcmVuY2UgY2hhaW4gdG8gZml4
IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICAgICBWZWN0b3I8Tm9kZUluZGV4LCA0PiBza2lw
cGVkTm9kZXM7CisgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoaW5kZXgpOworCisgICAgICAg
IHdoaWxlICghc2tpcHBlZE5vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9kZUluZGV4
IHNraXBwZWRJbmRleCA9IHNraXBwZWROb2Rlcy5sYXN0KCk7CisgICAgICAgICAgICBza2lwcGVk
Tm9kZXMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbc2tp
cHBlZEluZGV4XTsKKworICAgICAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlTXVzdEdlbmVyYXRl
KQorICAgICAgICAgICAgICAgIG5vZGUucmVmKCk7CisKKyAgICAgICAgICAgIGlmIChub2RlLm9w
ICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxk
SWR4ID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5maXJzdENoaWxkKCkgKyBu
b2RlLm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9k
ZUluZGV4IGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07CisgICAg
ICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkeF0ucmVmKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkeCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQx
ID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDE7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4
IGNoaWxkMiA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyOworICAgICAgICAgICAgICAgIE5v
ZGVJbmRleCBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAg
ICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmIG1fZ3JhcGhbY2hpbGQxXS5yZWYoKSkKKyAg
ICAgICAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFwcGVuZChjaGlsZDEpOworCisgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUgJiYgbV9ncmFwaFtjaGlsZDJdLnJlZigpKQor
ICAgICAgICAgICAgICAgICAgICBza2lwcGVkTm9kZXMuYXBwZW5kKGNoaWxkMik7CisKKyAgICAg
ICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSAmJiBtX2dyYXBoW2NoaWxkM10ucmVmKCkp
CisgICAgICAgICAgICAgICAgICAgIHNraXBwZWROb2Rlcy5hcHBlbmQoY2hpbGQzKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUhvaXN0KE5vZGVJ
bmRleCBpbmRleCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVuc2lnbmVkJiBob2lzdGVkLCBi
b29sIGFkanVzdFJlZiA9IHRydWUpCisgICAgeworICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFw
aFtpbmRleF07CisKKyAgICAgICAgaWYgKCFob2lzdGVkKQorICAgICAgICAgICAgdGFyZ2V0Qmxv
Y2suYmVnaW4gPSBtX2dyYXBoLnNpemUoKTsKKworICAgICAgICBtX2dyYXBoLmFwcGVuZChub2Rl
KTsKKyAgICAgICAgTm9kZSYgcmVwbGFjZW1lbnQgPSBtX2dyYXBoLmxhc3QoKTsKKyAgICAgICAg
aWYgKGFkanVzdFJlZikKKyAgICAgICAgICAgIHJlcGxhY2VtZW50LnNldFJlZkNvdW50KCFub2Rl
Lmhhc1Jlc3VsdCgpICYmIChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkgPyAxIDogMCk7Cisg
ICAgICAgIC8vIE9ubHkgcGVyZm9ybSBjaGlsZHJlbiBzdWJzdGl0dXRpb24gZm9yIHRoZSByZXBs
YWNlbWVudCBub2RlLgorICAgICAgICBpZiAocmVwbGFjZW1lbnQub3AgJiBOb2RlSGFzVmFyQXJn
cykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IHJlcGxhY2VtZW50LmZp
cnN0Q2hpbGQoKTsgY2hpbGRJZHggPCByZXBsYWNlbWVudC5maXJzdENoaWxkKCkgKyByZXBsYWNl
bWVudC5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAgICAgICAgICAgICAgIHBlcmZvcm1T
dWJzdGl0dXRpb24obV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XSwgcmVwbGFjZW1l
bnQucmVmQ291bnQoKSk7IC8vIERvbid0IHJlZmVyZW5jZSB0aGUgbmV3IGNoaWxkIGhlcmUuCisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2Vt
ZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSwgYWRqdXN0UmVmICYmIHJlcGxhY2VtZW50LnJlZkNv
dW50KCkpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihyZXBsYWNlbWVudC5jaGls
ZHJlbi5maXhlZC5jaGlsZDIsIGFkanVzdFJlZiAmJiByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsK
KyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4
ZWQuY2hpbGQzLCBhZGp1c3RSZWYgJiYgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAgICAg
IH0KKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIHBy
aW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBAJXUiLCBpbmRleCwgbV9ncmFwaC5zaXplKCkgLSAx
KTsKKyNlbmRpZgorICAgICAgICBtX3JlcGxhY2VtZW50c1tpbmRleF0gPSBtX2dyYXBoLnNpemUo
KSAtIDE7CisgICAgICAgIE5vZGUmIG5ld05vZGUgPSBtX2dyYXBoW2luZGV4XTsgLy8gVGhpcyBj
YW4gZGlmZmVyIGZyb20gIm5vZGUiIGJlY2F1c2UgbV9ncmFwaCBpcyBleHBhbmRlZAorICAgICAg
ICBpZiAoYWRqdXN0UmVmKQorICAgICAgICAgICAgbmV3Tm9kZS5zZXRSZWZDb3VudCgwKTsKKyAg
ICAgICAgKytob2lzdGVkOworICAgICAgICB0YXJnZXRCbG9jay5lbmQgPSBtX2dyYXBoLnNpemUo
KTsKKyAgICB9CisKKyAgICB2b2lkIGhvaXN0R2V0TG9jYWwoTm9kZUluZGV4IGluZGV4LCBCYXNp
Y0Jsb2NrJiB0YXJnZXRCbG9jaywgdW5zaWduZWQmIGhvaXN0ZWQsIGJvb2wgYWRqdXN0UmVmID0g
dHJ1ZSkKKyAgICB7CisgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKKyAgICAg
ICAgQVNTRVJUKG5vZGUub3AgPT0gR2V0TG9jYWwpOworCisjaWYgREZHX0VOQUJMRShERUJVR19Q
Uk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIiAgICVzIEAldTogIiwgR3JhcGg6
Om9wTmFtZShtX2dyYXBoW2luZGV4XS5vcCksIGluZGV4KTsKKyNlbmRpZgorCisgICAgICAgIGlm
IChub2RlLmNoaWxkMSgpID09IE5vTm9kZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICBpbnQgb3BlcmFuZCA9IG5vZGUubG9jYWwoKTsKKyAgICAgICAgTm9kZUluZGV4IGxhc3REZWZp
bmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQp
KQorICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gdGFyZ2V0QmxvY2sudmFyaWFibGVzQXRU
YWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gdGFyZ2V0QmxvY2sudmFyaWFibGVzQXRUYWls
LmxvY2FsKG9wZXJhbmQpOworCisgICAgICAgIEFTU0VSVChsYXN0RGVmaW5lSW5kZXggIT0gTm9O
b2RlKTsKKyAgICAgICAgTm9kZSYgbGFzdERlZmluZSA9IG1fZ3JhcGhbbGFzdERlZmluZUluZGV4
XTsKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gR2V0TG9jYWwpIHsKKyNpZiBERkdfRU5B
QkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICBwcmludGYoIiAgIFJl
cGxhY2luZyBAJXUgLT4gQCV1XG4iLCBpbmRleCwgbGFzdERlZmluZUluZGV4KTsKKyNlbmRpZgor
ICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbaW5kZXhdID0gbGFzdERlZmluZUluZGV4OworICAg
ICAgICAgICAgaWYgKGFkanVzdFJlZikKKyAgICAgICAgICAgICAgICBub2RlLnNldFJlZkNvdW50
KDApOworICAgICAgICAgICAgcmV0dXJuOyAvLyBXZSdyZSBkb25lLgorICAgICAgICB9CisKKyAg
ICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gU2V0TG9jYWwpIHsKKyAgICAgICAgICAgIC8vIFdl
IHNob3VsZCBub3QgcmVhY2ggaGVyZSBiZWNhdXNlIGEgU2V0TG9jYWwgd2l0aCB0aGlzIG9wZXJh
bmQKKyAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgaG9pc3RlZCB0byB0aGlzIGJsb2NrIAor
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAobGFzdERlZmluZS5vcCA9PSBQaGkpIHsKKyAgICAgICAgICAgIGlmICghaG9pc3RlZCkKKyAg
ICAgICAgICAgICAgICB0YXJnZXRCbG9jay5iZWdpbiA9IG1fZ3JhcGguc2l6ZSgpOworICAgICAg
ICAgICAgbV9ncmFwaC5hcHBlbmQobV9ncmFwaFtpbmRleF0pOworICAgICAgICAgICAgTm9kZSYg
Z2V0TG9jYWxOb2RlID0gbV9ncmFwaFtpbmRleF07CisgICAgICAgICAgICBOb2RlJiBnZXRMb2Nh
bFJlcGxhY2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgICAgICBnZXRMb2NhbFJlcGxh
Y2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSA9IGxhc3REZWZpbmVJbmRleDsKKyAgICAgICAg
ICAgIG1fcmVwbGFjZW1lbnRzW2luZGV4XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsKKyNpZiBERkdf
RU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICBwcmludGYoIiAg
IFJlcGxhY2luZyBAJXUgLT4gQCV1XG4iLCBpbmRleCwgbV9ncmFwaC5zaXplKCkgLSAxKTsKKyNl
bmRpZgorICAgICAgICAgICAgaWYgKGFkanVzdFJlZikgeworICAgICAgICAgICAgICAgIGdldExv
Y2FsUmVwbGFjZW1lbnQuc2V0UmVmQ291bnQoMCk7CisgICAgICAgICAgICAgICAgZ2V0TG9jYWxO
b2RlLnNldFJlZkNvdW50KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytob2lzdGVk
OworICAgICAgICAgICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAg
ICAgICAgIGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkKKyAgICAgICAgICAgICAgICB0
YXJnZXRCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3Bl
cmFuZCkpID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgIHRhcmdldEJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG1fZ3Jh
cGguc2l6ZSgpIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZml4SG9pc3RlZENo
aWxkV2l0aFNldExvY2FsKEJsb2NrSW5kZXggYmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBM
b29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgTm9kZSYgY2hpbGROb2Rl
ID0gbV9ncmFwaFtjaGlsZF07CisgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVw
bGFjZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgQVNTRVJUKHJlcGxhY2VtZW50ICE9IE5vTm9kZSk7
CisgICAgICAgIEFTU0VSVChjaGlsZE5vZGUub3AgIT0gR2V0TG9jYWwgJiYgY2hpbGROb2RlLm9w
ICE9IFBoaSAmJiBjaGlsZE5vZGUub3AgIT0gU2V0TG9jYWwpOworICAgICAgICBOb2RlJiBzZXRM
b2NhbE5vZGUgPSBtX2dyYXBoW3JlcGxhY2VtZW50ICsgMV07CisgICAgICAgIEFTU0VSVChzZXRM
b2NhbE5vZGUub3AgPT0gU2V0TG9jYWwpOworICAgICAgICBBU1NFUlQoc2V0TG9jYWxOb2RlLmNo
aWxkcmVuLmZpeGVkLmNoaWxkMSA9PSByZXBsYWNlbWVudCk7CisKKyAgICAgICAgY2hpbGROb2Rl
Lm9wID0gR2V0TG9jYWw7CisgICAgICAgIHJlZmVyZW5jZU1heUJlU2tpcHBlZE5vZGUocmVwbGFj
ZW1lbnQgKyAxKTsKKyAgICAgICAgY2hpbGROb2RlLnNldFZhcmlhYmxlQWNjZXNzRGF0YShzZXRM
b2NhbE5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkpOworICAgICAgICBpbnQgb3BlcmFuZCA9IGNo
aWxkTm9kZS5sb2NhbCgpOworICAgICAgICBCYXNpY0Jsb2NrJiBwcmVIZWFkZXJCbG9jayA9ICpt
X2dyYXBoLm1fYmxvY2tzW2xvb3BJbmZvLnByZUhlYWRlckluZGV4XTsKKyAgICAgICAgQmFzaWNC
bG9jayYgY3VycmVudEJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF07CisgICAg
ICAgIE5vZGVJbmRleCBmaXJzdERlZmluZUluZGV4ID0gTm9Ob2RlOworICAgICAgICBsb29wSW5m
by5wb2xsdXRlZExvY2Fscy5hcHBlbmQob3BlcmFuZCk7CisgICAgICAgIGlmIChvcGVyYW5kSXNB
cmd1bWVudChvcGVyYW5kKSkgeworICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVz
QXRUYWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKSA9IHJlcGxhY2VtZW50
ICsgMTsKKyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjdXJyZW50QmxvY2sudmFyaWFi
bGVzQXRIZWFkLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJhbmQpKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2Nh
bChvcGVyYW5kKSA9IHJlcGxhY2VtZW50ICsgMTsKKyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5k
ZXggPSBjdXJyZW50QmxvY2sudmFyaWFibGVzQXRIZWFkLmxvY2FsKG9wZXJhbmQpOworICAgICAg
ICAgICAgLy8gQ2hlY2sgZm9yIHJlYWRzIG9mIHRlbXBvcmFyaWVzIGZyb20gcHJpb3IgYmxvY2tz
LAorICAgICAgICAgICAgLy8gZXhwYW5kIG1fcHJlc2VydmVkVmFycyB0byBjb3ZlciB0aGVzZS4K
KyAgICAgICAgICAgIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzLnNldChvcGVyYW5kKTsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIEFTU0VSVChmaXJzdERlZmluZUluZGV4ICE9IE5vTm9kZSk7Cisg
ICAgICAgIGlmIChmaXJzdERlZmluZUluZGV4ICE9IE5vTm9kZSAmJiBtX2dyYXBoW2ZpcnN0RGVm
aW5lSW5kZXhdLm9wID09IEdldExvY2FsKQorICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9
IG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0uY2hpbGQxKCk7CisKKyAgICAgICAgY2hpbGROb2Rl
LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSA9IGZpcnN0RGVmaW5lSW5kZXg7CisgICAgICAgIGNoaWxk
Tm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDIgPSBOb05vZGU7CisgICAgICAgIGNoaWxkTm9kZS5j
aGlsZHJlbi5maXhlZC5jaGlsZDMgPSBOb05vZGU7CisgICAgfQorCisgICAgYm9vbCBmaXhIb2lz
dGVkQ2hpbGQoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2RlSW5kZXggY2hpbGQsIExvb3BTaWRl
RWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBib29sIHN1Y2Nlc3NmdWwgPSB0cnVl
OworICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07
CisgICAgICAgIEFTU0VSVChyZXBsYWNlbWVudCAhPSBOb05vZGUpOyAvLyBDaGlsZHJlbiBvZiBh
IGhvaXN0ZWQgbm9kZSBtdXN0IGhhdmUgYmVlbiBob2lzdGVkIGFzIHdlbGwuCisKKyAgICAgICAg
bV9ncmFwaFtjaGlsZF0ucmVmKCk7CisgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkXS5yZWZDb3Vu
dCgpID09IDEpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgZml4IHRoaXMgY2hpbGQgb25jZS4KKyAg
ICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkXS5vcCAhPSBHZXRMb2NhbCAmJiBtX2dyYXBoW2No
aWxkXS5vcCAhPSBKU0NvbnN0YW50ICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IFdlYWtKU0NvbnN0
YW50KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbY2hpbGRdLm9wICE9IFBoaSAm
JiBtX2dyYXBoW2NoaWxkXS5vcCAhPSBTZXRMb2NhbCk7CisgICAgICAgICAgICAgICAgaWYgKHJl
cGxhY2VtZW50IDwgbV9ncmFwaC5zaXplKCkgLSAxICYmIG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAx
XS5vcCA9PSBTZXRMb2NhbCkKKyAgICAgICAgICAgICAgICAgICAgZml4SG9pc3RlZENoaWxkV2l0
aFNldExvY2FsKGJsb2NrSW5kZXgsIGNoaWxkLCBsb29wSW5mbyk7CisgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gZmFsc2U7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAobV9ncmFwaFtjaGlsZF0ub3AgJiBOb2RlTXVzdEdlbmVyYXRl
KQorICAgICAgICAgICAgICAgIG1fZ3JhcGhbY2hpbGRdLnJlZigpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiBzdWNjZXNzZnVsOworICAgIH0KKworICAgIHZvaWQgaGFuZGxlSG9pc3RlZENo
aWxkKEJsb2NrSW5kZXggYmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBMb29wU2lkZUVmZmVj
dHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgaWYgKGZpeEhvaXN0ZWRDaGlsZChibG9ja0lu
ZGV4LCBjaGlsZCwgbG9vcEluZm8pKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8v
IElmIGZhaWxlZCB0byBmaXggdGhpcyBjaGlsZCwgd2UgbmVlZCB0byBiYWNrIHRyYWNrLgorICAg
ICAgICBWZWN0b3I8Tm9kZUluZGV4LCAzPiBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWw7
CisgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQpOwor
ICAgICAgICB3aGlsZSAoIWhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2hvaXN0ZWRDaGlsZHJlbldpdGhv
dXRTZXRMb2NhbC5sYXN0KCldOworICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNl
dExvY2FsLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIGlmIChub2RlLm9wICYgTm9kZUhhc1Zh
ckFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxkSWR4ID0gbm9kZS5m
aXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5maXJzdENoaWxkKCkgKyBub2RlLm51bUNoaWxk
cmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZUluZGV4JiBjaGls
ZHggPSBtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdOworICAgICAgICAgICAgICAg
ICAgICBpZiAoY2hpbGR4ICE9IE5vTm9kZSAmJiAhZml4SG9pc3RlZENoaWxkKGJsb2NrSW5kZXgs
IGNoaWxkeCwgbG9vcEluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxk
cmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZHgpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4JiBjaGlsZDEgPSBu
b2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNo
aWxkMiA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyOworICAgICAgICAgICAgICAgIE5vZGVJ
bmRleCYgY2hpbGQzID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDM7CisKKyAgICAgICAgICAg
ICAgICBpZiAoY2hpbGQxICE9IE5vTm9kZSAmJiAhZml4SG9pc3RlZENoaWxkKGJsb2NrSW5kZXgs
IGNoaWxkMSwgbG9vcEluZm8pKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5X
aXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hp
bGQyICE9IE5vTm9kZSAmJiAhZml4SG9pc3RlZENoaWxkKGJsb2NrSW5kZXgsIGNoaWxkMiwgbG9v
cEluZm8pKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9j
YWwuYXBwZW5kKGNoaWxkMik7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9k
ZSAmJiAhZml4SG9pc3RlZENoaWxkKGJsb2NrSW5kZXgsIGNoaWxkMywgbG9vcEluZm8pKQorICAg
ICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNo
aWxkMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzTG9v
cFByZUhlYWRlckJsb2NrKEJsb2NrSW5kZXggaW5kZXgpCisgICAgeworICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbV9ncmFwaC5tX2xvb3BQcmVIZWFkZXJzLnNpemUoKTsgaSsrKSB7
CisgICAgICAgICAgICBpZiAobV9ncmFwaC5tX2xvb3BQcmVIZWFkZXJzW2ldLmJsb2NrSW5kZXgg
PT0gaW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEFkb3B0IHRoZSBkb21pbmFuY2UgYWxn
b3JpdGhtIGJ5IENvb3BlciwgS2VpdGggRC47IEhhcnZleSwgVGltb3RoeSBKOyBhbmQgS2VubmVk
eSwgS2VuICgyMDAxKS4gCisgICAgLy8gIkEgU2ltcGxlLCBGYXN0IERvbWluYW5jZSBBbGdvcml0
aG0iCisgICAgLy8gaHR0cDovL3d3dy5oaXBlcnNvZnQucmljZS5lZHUvZ3JhZHMvcHVibGljYXRp
b25zL2RvbTE0LnBkZgorICAgIHVuc2lnbmVkIGludGVyc2VjdCh1bnNpZ25lZCBiMSwgdW5zaWdu
ZWQgYjIsIFZlY3Rvcjx1bnNpZ25lZD4mIGRvbVRyZWUpCisgICAgeworICAgICAgICB1bnNpZ25l
ZCBmaW5nZXIxID0gYjE7CisgICAgICAgIHVuc2lnbmVkIGZpbmdlcjIgPSBiMjsKKworICAgICAg
ICB3aGlsZSAoZmluZ2VyMSAhPSBmaW5nZXIyKSB7CisgICAgICAgICAgICB3aGlsZSAoZmluZ2Vy
MSA+IGZpbmdlcjIpCisgICAgICAgICAgICAgICBmaW5nZXIxID0gZG9tVHJlZVtmaW5nZXIxXTsK
KyAgICAgICAgICAgIHdoaWxlIChmaW5nZXIyID4gZmluZ2VyMSkKKyAgICAgICAgICAgICAgIGZp
bmdlcjIgPSBkb21UcmVlW2ZpbmdlcjJdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZp
bmdlcjE7CisgICAgfQorCisgICAgdm9pZCBjb21wdXRlRG9taW5hdG9ycyhCbG9ja0luZGV4IGJl
Z2luLCBCbG9ja0luZGV4IGVuZCwgVmVjdG9yPEJsb2NrSW5kZXgsIDg+JiBkb21pbmF0b3JzKQor
ICAgIHsKKyAgICAgICAgLy8gRmlyc3RseSBjb21wdXRlIHRoZSBkb21pbmF0b3IgdHJlZS4KKyAg
ICAgICAgLy8gVGhlIHRyZWUgbm9kZSBpbmRleCBpcyB0aGUgYmxvY2sgaW5kZXggb2Zmc2V0ZWQg
YnkgdGhlIGJlZ2luIGJsb2NrIGluZGV4LgorICAgICAgICBWZWN0b3I8dW5zaWduZWQ+IGRvbVRy
ZWU7CisgICAgICAgIHVuc2lnbmVkIHNpemUgPSBlbmQgLSBiZWdpbiArIDE7CisKKyAgICAgICAg
ZG9tVHJlZS5yZXNpemUoc2l6ZSk7CisgICAgICAgIGRvbVRyZWVbMF0gPSAwOworICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgZG9tVHJlZVtp
XSA9IHNpemU7CisKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICB3aGls
ZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFtX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0tPmlzUmVhY2hhYmxlKQorICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBWZXJpZnkg
YW5kIGVuc3VyZSB0aGF0IHRoZSBwcmVjZXNzb3JzIGFyZSBvcmRlcmVkIGJ5IGluZGV4LgorICAg
ICAgICAgICAgICAgIFByZWRlY2Vzc29yTGlzdCYgcHJlZGVjZXNzb3JzID0gbV9ncmFwaC5tX2Js
b2Nrc1tiZWdpbiArIGldLT5tX3ByZWRlY2Vzc29yczsKKyAgICAgICAgICAgICAgICB1bnNpZ25l
ZCBqID0gMDsKKyAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBwcmVkZWNlc3NvciBp
biB0aGlzIHN1YmdyYXBoCisgICAgICAgICAgICAgICAgd2hpbGUgKHByZWRlY2Vzc29yc1tqXSA8
IGJlZ2luKQorICAgICAgICAgICAgICAgICAgICBqKys7CisKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCBuZXdJRG9tID0gcHJlZGVjZXNzb3JzW2pdIC0gYmVnaW47CisgICAgICAgICAgICAgICAg
QVNTRVJUKGRvbVRyZWVbbmV3SURvbV0gIT0gc2l6ZSk7IC8vIE11c3QgaGF2ZSBiZWVuIHByb2Nl
c3NlZC4KKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgZm9yICg7IGogPCBw
cmVkZWNlc3NvcnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg
cHJlZCA9IHByZWRlY2Vzc29yc1tqXSAtIGJlZ2luOworICAgICAgICAgICAgICAgICAgICBpZiAo
ZG9tVHJlZVtwcmVkXSAhPSBzaXplKSAvLyBNZWFucyBpdCdzIGFscmVhZHkgY2FsY3VsYXRlZC4K
KyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lEb20gPSBpbnRlcnNlY3QocHJlZCwgbmV3SURv
bSwgZG9tVHJlZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb21U
cmVlW2ldICE9IG5ld0lEb20pIHsKKyAgICAgICAgICAgICAgICAgICAgZG9tVHJlZVtpXSA9IG5l
d0lEb207CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc0xvb3BQcmVIZWFkZXJCbG9jayhiZWdpbiAr
IGkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGNvbmRpdGlvbmFsIGlubmVy
IGxvb3BzIGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgICAgICBOb2RlJiBqdW1wID0gbV9n
cmFwaFttX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0tPmVuZCAtIDFdOworICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQoanVtcC5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaSA9
IGp1bXAudGFrZW5CbG9ja0luZGV4KCkgLSBiZWdpbiAtIDE7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlbiB0cmF2ZXJzZSB0aGUg
ZG9taW5hdG9yIHRyZWUgdG8gZ2V0IHRoZSBkb21pbmF0b3JzIG9mIHRoZSBsYXN0IGJsb2NrLgor
ICAgICAgICB1bnNpZ25lZCBpZG9tID0gZG9tVHJlZS5sYXN0KCk7CisgICAgICAgIHdoaWxlIChp
ZG9tKSB7CisgICAgICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChpZG9tICsgYmVnaW4pOworICAg
ICAgICAgICAgaWRvbSA9IGRvbVRyZWVbaWRvbV07CisgICAgICAgIH0KKyAgICAgICAgZG9taW5h
dG9ycy5hcHBlbmQoYmVnaW4pOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gY29weSB0aGUg
aW52YXJpYW50cyBvZiB0aGUgb3V0ZXIgbG9vcCB0byB0aGUgbmVzdGVkIGxvb3AsCisgICAgLy8g
b3RoZXJ3aXNlIHRoZXJlJ3JlIHByb2JsZW1zIGlmIHdlIHBlcmZvcm0gT1NSIGF0IHRoZSBuZXN0
ZWQgbG9vcCBlbnRyeS4KKyAgICB1bnNpZ25lZCBjb3B5T3V0ZXJMb29wSW52YXJpYW50cyhMb29w
UHJlSGVhZGVyJiBwcmVIZWFkZXIsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgewor
ICAgICAgICAvLyBUaGlzIGlzbid0IGEgbmVzdGVkIGxvb3AuCisgICAgICAgIGlmIChwcmVIZWFk
ZXIub3V0ZXJMb29wID09IE5vQmxvY2spCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAg
ICBCYXNpY0Jsb2NrJiBwcmVIZWFkZXJCbG9jayA9ICptX2dyYXBoLm1fYmxvY2tzW3ByZUhlYWRl
ci5ibG9ja0luZGV4XTsKKyAgICAgICAgQmFzaWNCbG9jayYgb3V0ZXJMb29wQmxvY2sgPSAqbV9n
cmFwaC5tX2Jsb2Nrc1twcmVIZWFkZXIub3V0ZXJMb29wXTsKKworICAgICAgICAvLyBUaGVyZSdz
IG5vIGhvaXN0ZWQgbG9vcCBpbnZhcmlhbnRzIGZvciB0aGUgb3V0ZXIgbG9vcC4KKyAgICAgICAg
aWYgKG91dGVyTG9vcEJsb2NrLmVuZCA8IG1fZ3JhcGgubV9vcmlnaW5hbFNpemUpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKworICAgICAgICAvLyBXZSBjdXJyZW50bHkgb25seSBwZXJmb3JtIExJ
Q00gZm9yIGlubmVybW9zdCBsb29wcy4KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisK
KyAgICAgICAgdW5zaWduZWQgY29waWVkID0gMDsKKyAgICAgICAgdW5zaWduZWQgc2l6ZUJlZm9y
ZUNvcHkgPSBtX2dyYXBoLnNpemUoKTsKKyAgICAgICAgdW5zaWduZWQgb3JpZ1JlcGxhY2VtZW50
c1NpemUgPSBtX3JlcGxhY2VtZW50cy5zaXplKCk7CisgICAgICAgIC8vIEV4cGFuZCB0aGUgcmVw
bGFjZW1lbnRzIHZlY3RvciwgdG8gaG9sZCB0aGUgcmVwbGFjZW1lbnRzIG9mIHRoZQorICAgICAg
ICAvLyBuZXdseSBjcmVhdGVkIG5vZGVzIGNhdXNlZCBieSBwcmV2aW91cyBMSUNNLgorICAgICAg
ICBBU1NFUlQob3JpZ1JlcGxhY2VtZW50c1NpemUgPD0gc2l6ZUJlZm9yZUNvcHkpOworICAgICAg
ICBtX3JlcGxhY2VtZW50cy5yZXNpemUoc2l6ZUJlZm9yZUNvcHkpOworICAgICAgICBmb3IgKHVu
c2lnbmVkIGogPSBvcmlnUmVwbGFjZW1lbnRzU2l6ZTsgaiA8IHNpemVCZWZvcmVDb3B5OyBqKysp
CisgICAgICAgICAgICBtX3JlcGxhY2VtZW50c1tqXSA9IE5vTm9kZTsKKworICAgICAgICBmb3Ig
KE5vZGVJbmRleCBpID0gb3V0ZXJMb29wQmxvY2suYmVnaW47IGkgPCBvdXRlckxvb3BCbG9jay5l
bmQgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbV9ncmFwaFtpXS5zaG91bGRHZW5lcmF0
ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAobV9ncmFw
aFtpXS5vcCA9PSBHZXRMb2NhbCkgeworICAgICAgICAgICAgICAgIGhvaXN0R2V0TG9jYWwoaSwg
cHJlSGVhZGVyQmxvY2ssIGNvcGllZCwgZmFsc2UpOworICAgICAgICAgICAgICAgIGxvb3BJbmZv
LmdldExvY2Fscy5hcHBlbmQobV9ncmFwaFtpXS5sb2NhbCgpKTsKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgcGVyZm9ybUhvaXN0KGksIHByZUhlYWRlckJsb2NrLCBjb3Bp
ZWQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBtb2RpZnkgdGhlIHZh
cmlhYmxlIGluZm9ybWF0aW9uIGluIHBlcmZvcm1Ib2lzdC4KKyAgICAgICAgICAgICAgICBpZiAo
bV9ncmFwaFtpXS5vcCA9PSBTZXRMb2NhbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3Bl
cmFuZCA9IG1fZ3JhcGhbaV0ubG9jYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8u
cG9sbHV0ZWRMb2NhbHMuYXBwZW5kKG9wZXJhbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAo
b3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVI
ZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3Bl
cmFuZCkpID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgICAgICBwcmVIZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwubG9j
YWwob3BlcmFuZCkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvcGllZDsKKyAgICB9CisK
KyAgICB2b2lkIHBlcmZvcm1MSUNNKExvb3BQcmVIZWFkZXImIHByZUhlYWRlcikKKyAgICB7Cisg
ICAgICAgIEJsb2NrSW5kZXggcHJlSGVhZGVySW5kZXggPSBwcmVIZWFkZXIuYmxvY2tJbmRleDsK
KyAgICAgICAgQmFzaWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tw
cmVIZWFkZXJJbmRleF07CisgICAgICAgIEJsb2NrSW5kZXggbG9vcEhlYWRlckluZGV4ID0gbV9n
cmFwaFtwcmVIZWFkZXJCbG9jay5lbmQgLSAxXS50YWtlbkJsb2NrSW5kZXgoKTsKKyAgICAgICAg
QmFzaWNCbG9jayYgYmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29wSGVhZGVySW5kZXhdOwor
ICAgICAgICB1bnNpZ25lZCBwcmVIZWFkZXJFbmRCZWZvcmVMSUNNID0gcHJlSGVhZGVyQmxvY2su
ZW5kOworICAgICAgICBMb29wU2lkZUVmZmVjdHMgbG9vcEluZm8ocHJlSGVhZGVySW5kZXgpOwor
ICAgICAgICB1bnNpZ25lZCBob2lzdGVkID0gY29weU91dGVyTG9vcEludmFyaWFudHMocHJlSGVh
ZGVyLCBsb29wSW5mbyk7CisgICAgICAgIEJsb2NrSW5kZXggbGFzdExvb3BCbG9ja0luZGV4ID0g
bG9vcEhlYWRlckluZGV4OworICAgICAgICB1bnNpZ25lZCBpID0gMDsKKyAgICAgICAgLy8gYm9v
bCBtZXRJbmxpbmUgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmxvY2subV9w
cmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChibG9jay5tX3ByZWRl
Y2Vzc29yc1tpXSA+IGxhc3RMb29wQmxvY2tJbmRleCkKKyAgICAgICAgICAgICAgICBsYXN0TG9v
cEJsb2NrSW5kZXggPSBibG9jay5tX3ByZWRlY2Vzc29yc1tpXTsgLy8gVGhlIGZyb20gYmxvY2sg
b2YgdGhlIGJhY2sgZWRnZS4KKyAgICAgICAgfQorCisgICAgICAgIEJsb2NrSW5kZXggZmlyc3RM
b29wQmxvY2tJbmRleCA9IHByZUhlYWRlckluZGV4ICsgMTsKKyAgICAgICAgVmVjdG9yPEJsb2Nr
SW5kZXgsIDg+IG11c3RSZWFjaEJsb2Nrc0luTG9vcDsKKyAgICAgICAgbXVzdFJlYWNoQmxvY2tz
SW5Mb29wLmFwcGVuZChsYXN0TG9vcEJsb2NrSW5kZXgpOworICAgICAgICBjb21wdXRlRG9taW5h
dG9ycyhmaXJzdExvb3BCbG9ja0luZGV4LCBsYXN0TG9vcEJsb2NrSW5kZXgsIG11c3RSZWFjaEJs
b2Nrc0luTG9vcCk7CisgICAgICAgIGFuYWx5emVMb29wU2lkZUVmZmVjdHMobV9ncmFwaC5tX2Js
b2Nrc1tmaXJzdExvb3BCbG9ja0luZGV4XS0+YmVnaW4sIG1fZ3JhcGgubV9ibG9ja3NbbGFzdExv
b3BCbG9ja0luZGV4XS0+ZW5kLCBsb29wSW5mbyk7CisKKyAgICAgICAgd2hpbGUgKCFtdXN0UmVh
Y2hCbG9ja3NJbkxvb3AuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBCbG9ja0luZGV4IGJsb2Nr
SW5kZXggPSBtdXN0UmVhY2hCbG9ja3NJbkxvb3AubGFzdCgpOworICAgICAgICAgICAgbXVzdFJl
YWNoQmxvY2tzSW5Mb29wLnJlbW92ZUxhc3QoKTsKKworI2lmIDAKKyAgICAgICAgICAgIC8vIEZJ
WE1FOiByZWNvbnNpZGVyIHRoaXMgbGF0ZXIgdG8gYmFsYW5jZSB0aGUgZXhlY3V0aW9uIHBlcmZv
cm1hbmNlIGFuZCBjb21waWxlIHRpbWUuCisgICAgICAgICAgICBpZiAobWV0SW5saW5lKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgIGZvciAobV9jb21waWxl
SW5kZXggPSBtX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdLT5iZWdpbjsgbV9jb21waWxlSW5k
ZXggPCBtX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdLT5lbmQ7ICsrbV9jb21waWxlSW5kZXgp
IHsKKyAgICAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFttX2NvbXBpbGVJbmRleF07
CisKKyNpZiAwCisgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgd2UgbWVldCBpbmxpbmVk
IGJvZGllcyBpbiB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBJbmxp
bmVTdGFydCkgeworICAgICAgICAgICAgICAgICAgICBtZXRJbmxpbmUgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAg
ICAgICAgICAgIGlmIChub2RlLm9wID09IFBoaSB8fCBub2RlLm9wID09IEZsdXNoKSB7CisgICAg
ICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9kZS5jaGlsZHJlbi5maXhlZC5j
aGlsZDEpOworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hp
bGRyZW4uZml4ZWQuY2hpbGQyKTsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1
dGlvbihub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyk7CisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxk
R2VuZXJhdGUgPSBub2RlLnNob3VsZEdlbmVyYXRlKCk7CisgICAgICAgICAgICAgICAgYm9vbCBj
YW5Ib2lzdCA9IGhvaXN0ZWQgPCBNQVhfSE9JU1RFRF9MT09QX0lOVkFSSUFOVFMgLSAxCisgICAg
ICAgICAgICAgICAgICAgICYmIGlzSG9pc3RDYW5kaWRhdGUobm9kZSwgbG9vcEluZm8pOworCisg
ICAgICAgICAgICAgICAgLy8gTG9vayBvbmUgc3RlcCBhaGVhZC4KKyAgICAgICAgICAgICAgICBp
ZiAobV9ncmFwaFttX2NvbXBpbGVJbmRleCArIDFdLm9wID09IFNldExvY2FsICYmIGxvb3BJbmZv
LnBvbGx1dGVkTG9jYWxzLmNvbnRhaW5zKG1fZ3JhcGhbbV9jb21waWxlSW5kZXggKyAxXS5sb2Nh
bCgpKSkKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxzZTsKKworICAgICAgICAg
ICAgICAgIGlmIChub2RlLm9wID09IEdldExvY2FsICYmIGNhbkhvaXN0ICYmIHNob3VsZEdlbmVy
YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGhvaXN0R2V0TG9jYWwobV9jb21waWxlSW5kZXgs
IHByZUhlYWRlckJsb2NrLCBob2lzdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwg
Mz4gaG9pc3RlZENoaWxkcmVuOworICAgICAgICAgICAgICAgIGNhbkhvaXN0ICY9IG5vZGVDYW5C
ZUhvaXN0ZWQobm9kZSwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWRDaGlsZHJlbik7CisKKyAgICAg
ICAgICAgICAgICAvLyBXZSB3YW50IHRvIGhvaXN0IHRoZSBTZXRMb2NhbCBub2RlIHdoYXRldmVy
LgorICAgICAgICAgICAgICAgIGlmICghc2hvdWxkR2VuZXJhdGUgJiYgbm9kZS5vcCAhPSBTZXRM
b2NhbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorI2lmIERGR19F
TkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYo
IiAgICVzIEAldTogIiwgR3JhcGg6Om9wTmFtZShtX2dyYXBoW21fY29tcGlsZUluZGV4XS5vcCks
IG1fY29tcGlsZUluZGV4KTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKGNhbkhvaXN0
KQorICAgICAgICAgICAgICAgICAgICBwZXJmb3JtSG9pc3QobV9jb21waWxlSW5kZXgsIHByZUhl
YWRlckJsb2NrLCBob2lzdGVkKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGRHZW5l
cmF0ZSAmJiAhaG9pc3RlZENoaWxkcmVuLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBUaGlzIG5vZGUgY2Fubm90IGJlIGhvaXN0ZWQgYnV0IGl0IGNvbnRhaW5zIHNvbWUgcmVm
ZXJlbmNlcyB0byB0aGUgaG9pc3RlZCBub2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQWRq
dXN0IHN1Y2ggcmVmZXJlbmNlcyBieSB1dGlsaXppbmcgU2V0TG9jYWwvR2V0TG9jYWwgZm9yIGNy
b3NzIGJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBob2lzdGVkQ2hpbGRyZW4uc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAg
ICAgICAgICBoYW5kbGVIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgaG9pc3RlZENoaWxkcmVuW2ld
LCBsb29wSW5mbyk7CisgICAgICAgICAgICAgICAgfQorCisjaWYgREZHX0VOQUJMRShERUJVR19Q
Uk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRp
ZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvaXN0ZWQpIHsKKyAg
ICAgICAgICAgIEFTU0VSVChtX2dyYXBoW3ByZUhlYWRlckVuZEJlZm9yZUxJQ00gLSAxXS5vcCA9
PSBKdW1wKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbcHJlSGVhZGVyRW5k
QmVmb3JlTElDTSAtIDFdKTsKKyAgICAgICAgICAgIHByZUhlYWRlckJsb2NrLmVuZCA9IG1fZ3Jh
cGguc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsb29wSW52YXJpYW50Q29k
ZU1vdGlvbigpCisgICAgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9T
RSkKKyAgICAgICAgcHJpbnRmKCJQZXJmb3JtaW5nIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9u
OiIpOworI2VuZGlmCisgICAgICAgIEJpdFZlY3RvciBub25MZWFmTG9vcHM7IC8vIFRvIG1hcmsg
dXAgdGhvc2UgbG9vcHMgd2hpY2ggaGF2ZSBpbm5lciBsb29wcy4KKyAgICAgICAgdW5zaWduZWQg
aSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggb3V0ZXJMb29wID0gbV9ncmFw
aC5tX2xvb3BQcmVIZWFkZXJzW2ldLm91dGVyTG9vcDsKKyAgICAgICAgICAgIGlmIChvdXRlckxv
b3AgIT0gTm9CbG9jaykKKyAgICAgICAgICAgICAgICBub25MZWFmTG9vcHMuc2V0KG91dGVyTG9v
cCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9ncmFwaC5tX2xvb3BQ
cmVIZWFkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBMb29wUHJlSGVhZGVyIHByZUhl
YWRlciA9IG1fZ3JhcGgubV9sb29wUHJlSGVhZGVyc1tpXTsKKyAgICAgICAgICAgIC8vIFdlIG9u
bHkgcGVyZm9ybSBMSUNNIGZvciB0aGUgbGVhZiAoaW5uZXJtb3N0KSBsb29wcyBmb3Igbm93IQor
ICAgICAgICAgICAgLy8gQXMgT1NSIGluIHRoZSBpbm5lciBsb29wcyB3aWxsIG1ha2UgTElDTSBm
b3IgdGhlIG91dGVyIGxvb3BzCisgICAgICAgICAgICAvLyBtZWFuaW5nbGVzcyBidXQgd2FzdGVm
dWwsIHVubGVzcyB3ZSBmaWd1cmUgb3V0IGEgZ29vZCBzb2x1dGlvbi4KKyAgICAgICAgICAgIGlm
ICghbm9uTGVhZkxvb3BzLmdldChwcmVIZWFkZXIuYmxvY2tJbmRleCkpCisgICAgICAgICAgICAg
ICAgcGVyZm9ybUxJQ00ocHJlSGVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvbWUg
UGhpIG5vZGVzIG1heSBub3QgZ2V0IHVwZGF0ZWQgY2hpbGRyZW4gZm9yIG5vdy4KKyAgICAgICAg
Zm9yIChpID0gbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZDsgaSA8IG1fZ3JhcGgubV9vcmln
aW5hbFNpemU7IGkrKykgeworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihtX2dyYXBo
W2ldLmNoaWxkcmVuLmZpeGVkLmNoaWxkMSk7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0
aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uZml4ZWQuY2hpbGQyKTsKKyAgICAgICAgICAgIHBlcmZv
cm1TdWJzdGl0dXRpb24obV9ncmFwaFtpXS5jaGlsZHJlbi5maXhlZC5jaGlsZDMpOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gQ2xlYW4tdXAuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX3Jl
cGxhY2VtZW50cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0g
Tm9Ob2RlOwogICAgIH0KICAgICAKICAgICB2b2lkIGFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycygp
CkBAIC0xNjQ5LDggKzI0MTYsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgcHJpbnRmKCJcbiIpOwog
I2VuZGlmCiAgICAgICAgIFNjb3JlQm9hcmQgc2NvcmVCb2FyZChtX2dyYXBoLCBtX2dyYXBoLm1f
cHJlc2VydmVkVmFycyk7Ci0gICAgICAgIHVuc2lnbmVkIHNpemVFeGNsdWRpbmdQaGlOb2RlcyA9
IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQ7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgc2l6ZUV4Y2x1ZGluZ1BoaU5vZGVzOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX2dyYXBoLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRo
ZSBwaGkgbm9kZXMKKyAgICAgICAgICAgIGlmIChpID49IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgp
LT5lbmQgJiYgaSA8IG1fZ3JhcGgubV9vcmlnaW5hbFNpemUpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisKICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2ldOwogICAgICAgICAK
ICAgICAgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKQpAQCAtMTcwMyw2ICsyNDcz
LDggQEAgcHJpdmF0ZToKICAgICAgICAgcHJpbnRmKCIgICBCbG9jayAjJXUgKGJjIyV1KTpcbiIs
IGJsb2NrSW5kZXgsIGJsb2NrLT5ieXRlY29kZUJlZ2luKTsKICNlbmRpZgogICAgICAgICBzdGF0
ZS5iZWdpbkJhc2ljQmxvY2soYmxvY2spOworICAgICAgICBibG9jay0+Y2ZhU2hvdWxkUmV2aXNp
dCA9IGZhbHNlOworICAgICAgICBibG9jay0+Y2ZhSGFzVmlzaXRlZCA9IHRydWU7CiAjaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICBwcmludGYoIiAgICAg
IGhlYWQgdmFyczogIik7CiAgICAgICAgIGR1bXBPcGVyYW5kcyhibG9jay0+dmFsdWVzQXRIZWFk
LCBzdGRvdXQpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2
ZUpJVDMyXzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNzI1LDIxICsxNzI1LDI1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9k
ZSYgbm9kZSkKICAgICB9CiAKICAgICBjYXNlIFNldExvY2FsOiB7Ci0gICAgICAgIC8vIFNldExv
Y2FsIGRvdWJsZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3JlZCBh
bmQKLSAgICAgICAgLy8gYXMgYSBzcGVjdWxhdGlvbiBwb2ludC4gU28gYmVmb3JlIHdlIHNwZWN1
bGF0ZSBtYWtlIHN1cmUgdGhhdCB3ZQotICAgICAgICAvLyBrbm93IHdoZXJlIHRoZSBjaGlsZCBv
ZiB0aGlzIG5vZGUgbmVlZHMgdG8gZ28gaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgLy8gcmVnaXN0
ZXIgZmlsZS4KLSAgICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7Ci0gICAgICAgIAotICAgICAg
ICAvLyBBcyBmYXIgYXMgT1NSIGlzIGNvbmNlcm5lZCwgd2UncmUgb24gdGhlIGJ5dGVjb2RlIGlu
ZGV4IGNvcnJlc3BvbmRpbmcKLSAgICAgICAgLy8gdG8gdGhlICpuZXh0KiBpbnN0cnVjdGlvbiwg
c2luY2Ugd2UndmUgYWxyZWFkeSAiZXhlY3V0ZWQiIHRoZQotICAgICAgICAvLyBTZXRMb2NhbCBh
bmQgd2hhdGV2ZXIgb3RoZXIgREZHIE5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUK
LSAgICAgICAgLy8gYnl0ZWNvZGUgaW5kZXggYXMgdGhlIFNldExvY2FsLgotICAgICAgICBBU1NF
UlQobV9jb2RlT3JpZ2luRm9yT1NSID09IG5vZGUuY29kZU9yaWdpbik7Ci0gICAgICAgIE5vZGUm
IG5leHROb2RlID0gYXQobV9jb21waWxlSW5kZXggKyAxKTsKKyAgICAgICAgYm9vbCBpc0hvaXN0
ZWROb2RlID0gKG1fY29tcGlsZUluZGV4ID49IG1faml0LmdyYXBoKCkubV9vcmlnaW5hbFNpemUp
OworCisgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkgeworICAgICAgICAgICAgLy8gU2V0TG9j
YWwgZG91YmxlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgYSBub2RlIHdpbGwgYmUgc3RvcmVkIGFu
ZAorICAgICAgICAgICAgLy8gYXMgYSBzcGVjdWxhdGlvbiBwb2ludC4gU28gYmVmb3JlIHdlIHNw
ZWN1bGF0ZSBtYWtlIHN1cmUgdGhhdCB3ZQorICAgICAgICAgICAgLy8ga25vdyB3aGVyZSB0aGUg
Y2hpbGQgb2YgdGhpcyBub2RlIG5lZWRzIHRvIGdvIGluIHRoZSB2aXJ0dWFsCisgICAgICAgICAg
ICAvLyByZWdpc3RlciBmaWxlLgorICAgICAgICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7CiAg
ICAgICAgIAotICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0Tm9kZS5jb2RlT3JpZ2lu
OworICAgICAgICAgICAgLy8gQXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3JlIG9uIHRo
ZSBieXRlY29kZSBpbmRleCBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyB0byB0aGUgKm5l
eHQqIGluc3RydWN0aW9uLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5ICJleGVjdXRlZCIgdGhlCisgICAg
ICAgICAgICAvLyBTZXRMb2NhbCBhbmQgd2hhdGV2ZXIgb3RoZXIgREZHIE5vZGVzIGFyZSBhc3Nv
Y2lhdGVkIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFzIHRo
ZSBTZXRMb2NhbC4KKyAgICAgICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JPU1IgPT0gbm9k
ZS5jb2RlT3JpZ2luKTsKKyAgICAgICAgICAgIE5vZGUmIG5leHROb2RlID0gYXQobV9jb21waWxl
SW5kZXggKyAxKTsKICAgICAgICAgCisgICAgICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBu
ZXh0Tm9kZS5jb2RlT3JpZ2luOworICAgICAgICB9CisKICAgICAgICAgaWYgKG5vZGUudmFyaWFi
bGVBY2Nlc3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKSB7CiAgICAgICAgICAgICBT
cGVjdWxhdGVEb3VibGVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwogICAgICAg
ICAgICAgbV9qaXQuc3RvcmVEb3VibGUodmFsdWUuZnByKCksIEpJVENvbXBpbGVyOjphZGRyZXNz
Rm9yKG5vZGUubG9jYWwoKSkpOwpAQCAtMTc0Nyw3ICsxNzUxLDggQEAgdm9pZCBTcGVjdWxhdGl2
ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBp
dCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCiAgICAgICAg
ICAgICAvLyB0aGlzIGJ5dGVjb2RlIHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxv
Y2F0aW9ucyBpbiB0aGUgcmVnaXN0ZXIgZmlsZSwKICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGl0
IGlzIHN0b3JlZCBhcyBhIGRvdWJsZS4KLSAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNl
Rm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoRG91YmxlSW5SZWdpc3RlckZp
bGUpOworICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgIHZh
bHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2Uo
RG91YmxlSW5SZWdpc3RlckZpbGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHJl
ZGljdGVkVHlwZSBwcmVkaWN0ZWRUeXBlID0gbm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJl
ZGljdGlvbigpOwogICAgICAgICAgICAgaWYgKG1fZ2VuZXJhdGlvbkluZm9bYXQobm9kZS5jaGls
ZDEoKSkudmlydHVhbFJlZ2lzdGVyKCldLnJlZ2lzdGVyRm9ybWF0KCkgPT0gRGF0YUZvcm1hdERv
dWJsZSkgewpAQCAtMTc4NSw3ICsxNzkwLDggQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGls
ZShOb2RlJiBub2RlKQogCiAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9u
Z2VyIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgIC8vIHRo
aXMgYnl0ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMgb3Igb3RoZXIgbG9jYXRpb25zIGlu
IHRoZSByZWdpc3RlciBmaWxlLgotICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JP
cGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6Zm9yUHJlZGljdGlvbihwcmVkaWN0
ZWRUeXBlKTsKKyAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgICAg
ICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291
cmNlOjpmb3JQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpOwogICAgICAgICB9CiAgICAgICAgIGJy
ZWFrOwogICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQ2NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdT
cGVjdWxhdGl2ZUpJVDY0LmNwcAkocmV2aXNpb24gMTA2MzQzKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTc5
OSwzMCArMTc5OSwzNCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUp
CiAgICAgfQogCiAgICAgY2FzZSBTZXRMb2NhbDogewotICAgICAgICAvLyBTZXRMb2NhbCBkb3Vi
bGVzIGFzIGEgaGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBiZSBzdG9yZWQgYW5kCi0gICAg
ICAgIC8vIGFzIGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3ZSBzcGVjdWxhdGUgbWFr
ZSBzdXJlIHRoYXQgd2UKLSAgICAgICAgLy8ga25vdyB3aGVyZSB0aGUgY2hpbGQgb2YgdGhpcyBu
b2RlIG5lZWRzIHRvIGdvIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgIC8vIHJlZ2lzdGVyIGZpbGUu
Ci0gICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOworICAgICAgICBib29sIGlzSG9pc3RlZE5v
ZGUgPSAobV9jb21waWxlSW5kZXggPj0gbV9qaXQuZ3JhcGgoKS5tX29yaWdpbmFsU2l6ZSk7CisK
KyAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKSB7CisgICAgICAgICAgICAvLyBTZXRMb2NhbCBk
b3VibGVzIGFzIGEgaGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBiZSBzdG9yZWQgYW5kCisg
ICAgICAgICAgICAvLyBhcyBhIHNwZWN1bGF0aW9uIHBvaW50LiBTbyBiZWZvcmUgd2Ugc3BlY3Vs
YXRlIG1ha2Ugc3VyZSB0aGF0IHdlCisgICAgICAgICAgICAvLyBrbm93IHdoZXJlIHRoZSBjaGls
ZCBvZiB0aGlzIG5vZGUgbmVlZHMgdG8gZ28gaW4gdGhlIHZpcnR1YWwKKyAgICAgICAgICAgIC8v
IHJlZ2lzdGVyIGZpbGUuCisgICAgICAgICAgICBjb21waWxlTW92SGludChub2RlKTsKICAgICAg
ICAgCi0gICAgICAgIC8vIEFzIGZhciBhcyBPU1IgaXMgY29uY2VybmVkLCB3ZSdyZSBvbiB0aGUg
Ynl0ZWNvZGUgaW5kZXggY29ycmVzcG9uZGluZwotICAgICAgICAvLyB0byB0aGUgKm5leHQqIGlu
c3RydWN0aW9uLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5ICJleGVjdXRlZCIgdGhlCi0gICAgICAgIC8v
IFNldExvY2FsIGFuZCB3aGF0ZXZlciBvdGhlciBERkcgTm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0
aCB0aGUgc2FtZQotICAgICAgICAvLyBieXRlY29kZSBpbmRleCBhcyB0aGUgU2V0TG9jYWwuCi0g
ICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JPU1IgPT0gbm9kZS5jb2RlT3JpZ2luKTsKLSAg
ICAgICAgTm9kZSYgbmV4dE5vZGUgPSBhdChtX2NvbXBpbGVJbmRleCArIDEpOworICAgICAgICAg
ICAgLy8gQXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3JlIG9uIHRoZSBieXRlY29kZSBp
bmRleCBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyB0byB0aGUgKm5leHQqIGluc3RydWN0
aW9uLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5ICJleGVjdXRlZCIgdGhlCisgICAgICAgICAgICAvLyBT
ZXRMb2NhbCBhbmQgd2hhdGV2ZXIgb3RoZXIgREZHIE5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGgg
dGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFzIHRoZSBTZXRMb2NhbC4K
KyAgICAgICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JPU1IgPT0gbm9kZS5jb2RlT3JpZ2lu
KTsKKyAgICAgICAgICAgIE5vZGUmIG5leHROb2RlID0gYXQobV9jb21waWxlSW5kZXggKyAxKTsK
ICAgICAgICAgCi0gICAgICAgIC8vIE9kZGx5LCBpdCdzIHBvc3NpYmxlIGZvciB0aGUgYnl0ZWNv
ZGUgaW5kZXggZm9yIHRoZSBuZXh0IG5vZGUgdG8gYmUKLSAgICAgICAgLy8gZXF1YWwgdG8gb3Vy
cy4gVGhpcyB3aWxsIGhhcHBlbiBmb3Igb3BfcG9zdF9pbmMuIEFuZCwgZXZlbiBtb3JlIG9kZGx5
LAotICAgICAgICAvLyB0aGlzIGlzIGp1c3QgZmluZS4gT3JkaW5hcmlseSwgdGhpcyB3b3VsZG4n
dCBiZSBmaW5lLCBzaW5jZSBpZiB0aGUKLSAgICAgICAgLy8gbmV4dCBub2RlIGZhaWxlZCBPU1Ig
dGhlbiB3ZSdkIGJlIE9TUi1pbmcgd2l0aCB0aGlzIFNldExvY2FsJ3MgbG9jYWwKLSAgICAgICAg
Ly8gdmFyaWFibGUgYWxyZWFkeSBzZXQgZXZlbiB0aG91Z2ggZnJvbSB0aGUgc3RhbmRwb2ludCBv
ZiB0aGUgb2xkIEpJVCwKLSAgICAgICAgLy8gdGhpcyBTZXRMb2NhbCBzaG91bGQgbm90IGhhdmUg
ZXhlY3V0ZWQuIEJ1dCBmb3Igb3BfcG9zdF9pbmMsIGl0J3MganVzdAotICAgICAgICAvLyBmaW5l
LCBiZWNhdXNlIHRoaXMgU2V0TG9jYWwncyBsb2NhbCAoaS5lLiB0aGUgTEhTIGluIGEgeCA9IHkr
KwotICAgICAgICAvLyBzdGF0ZW1lbnQpIHdvdWxkIGJlIGRlYWQgYW55d2F5IC0gc28gdGhlIGZh
Y3QgdGhhdCBERkcgd291bGQgaGF2ZQotICAgICAgICAvLyBhbHJlYWR5IG1hZGUgdGhlIGFzc2ln
bm1lbnQsIGFuZCBiYWtlZCBpdCBpbnRvIHRoZSByZWdpc3RlciBmaWxlIGR1cmluZwotICAgICAg
ICAvLyBPU1IgZXhpdCwgd291bGQgbm90IGJlIHZpc2libGUgdG8gdGhlIG9sZCBKSVQgaW4gYW55
IHdheS4KLSAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbmV4dE5vZGUuY29kZU9yaWdpbjsK
KyAgICAgICAgICAgIC8vIE9kZGx5LCBpdCdzIHBvc3NpYmxlIGZvciB0aGUgYnl0ZWNvZGUgaW5k
ZXggZm9yIHRoZSBuZXh0IG5vZGUgdG8gYmUKKyAgICAgICAgICAgIC8vIGVxdWFsIHRvIG91cnMu
IFRoaXMgd2lsbCBoYXBwZW4gZm9yIG9wX3Bvc3RfaW5jLiBBbmQsIGV2ZW4gbW9yZSBvZGRseSwK
KyAgICAgICAgICAgIC8vIHRoaXMgaXMganVzdCBmaW5lLiBPcmRpbmFyaWx5LCB0aGlzIHdvdWxk
bid0IGJlIGZpbmUsIHNpbmNlIGlmIHRoZQorICAgICAgICAgICAgLy8gbmV4dCBub2RlIGZhaWxl
ZCBPU1IgdGhlbiB3ZSdkIGJlIE9TUi1pbmcgd2l0aCB0aGlzIFNldExvY2FsJ3MgbG9jYWwKKyAg
ICAgICAgICAgIC8vIHZhcmlhYmxlIGFscmVhZHkgc2V0IGV2ZW4gdGhvdWdoIGZyb20gdGhlIHN0
YW5kcG9pbnQgb2YgdGhlIG9sZCBKSVQsCisgICAgICAgICAgICAvLyB0aGlzIFNldExvY2FsIHNo
b3VsZCBub3QgaGF2ZSBleGVjdXRlZC4gQnV0IGZvciBvcF9wb3N0X2luYywgaXQncyBqdXN0Cisg
ICAgICAgICAgICAvLyBmaW5lLCBiZWNhdXNlIHRoaXMgU2V0TG9jYWwncyBsb2NhbCAoaS5lLiB0
aGUgTEhTIGluIGEgeCA9IHkrKworICAgICAgICAgICAgLy8gc3RhdGVtZW50KSB3b3VsZCBiZSBk
ZWFkIGFueXdheSAtIHNvIHRoZSBmYWN0IHRoYXQgREZHIHdvdWxkIGhhdmUKKyAgICAgICAgICAg
IC8vIGFscmVhZHkgbWFkZSB0aGUgYXNzaWdubWVudCwgYW5kIGJha2VkIGl0IGludG8gdGhlIHJl
Z2lzdGVyIGZpbGUgZHVyaW5nCisgICAgICAgICAgICAvLyBPU1IgZXhpdCwgd291bGQgbm90IGJl
IHZpc2libGUgdG8gdGhlIG9sZCBKSVQgaW4gYW55IHdheS4KKyAgICAgICAgICAgIG1fY29kZU9y
aWdpbkZvck9TUiA9IG5leHROb2RlLmNvZGVPcmlnaW47CisgICAgICAgIH0KICAgICAgICAgCiAg
ICAgICAgIGlmIChub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3Jt
YXQoKSkgewogICAgICAgICAgICAgU3BlY3VsYXRlRG91YmxlT3BlcmFuZCB2YWx1ZSh0aGlzLCBu
b2RlLmNoaWxkMSgpKTsKQEAgLTE4MzEsNyArMTgzNSw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6
OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBu
byBsb25nZXIgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZgogICAgICAgICAgICAg
Ly8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBmcm9tIHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlv
bnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUsCiAgICAgICAgICAgICAvLyBidXQgdGhhdCBpdCBpcyBz
dG9yZWQgYXMgYSBkb3VibGUuCi0gICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9w
ZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERvdWJsZUluUmVnaXN0ZXJGaWxlKTsK
KyAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgICAgICB2YWx1ZVNv
dXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERvdWJs
ZUluUmVnaXN0ZXJGaWxlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFByZWRpY3Rl
ZFR5cGUgcHJlZGljdGVkVHlwZSA9IG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPnByZWRpY3Rp
b24oKTsKICAgICAgICAgICAgIGlmIChpc0ludDMyUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkg
ewpAQCAtMTg2NCw3ICsxODY5LDggQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2Rl
JiBub2RlKQogCiAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5l
Y2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgIC8vIHRoaXMgYnl0
ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMgb3Igb3RoZXIgbG9jYXRpb25zIGluIHRoZSBy
ZWdpc3RlciBmaWxlLgotICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5k
KG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6Zm9yUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBl
KTsKKyAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgICAgICB2YWx1
ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlOjpm
b3JQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwog
ICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTIwLDcgKzkyMCw4IEBA
IHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVNb3ZIaW50KE5vZGUKIHZvaWQgU3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYgYmxvY2spCiB7CiAgICAgQVNTRVJUKG1fY29tcGls
ZU9rYXkpOwotICAgIEFTU0VSVChtX2NvbXBpbGVJbmRleCA9PSBibG9jay5iZWdpbik7CisgICAg
Ly8gQVNTRVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKKyAgICBtX2NvbXBpbGVJ
bmRleCA9IGJsb2NrLmJlZ2luOwogICAgIAogICAgIGlmICghYmxvY2suaXNSZWFjaGFibGUpIHsK
ICAgICAgICAgbV9jb21waWxlSW5kZXggPSBibG9jay5lbmQ7CkBAIC05NTYsMzYgKzk1Nyw0MSBA
QCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKEJhc2ljQmxvY2smCiAgICAgfQogICAgIAog
ICAgIG1fbGFzdFNldE9wZXJhbmQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwot
ICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IENvZGVPcmlnaW4oKTsKKyAgICBtX2NvZGVPcmlnaW5G
b3JPU1IgPSBhdChibG9jay5lbmQgLSAxKS5jb2RlT3JpZ2luOyAvLyBJbml0aWFsaXplIGl0IHdp
dGggdGhlIGxhc3Qgbm9kZSdzIG9yaWdpbiBpbiB0aGlzIGJsb2NrLgorICAgIGJvb2wgYmxvY2tD
b250YWluc0hvaXN0ZWROb2RlcyA9IChtX2NvbXBpbGVJbmRleCA+PSBtX2ppdC5ncmFwaCgpLm1f
b3JpZ2luYWxTaXplKTsKIAogICAgIGZvciAoOyBtX2NvbXBpbGVJbmRleCA8IGJsb2NrLmVuZDsg
KyttX2NvbXBpbGVJbmRleCkgewogICAgICAgICBOb2RlJiBub2RlID0gYXQobV9jb21waWxlSW5k
ZXgpOwotICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBub2RlLmNvZGVPcmlnaW47CisgICAg
ICAgIGlmICghYmxvY2tDb250YWluc0hvaXN0ZWROb2RlcykKKyAgICAgICAgICAgIG1fY29kZU9y
aWdpbkZvck9TUiA9IG5vZGUuY29kZU9yaWdpbjsKKwogICAgICAgICBpZiAoIW5vZGUuc2hvdWxk
R2VuZXJhdGUoKSkgewogI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9TRSkKICAgICAgICAgICAg
IGZwcmludGYoc3RkZXJyLCAiU3BlY3VsYXRpdmVKSVQgc2tpcHBpbmcgTm9kZSBAJWQgKGJjIyV1
KSBhdCBKSVQgb2Zmc2V0IDB4JXggICAgICIsIChpbnQpbV9jb21waWxlSW5kZXgsIG5vZGUuY29k
ZU9yaWdpbi5ieXRlY29kZUluZGV4LCBtX2ppdC5kZWJ1Z09mZnNldCgpKTsKICNlbmRpZgotICAg
ICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7Ci0gICAgICAgICAgICBjYXNlIFNldExvY2FsOgot
ICAgICAgICAgICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotCi0gICAgICAgICAgICBjYXNlIElubGluZVN0YXJ0OiB7Ci0gICAgICAgICAgICAgICAg
SW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBub2RlLmNvZGVPcmlnaW4uaW5saW5l
Q2FsbEZyYW1lOwotICAgICAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhp
cyA9IGlubGluZUNhbGxGcmFtZS0+YXJndW1lbnRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzOyArK2kpIHsKLSAg
ICAgICAgICAgICAgICAgICAgVmFsdWVSZWNvdmVyeSByZWNvdmVyeSA9IGNvbXB1dGVWYWx1ZVJl
Y292ZXJ5Rm9yKG1fdmFyaWFibGVzW2lubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBDYWxs
RnJhbWU6OmFyZ3VtZW50T2Zmc2V0SW5jbHVkaW5nVGhpcyhpKV0pOwotICAgICAgICAgICAgICAg
ICAgICAvLyBUaGUgcmVjb3ZlcnkgY2Fubm90IHBvaW50IHRvIHJlZ2lzdGVycywgc2luY2UgdGhl
IGNhbGwgZnJhbWUgcmVpZmljYXRpb24gaXNuJ3QKLSAgICAgICAgICAgICAgICAgICAgLy8gYXMg
c21hcnQgYXMgT1NSLCBzbyBpdCBjYW4ndCBoYW5kbGUgdGhhdC4gVGhlIGV4Y2VwdGlvbiBpcyB0
aGUgdGhpcyBhcmd1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2UgZG9uJ3Qg
cmVhbGx5IG5lZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyLgotICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoIWkgfHwgIXJlY292ZXJ5LmlzSW5SZWdpc3RlcnMoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlubGluZUNhbGxGcmFtZS0+YXJndW1lbnRzW2ldID0gcmVjb3Zlcnk7CisgICAgICAgICAg
ICBpZiAoIWJsb2NrQ29udGFpbnNIb2lzdGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBzd2l0
Y2ggKG5vZGUub3ApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNldExvY2FsOgorICAgICAgICAg
ICAgICAgICAgICBjb21waWxlTW92SGludChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIElubGluZVN0YXJ0OiB7CisgICAgICAgICAgICAg
ICAgICAgIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gbm9kZS5jb2RlT3JpZ2lu
LmlubGluZUNhbGxGcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFyZ3VtZW50Q291bnRJ
bmNsdWRpbmdUaGlzID0gaW5saW5lQ2FsbEZyYW1lLT5hcmd1bWVudHMuc2l6ZSgpOworICAgICAg
ICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdU
aGlzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVjb3ZlcnkgcmVjb3Zl
cnkgPSBjb21wdXRlVmFsdWVSZWNvdmVyeUZvcihtX3ZhcmlhYmxlc1tpbmxpbmVDYWxsRnJhbWUt
PnN0YWNrT2Zmc2V0ICsgQ2FsbEZyYW1lOjphcmd1bWVudE9mZnNldEluY2x1ZGluZ1RoaXMoaSld
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNvdmVyeSBjYW5ub3QgcG9pbnQg
dG8gcmVnaXN0ZXJzLCBzaW5jZSB0aGUgY2FsbCBmcmFtZSByZWlmaWNhdGlvbiBpc24ndAorICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gYXMgc21hcnQgYXMgT1NSLCBzbyBpdCBjYW4ndCBoYW5k
bGUgdGhhdC4gVGhlIGV4Y2VwdGlvbiBpcyB0aGUgdGhpcyBhcmd1bWVudCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHdoaWNoIHdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGJlIGFibGUgdG8g
cmVjb3Zlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCghaSB8fCAhcmVjb3Zlcnku
aXNJblJlZ2lzdGVycygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNhbGxGcmFt
ZS0+YXJndW1lbnRzW2ldID0gcmVjb3Zlcnk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAKQEAgLTE1MjEsMjAgKzE1MjcsMjIg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVVJbnQzMlRvTnVtYgogICAgIC8vIHRvIGRv
IHRoaXMgYmVjYXVzZSBieSB0aGlzIHBvaW50LCB0aGUgb3JpZ2luYWwgdmFsdWVzIG5lY2Vzc2Fy
eSB0byBjb21waWxlIHdoYXRldmVyCiAgICAgLy8gb3BlcmF0aW9uIHRoZSBVSW50MzJUb051bWJl
ciBvcmlnaW5hdGVkIGZyb20gbWlnaHQgYmUgZGVhZC4KICAgICBzcGVjdWxhdGlvbkNoZWNrKE92
ZXJmbG93LCBKU1ZhbHVlUmVncygpLCBOb05vZGUsIG1faml0LmJyYW5jaDMyKE1hY3JvQXNzZW1i
bGVyOjpMZXNzVGhhbiwgb3AxLmdwcigpLCBUcnVzdGVkSW1tMzIoMCkpKTsKKyAKKyAgICBpZiAo
bV9jb21waWxlSW5kZXggPCBtX2ppdC5ncmFwaCgpLm1fb3JpZ2luYWxTaXplKSB7CisgICAgICAg
IC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBkbyByb2xsIGZvcndhcmQuCisgICAgICAgIEFTU0VSVChh
dChtX2NvbXBpbGVJbmRleCArIDEpLm9wID09IFNldExvY2FsKTsKKyAgICAgICAgQVNTRVJUKGF0
KG1fY29tcGlsZUluZGV4ICsgMSkuY29kZU9yaWdpbiA9PSBub2RlLmNvZGVPcmlnaW4pOworICAg
ICAgICBBU1NFUlQoYXQobV9jb21waWxlSW5kZXggKyAyKS5jb2RlT3JpZ2luICE9IG5vZGUuY29k
ZU9yaWdpbik7CisgICAgICAgIAorICAgICAgICAvLyBOb3cgZG8gdGhlIG1hZ2ljLgorICAgICAg
ICBPU1JFeGl0JiBleGl0ID0gbV9qaXQuY29kZUJsb2NrKCktPmxhc3RPU1JFeGl0KCk7CisgICAg
ICAgIE5vZGUmIHNldExvY2FsID0gYXQobV9jb21waWxlSW5kZXggKyAxKTsKKyAgICAgICAgZXhp
dC5tX2NvZGVPcmlnaW4gPSBhdChtX2NvbXBpbGVJbmRleCArIDIpLmNvZGVPcmlnaW47CisgICAg
ICAgIGV4aXQubV9sYXN0U2V0T3BlcmFuZCA9IHNldExvY2FsLmxvY2FsKCk7CiAgICAgICAgIAot
ICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBkbyByb2xsIGZvcndhcmQuCi0gICAgQVNTRVJUKGF0
KG1fY29tcGlsZUluZGV4ICsgMSkub3AgPT0gU2V0TG9jYWwpOwotICAgIEFTU0VSVChhdChtX2Nv
bXBpbGVJbmRleCArIDEpLmNvZGVPcmlnaW4gPT0gbm9kZS5jb2RlT3JpZ2luKTsKLSAgICBBU1NF
UlQoYXQobV9jb21waWxlSW5kZXggKyAyKS5jb2RlT3JpZ2luICE9IG5vZGUuY29kZU9yaWdpbik7
Ci0gICAgICAgIAotICAgIC8vIE5vdyBkbyB0aGUgbWFnaWMuCi0gICAgT1NSRXhpdCYgZXhpdCA9
IG1faml0LmNvZGVCbG9jaygpLT5sYXN0T1NSRXhpdCgpOwotICAgIE5vZGUmIHNldExvY2FsID0g
YXQobV9jb21waWxlSW5kZXggKyAxKTsKLSAgICBleGl0Lm1fY29kZU9yaWdpbiA9IGF0KG1fY29t
cGlsZUluZGV4ICsgMikuY29kZU9yaWdpbjsKLSAgICBleGl0Lm1fbGFzdFNldE9wZXJhbmQgPSBz
ZXRMb2NhbC5sb2NhbCgpOwotICAgICAgICAKLSAgICAvLyBDcmVhdGUgdGhlIHZhbHVlIHJlY292
ZXJ5LCBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0gICAgZXhpdC52YWx1ZVJl
Y292ZXJ5Rm9yT3BlcmFuZChzZXRMb2NhbC5sb2NhbCgpKSA9IFZhbHVlUmVjb3Zlcnk6OnVpbnQz
MkluR1BSKG9wMS5ncHIoKSk7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgdmFsdWUgcmVjb3Zlcnks
IGFuZCBzdHVmZiBpdCBpbnRvIHRoZSByaWdodCBwbGFjZS4KKyAgICAgICAgZXhpdC52YWx1ZVJl
Y292ZXJ5Rm9yT3BlcmFuZChzZXRMb2NhbC5sb2NhbCgpKSA9IFZhbHVlUmVjb3Zlcnk6OnVpbnQz
MkluR1BSKG9wMS5ncHIoKSk7CisgICAgfQogCiAgICAgbV9qaXQubW92ZShvcDEuZ3ByKCksIHJl
c3VsdC5ncHIoKSk7CiAgICAgaW50ZWdlclJlc3VsdChyZXN1bHQuZ3ByKCksIG1fY29tcGlsZUlu
ZGV4LCBvcDEuZm9ybWF0KCkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ludGVycHJl
dGVyL0ludGVycHJldGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNzA4LDYgKzM3MDgsMTEgQEAgc2tpcF9pZF9jdXN0b21fc2VsZjoKICAgICAgICAgdlBD
ICs9IE9QQ09ERV9MRU5HVEgob3BfbG9vcF9oaW50KTsKICAgICAgICAgTkVYVF9JTlNUUlVDVElP
TigpOwogICAgIH0KKyAgICBERUZJTkVfT1BDT0RFKG9wX2xvb3BfcHJlaGVhZGVyKSB7CisgICAg
ICAgIC8vIFRoaXMgaXMgYSBuby1vcCB1bmxlc3Mgd2UgaW50ZW5kIG9uIGRvaW5nIE9TUiBmcm9t
IHRoZSBpbnRlcnByZXRlci4KKyAgICAgICAgdlBDICs9IE9QQ09ERV9MRU5HVEgob3BfbG9vcF9w
cmVoZWFkZXIpOworICAgICAgICBORVhUX0lOU1RSVUNUSU9OKCk7CisgICAgfQogICAgIERFRklO
RV9PUENPREUob3BfbG9vcF9pZl90cnVlKSB7CiAgICAgICAgIC8qIGxvb3BfaWZfdHJ1ZSBjb25k
KHIpIHRhcmdldChvZmZzZXQpCiAgICAgICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9qaXQvSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJ
VC5jcHAJKHJldmlzaW9uIDEwNjM0MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklU
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTAxLDggKzEwMSwxMCBAQCB2b2lkIEpJVDo6ZW1pdE9w
dGltaXphdGlvbkNoZWNrKE9wdGltaXphCiAgICAgCiAgICAgSnVtcCBza2lwT3B0aW1pemUgPSBi
cmFuY2hBZGQzMihTaWduZWQsIFRydXN0ZWRJbW0zMihraW5kID09IExvb3BPcHRpbWl6YXRpb25D
aGVjayA/IE9wdGlvbnM6OmV4ZWN1dGlvbkNvdW50ZXJJbmNyZW1lbnRGb3JMb29wIDogT3B0aW9u
czo6ZXhlY3V0aW9uQ291bnRlckluY3JlbWVudEZvclJldHVybiksIEFic29sdXRlQWRkcmVzcyht
X2NvZGVCbG9jay0+YWRkcmVzc09mSklURXhlY3V0ZUNvdW50ZXIoKSkpOwogICAgIEpJVFN0dWJD
YWxsIHN0dWJDYWxsKHRoaXMsIGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gY3RpX29w
dGltaXplX2Zyb21fbG9vcCA6IGN0aV9vcHRpbWl6ZV9mcm9tX3JldCk7Ci0gICAgaWYgKGtpbmQg
PT0gTG9vcE9wdGltaXphdGlvbkNoZWNrKQotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJ
bW0zMihtX2J5dGVjb2RlT2Zmc2V0KSk7CisgICAgaWYgKGtpbmQgPT0gTG9vcE9wdGltaXphdGlv
bkNoZWNrKSB7CisgICAgICAgIEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24gPSBtX2Nv
ZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuYmVnaW4oKSArIG1fYnl0ZWNvZGVPZmZzZXQ7CisgICAg
ICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0ZWNvZGVPZmZzZXQgKyBjdXJyZW50
SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kKSk7CisgICAgfQogICAgIHN0dWJDYWxsLmNhbGwoKTsK
ICAgICBza2lwT3B0aW1pemUubGluayh0aGlzKTsKIH0KQEAgLTI5MSw2ICsyOTMsNyBAQCB2b2lk
IEpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcygpCiAgICAgICAgIERFRklORV9PUChvcF9qdHJ1
ZSkKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3ApCiAgICAgICAgIERFRklORV9PUChvcF9sb29w
X2hpbnQpCisgICAgICAgIERFRklORV9PUChvcF9sb29wX3ByZWhlYWRlcikKICAgICAgICAgREVG
SU5FX09QKG9wX2xvb3BfaWZfbGVzcykKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaWZfbGVz
c2VxKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9ncmVhdGVyKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVC5oCShyZXZpc2lvbiAxMDYzNDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaml0L0pJVC5oCSh3b3JraW5nIGNvcHkpCkBAIC04MjEsNiArODIxLDcgQEAgbmFtZXNwYWNl
IEpTQyB7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9qdHJ1ZShJbnN0cnVjdGlvbiopOwogICAgICAg
ICB2b2lkIGVtaXRfb3BfbG9vcChJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3Bf
bG9vcF9oaW50KEluc3RydWN0aW9uKik7CisgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX3ByZWhl
YWRlcihJbnN0cnVjdGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9sZXNzKElu
c3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3NlcShJbnN0cnVj
dGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9ncmVhdGVyKEluc3RydWN0aW9u
Kik7CkBAIC0xMTAyLDYgKzExMDMsMTAgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIGVtaXRP
cHRpbWl6YXRpb25DaGVjayhMb29wT3B0aW1pemF0aW9uQ2hlY2spOwogICAgIH0KIAorICAgIGlu
bGluZSB2b2lkIEpJVDo6ZW1pdF9vcF9sb29wX3ByZWhlYWRlcihJbnN0cnVjdGlvbiopCisgICAg
eworICAgIH0KKwogICAgIGlubGluZSB2b2lkIEpJVDo6ZW1pdF9vcF9sb29wX2lmX3RydWUoSW5z
dHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKICAgICB7CiAgICAgICAgIGVtaXRUaW1lb3V0
Q2hlY2soKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125286</attachid>
            <date>2012-02-03 01:27:29 -0800</date>
            <delta_ts>2012-02-05 23:12:42 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.12.patch</filename>
            <type>text/plain</type>
            <size>93872</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2NjI5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzOSBA
QAorMjAxMi0wMi0wMyAgWXVxaWFuZyBYaWFuICA8eXVxaWFuZy54aWFuQGludGVsLmNvbT4KKwor
ICAgICAgICBMb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBpbiBKU0MgREZHCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3MuCisK
KyAgICAgICAgVGhlIGZyYW1ld29yayB0byBzdXBwb3J0IG1vdmluZyBhIERGRyBub2RlIChhbmQg
dGhlIG5vZGVzIGNoYWluZWQgd2l0aAorICAgICAgICByZWZlcmVuY2VzKSB0byBhIGRpZmZlcmVu
dCBiYXNpYyBibG9jayBpcyBzdXBwb3NlZCB0byB3b3JrLCBhcyB3ZWxsIGFzCisgICAgICAgIHRo
ZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBjcm9zcy1ibG9jayByZWZlcmVuY2VzLgorICAgICAgICBB
IGJhc2ljIGJsb2NrIGRvbWluYW5jZSBhbmFseXNpcyBhbGdvcml0aG0gaXMgaW50cm9kdWNlZCB0
byBkZXRlcm1pbmUKKyAgICAgICAgd2hpY2ggbG9vcCBibG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVy
ZWQgZm9yIGNvZGUgbW90aW9uOiB0aGUgYmxvY2tzCisgICAgICAgIHRoYXQgZG9taW5hdGUgdGhl
IGxvb3AgZXhpdC4KKyAgICAgICAgU2lkZSBlZmZlY3RzIGFuYWx5c2lzIG9mIGEgbG9vcCBpcyBw
ZXJmb3JtZWQgdG8gZmluZCBvdXQgaWYgdGhlcmUncmUKKyAgICAgICAgcG9zc2libGUgbW9kaWZp
Y2F0aW9ucyB0byB0aGUgcHJvcGVydGllcyBvciB0aGUgc3RydWN0dXJlcywgYW5kIGlmCisgICAg
ICAgIHRoZXJlJ3JlIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGxvY2FsIG9yIHRoZSBn
bG9iYWwgdmFyaWFibGVzLAorICAgICAgICB0byBoZWxwIHVzIG1vcmUgYWNjdXJhdGVseSBkZXRl
cm1pbmUgd2hldGhlciBhIERGRyBub2RlIGlzIGluZGVlZCBsb29wCisgICAgICAgIGludmFyaWFu
dCBvciBub3QuCisgICAgICAgIFRoZSBQaGkgc3RhY2sgcHJvY2Vzc2luZyBsb2dpYyBpcyBtb3Zl
ZCBmcm9tIERGR0J5dGVDb2RlUGFyc2VyIHRvCisgICAgICAgIERGR0dyYXBoLCBhcyB0aGVyZSds
bCBiZSBuZXcgUGhpIG5vZGVzIHRvIGJlIHByb2Nlc3NlZCBhZnRlciBMSUNNLgorICAgICAgICBT
b21lIENGQSBhbmFseXNpcyBpc3N1ZXMgYWZ0ZXIgTElDTSBpcyBleHBvc2VkIGFuZCBmaXhlZC4K
KyAgICAgICAgVGhlIE9TUiBlbnRyeSBpcyBtb2RpZmllZC4gVGhlcmUncyBhIGRlZGljYXRlZCBs
b29wIHByZWhlYWRlciBibG9jayBhcworICAgICAgICB0aGUgT1NSIGVudHJ5LiBBbHNvIHNvbWUg
Q0ZBIGFuYWx5c2lzIHByb2JsZW1zIHRoYXQgY2F1c2UgT1NSIGZhaWx1cmVzCisgICAgICAgIGFy
ZSBmaXhlZC4gQW5kIGR1ZSB0byB0aGUgZmFjdCB0aGF0IE9TUiBlbnRyeSBjYW4gYmUgaW4gYSBu
ZXN0ZWQgbG9vcCwKKyAgICAgICAgY3VycmVudGx5IExJQ00gaXMgb25seSBwZXJmb3JtZWQgZm9y
IGlubmVybW9zdCBsb29wcy4KKyAgICAgICAgU29tZSB0d2Vha3MgYXJlIG1hZGUgd2hlbiByZWNv
cmRpbmcgdGhlIGxvY2FsIHZhcmlhYmxlcycgc3RhdGVzIGluCisgICAgICAgIGNvZGUgZ2VuZXJh
dGlvbiwgdG8gZW5zdXJlIHRoZSBzdGF0ZXMgYXJlIGNvcnJlY3QgYXQgT1NSIGV4aXQsCisgICAg
ICAgIGVzcGVjaWFsbHkgaWYgdGhlIE9TUiBleGl0IGhhcHBlbnMgaW5zaWRlIGEgbG9vcCB3aGlj
aCBoYXMgaG9pc3RlZAorICAgICAgICBsb29wIGludmFyaWFudHMuCisKKyAgICAgICAgKiBieXRl
Y29kZS9Db2RlQmxvY2suY3BwOgorICAgICAgICAoSlNDOjpDb2RlQmxvY2s6OmR1bXApOgorICAg
ICAgICAqIGJ5dGVjb2RlL09wY29kZS5oOgorICAgICAgICAoSlNDKToKKyAgICAgICAgKEpTQzo6
cGFkT3Bjb2RlTmFtZSk6CisgICAgICAgICogYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wSGludCk6Cisg
ICAgICAgIChKU0MpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvb3BQ
cmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oOgor
ICAgICAgICAoQnl0ZWNvZGVHZW5lcmF0b3IpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rl
c0NvZGVnZW4uY3BwOgorICAgICAgICAoSlNDOjpEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToK
KyAgICAgICAgKEpTQzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpG
b3JOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRl
Y29kZSk6CisgICAgICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlND
OjpERkc6OkFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNCbG9jayk6CisgICAgICAgIChKU0M6OkRG
Rzo6QWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VGFpbCk6CisgICAgICAgICogZGZnL0RGR0J5
dGVDb2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEJ5dGVDb2RlUGFyc2VyKToKKyAgICAgICAgKEpT
Qzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6Z2V0TG9jYWwpOgorICAgICAgICAoSlNDOjpERkc6OkJ5
dGVDb2RlUGFyc2VyOjpnZXRBcmd1bWVudCk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQ
YXJzZXI6OmZsdXNoKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2VC
bG9jayk6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2Vy
OjpwYXJzZSk6CisgICAgICAgICogZGZnL0RGR0NhcGFiaWxpdGllcy5oOgorICAgICAgICAoSlND
OjpERkc6OmNhbkNvbXBpbGVPcGNvZGUpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmR1bXApOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBo
OjpwcmVkaWN0QXJndW1lbnRUeXBlcyk6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpwcm9jZXNzUGhpU3RhY2spOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5oOgor
ICAgICAgICAoTG9vcFByZUhlYWRlcik6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OlBoaVN0YWNrRW50cnk6OlBoaVN0YWNrRW50cnkpOgorICAgICAgICAoUGhpU3RhY2tFbnRy
eSk6CisgICAgICAgIChHcmFwaCk6CisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6Cisg
ICAgICAgIChKU0M6OkRGRzo6SklUQ29tcGlsZXI6Om5vdGljZU9TUkVudHJ5KToKKyAgICAgICAg
KiBkZmcvREZHTm9kZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OnNldFZhcmlhYmxlQWNj
ZXNzRGF0YSk6CisgICAgICAgIChOb2RlKToKKyAgICAgICAgKiBkZmcvREZHUHJvcGFnYXRvci5j
cHA6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Zml4cG9pbnQpOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6OnByb3BhZ2F0ZU5vZGVQcmVkaWN0aW9ucyk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Y29tcGFyZUVxSXNQdXJlKToKKyAgICAgICAgKFByb3Bh
Z2F0b3IpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmNsb2JiZXJzV29ybGQpOgor
ICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnBlcmZvcm1TdWJzdGl0dXRpb24pOgorICAg
ICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmxvY2FsQ1NFKToKKyAgICAgICAgKEpTQzo6REZH
OjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6Okxvb3BTaWRlRWZmZWN0cyk6CisgICAgICAg
IChMb29wU2lkZUVmZmVjdHMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRHbG9iYWxWYXIpOgorICAgICAgICAoSlNDOjpERkc6OlBy
b3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRCeVZhbCk6CisgICAgICAgIChK
U0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdENoZWNrU3RydWN0
dXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNh
bkhvaXN0R2V0QnlPZmZzZXQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRJbmRleGVkUHJvcGVy
dHlTdG9yYWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVj
dHM6OmNhbkhvaXN0R2V0QXJyYXlMZW5ndGgpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRTdHJpbmdMZW5ndGgpOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2xvYmJlckdldEdsb2JhbFZh
cik6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9i
YmVyR2V0QnlWYWwpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZm
ZWN0czo6Y2xvYmJlckNoZWNrU3RydWN0dXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdh
dG9yOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRCeU9mZnNldCk6CisgICAgICAgIChKU0M6
OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyR2V0UHJvcGVydHlTdG9y
YWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNs
b2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9w
YWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRBcnJheUxlbmd0aCk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyR2V0U3RyaW5n
TGVuZ3RoKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjphbmFseXplTG9vcFNpZGVF
ZmZlY3RzKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjppc0hvaXN0Q2FuZGlkYXRl
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpub2RlQ2FuQmVIb2lzdGVkKToKKyAg
ICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtSG9pc3QpOgorICAgICAgICAoSlND
OjpERkc6OlByb3BhZ2F0b3I6OmhvaXN0R2V0TG9jYWwpOgorICAgICAgICAoSlNDOjpERkc6OlBy
b3BhZ2F0b3I6OmZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9w
YWdhdG9yOjpoYW5kbGVIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OmlzTG9vcFByZUhlYWRlckJsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
OjppbnRlcnNlY3QpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmNvbXB1dGVEb21p
bmF0b3JzKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtTElDTSk6Cisg
ICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6bG9vcEludmFyaWFudENvZGVNb3Rpb24pOgor
ICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycyk6
CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUJsb2NrQ0ZBKToKKyAgICAg
ICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1
bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6
Y29tcGlsZVVJbnQzMlRvTnVtYmVyKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgor
ICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZSk6CisgICAgICAgICogaW50ZXJwcmV0ZXIvSW50ZXJw
cmV0ZXIuY3BwOgorICAgICAgICAoSlNDOjpJbnRlcnByZXRlcjo6cHJpdmF0ZUV4ZWN1dGUpOgor
ICAgICAgICAqIGppdC9KSVQuY3BwOgorICAgICAgICAoSlNDOjpKSVQ6OmVtaXRPcHRpbWl6YXRp
b25DaGVjayk6CisgICAgICAgIChKU0M6OkpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcyk6Cisg
ICAgICAgICogaml0L0pJVC5oOgorICAgICAgICAoSklUKToKKyAgICAgICAgKEpTQzo6SklUOjpl
bWl0X29wX2xvb3BfaGludCk6CisgICAgICAgIChKU0MpOgorICAgICAgICAoSlNDOjpKSVQ6OmVt
aXRfb3BfbG9vcF9wcmVoZWFkZXIpOgorCiAyMDEyLTAyLTAyICBIYWppbWUgTW9ycml0YSAgPG1v
cnJpdGFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJlbW92aW5nIGFuIHVu
bmVjZXNzYXJpbHkgSlNfUFJJVkFURV9FWFBPUlQgYW5ub3RhdGlvbi4KSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxMDY2Mjkp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTA5Miw3ICsxMDkyLDEyIEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wKEV4ZWNT
dGF0ZSogZXhlYywgY28KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNh
c2Ugb3BfbG9vcF9oaW50OiB7Ci0gICAgICAgICAgICBwcmludGYoIlslNGRdIGxvb3BfaGludFxu
IiwgbG9jYXRpb24pOworICAgICAgICAgICAgaW50IG9mZnNldCA9ICgrK2l0KS0+dS5vcGVyYW5k
OworICAgICAgICAgICAgcHJpbnRmKCJbJTRkXSBsb29wX2hpbnRcdFx0IHByZUhlYWRlcigtPiVk
KVxuIiwgbG9jYXRpb24sIGxvY2F0aW9uICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAg
IHByaW50ZigiWyU0ZF0gbG9vcF9wcmVoZWFkZXJcbiIsIGxvY2F0aW9uKTsKICAgICAgICAgICAg
IGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Ugb3Bfc3dpdGNoX2ltbTogewpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaAkocmV2aXNpb24gMTA2NjI5KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC0xNTYsNyArMTU2LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIG1hY3JvKG9wX2xv
b3BfaWZfbGVzc2VxLCA0KSBcCiAgICAgICAgIG1hY3JvKG9wX2xvb3BfaWZfZ3JlYXRlciwgNCkg
XAogICAgICAgICBtYWNybyhvcF9sb29wX2lmX2dyZWF0ZXJlcSwgNCkgXAotICAgICAgICBtYWNy
byhvcF9sb29wX2hpbnQsIDEpIFwKKyAgICAgICAgbWFjcm8ob3BfbG9vcF9oaW50LCAyKSBcCisg
ICAgICAgIG1hY3JvKG9wX2xvb3BfcHJlaGVhZGVyLCAxKSBcCiAgICAgICAgIG1hY3JvKG9wX3N3
aXRjaF9pbW0sIDQpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX2NoYXIsIDQpIFwKICAgICAg
ICAgbWFjcm8ob3Bfc3dpdGNoX3N0cmluZywgNCkgXApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHJl
dmlzaW9uIDEwNjYyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0
ZWNvZGVHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NjUsMTAgKzY2NSwxOSBAQCBW
YWx1ZVByb2ZpbGUqIEJ5dGVjb2RlR2VuZXJhdG9yOjplbWl0UHJvCiAgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIAotdm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvb3BIaW50KCkKK3ZvaWQgQnl0
ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wSGludChMYWJlbCogcHJlSGVhZGVyKQogewogI2lmIEVO
QUJMRShERkdfSklUKQorICAgIHNpemVfdCBiZWdpbiA9IGluc3RydWN0aW9ucygpLnNpemUoKTsK
ICAgICBlbWl0T3Bjb2RlKG9wX2xvb3BfaGludCk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5k
KHByZUhlYWRlci0+YmluZChiZWdpbiwgaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKSk7CisjZW5kaWYK
K30KKwordm9pZCBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIoKQoreworI2lm
IEVOQUJMRShERkdfSklUKQorICAgIGVtaXRPcGNvZGUob3BfbG9vcF9wcmVoZWFkZXIpOwogI2Vu
ZGlmCiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNv
ZGVHZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNv
bXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHJldmlzaW9uIDEwNjYyOSkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAkod29ya2luZyBj
b3B5KQpAQCAtNDczLDcgKzQ3Myw4IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB2b2lkIGVt
aXRUb1ByaW1pdGl2ZShSZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIHNyYyk7CiAKICAgICAg
ICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdExhYmVsKExhYmVsKik7Ci0gICAgICAgIHZvaWQgZW1p
dExvb3BIaW50KCk7CisgICAgICAgIHZvaWQgZW1pdExvb3BIaW50KExhYmVsKiBwcmVIZWFkZXIp
OworICAgICAgICB2b2lkIGVtaXRMb29wUHJlSGVhZGVyKCk7CiAgICAgICAgIFBhc3NSZWZQdHI8
TGFiZWw+IGVtaXRKdW1wKExhYmVsKiB0YXJnZXQpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVs
PiBlbWl0SnVtcElmVHJ1ZShSZWdpc3RlcklEKiBjb25kLCBMYWJlbCogdGFyZ2V0KTsKICAgICAg
ICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdEp1bXBJZkZhbHNlKFJlZ2lzdGVySUQqIGNvbmQsIExh
YmVsKiB0YXJnZXQpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkocmV2aXNpb24gMTA2NjI5KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNTExLDkgKzE1MTEsMTMgQEAgUmVnaXN0ZXJJRCogRG9XaGlsZU5vZGU6OmVtaXRCeXRl
Y29kZShCeQogewogICAgIFJlZlB0cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdM
YWJlbFNjb3BlKExhYmVsU2NvcGU6Okxvb3ApOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJl
SGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChs
b29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsK
KwogICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAg
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5l
bWl0TG9vcEhpbnQoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIu
Z2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50
LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CiAgICAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
cmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwpAQCAtMTUzNywx
NSArMTU0MSwxOCBAQCBSZWdpc3RlcklEKiBXaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiB7
CiAgICAgUmVmUHRyPExhYmVsU2NvcGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUo
TGFiZWxTY29wZTo6TG9vcCk7CiAKKyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBn
ZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFk
ZXIuZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcFByZUhlYWRlcigpOwogICAgIGdlbmVy
YXRvci5lbWl0SnVtcChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CiAKICAgICBSZWZQdHI8TGFi
ZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRvci5lbWl0
TGFiZWwodG9wT2ZMb29wLmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KCk7Ci0g
ICAgCisKICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7CiAKICAgICBn
ZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsKKyAgICBnZW5lcmF0
b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0
RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBtX2V4cHItPmxpbmVObygpLCBtX2V4cHIt
PmxpbmVObygpKTsKIAogICAgIGlmIChtX2V4cHItPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2Vu
KCkpCkBAIC0xNTcyLDEyICsxNTc5LDE1IEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY28KICAgICBpZiAobV9leHByMSkKICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2Rl
KGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcjEpOwogCisgICAgUmVmUHRyPExhYmVs
PiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVt
aXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVI
ZWFkZXIoKTsKKwogICAgIFJlZlB0cjxMYWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5ld0xh
YmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7CiAKICAgICBS
ZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVy
YXRvci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BI
aW50KCk7CiAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXRO
b2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwogCkBAIC0xNTg3LDYgKzE1OTcsNyBAQCBSZWdpc3RlcklE
KiBGb3JOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvCiAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9k
ZShnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpLCBtX2V4cHIzKTsKIAogICAgIGdlbmVyYXRvci5l
bWl0TGFiZWwoY29uZGl0aW9uLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxv
b3BQcmVIZWFkZXIuZ2V0KCkpOwogICAgIGlmIChtX2V4cHIyKSB7CiAgICAgICAgIGlmIChtX2V4
cHIyLT5oYXNDb25kaXRpb25Db250ZXh0Q29kZWdlbigpKQogICAgICAgICAgICAgZ2VuZXJhdG9y
LmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwcjIsIHRvcE9mTG9vcC5nZXQoKSwgc2Nv
cGUtPmJyZWFrVGFyZ2V0KCksIGZhbHNlKTsKQEAgLTE2MjEsMTEgKzE2MzIsMTQgQEAgUmVnaXN0
ZXJJRCogRm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZQogICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBzaXplID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwogICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBleHBlY3RlZFN1YnNjcmlwdDsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gaXRlciA9IGdlbmVy
YXRvci5lbWl0R2V0UHJvcGVydHlOYW1lcyhnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGJhc2Uu
Z2V0KCksIGkuZ2V0KCksIHNpemUuZ2V0KCksIHNjb3BlLT5icmVha1RhcmdldCgpKTsKKworICAg
IFJlZlB0cjxMYWJlbD4gbG9vcFByZUhlYWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAg
IGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9y
LmVtaXRMb29wUHJlSGVhZGVyKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250
aW51ZVRhcmdldCgpKTsKIAogICAgIFJlZlB0cjxMYWJlbD4gbG9vcFN0YXJ0ID0gZ2VuZXJhdG9y
Lm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wU3RhcnQuZ2V0KCkpOwot
ICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsKIAogICAgIFJlZ2lzdGVySUQqIHByb3BlcnR5
TmFtZTsKICAgICBib29sIG9wdGltaXplZEZvcmluQWNjZXNzID0gZmFsc2U7CkBAIC0xNjcyLDYg
KzE2ODYsNyBAQCBSZWdpc3RlcklEKiBGb3JJbk5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiAgICAg
ICAgIGdlbmVyYXRvci5wb3BPcHRpbWlzZWRGb3JJbigpOwogCiAgICAgZ2VuZXJhdG9yLmVtaXRM
YWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGlu
dChsb29wUHJlSGVhZGVyLmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdE5leHRQcm9wZXJ0eU5h
bWUocHJvcGVydHlOYW1lLCBiYXNlLmdldCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBpdGVyLmdl
dCgpLCBsb29wU3RhcnQuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxF
eGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CiAgICAgZ2VuZXJhdG9y
LmVtaXRMYWJlbChzY29wZS0+YnJlYWtUYXJnZXQoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHJldmlzaW9uIDEwNjYyOSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTkyLDggKzkyLDYgQEAgdm9pZCBBYnN0cmFjdFN0YXRlOjpiZWdpbkJhc2ljQmxv
Y2soQmFzaQogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIGJhc2ljQmxvY2stPmNmYVNob3Vs
ZFJldmlzaXQgPSBmYWxzZTsKLSAgICBiYXNpY0Jsb2NrLT5jZmFIYXNWaXNpdGVkID0gdHJ1ZTsK
ICAgICBtX2Jsb2NrID0gYmFzaWNCbG9jazsKICAgICBtX2lzVmFsaWQgPSB0cnVlOwogfQpAQCAt
OTQ4LDE1ICs5NDYsMjAgQEAgaW5saW5lIGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0
VAogICAgICAgICAKICAgICBBYnN0cmFjdFZhbHVlKiBzb3VyY2U7CiAgICAgICAgIAotICAgIE5v
ZGUmIG5vZGUgPSBtX2dyYXBoW25vZGVJbmRleF07Ci0gICAgaWYgKCFub2RlLnJlZkNvdW50KCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBOb2RlKiBub2RlUHRyID0gJm1fZ3JhcGhbbm9k
ZUluZGV4XTsKKyAgICBpZiAoIW5vZGVQdHItPnJlZkNvdW50KCkpIHsKKyAgICAgICAgaWYgKG5v
ZGVQdHItPm9wID09IEdldExvY2FsKSB7CisgICAgICAgICAgICBBU1NFUlQobm9kZVB0ci0+Y2hp
bGQxKCkgIT0gTm9Ob2RlKTsKKyAgICAgICAgICAgIG5vZGVQdHIgPSAmbV9ncmFwaFtub2RlUHRy
LT5jaGlsZDEoKV07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KICAgICAKICNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAg
ICAgICAgICAgICBwcmludGYoIiAgICAgICAgICBJdCdzIGxpdmUsIG5vZGUgQCV1LlxuIiwgbm9k
ZUluZGV4KTsKICNlbmRpZgogCi0gICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgc3dpdGNoIChu
b2RlUHRyLT5vcCkgewogICAgIGNhc2UgUGhpOgogICAgIGNhc2UgU2V0QXJndW1lbnQ6CiAgICAg
Y2FzZSBGbHVzaDoKQEAgLTk3OCw3ICs5ODEsNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRl
OjptZXJnZVN0YXRlQXRUCiAgICAgY2FzZSBTZXRMb2NhbDoKICAgICAgICAgLy8gVGhlIGJsb2Nr
IHNldHMgdGhlIHZhcmlhYmxlLCBhbmQgcG90ZW50aWFsbHkgcmVmaW5lcyBpdCwgYm90aAogICAg
ICAgICAvLyBiZWZvcmUgYW5kIGFmdGVyIHNldHRpbmcgaXQuCi0gICAgICAgIHNvdXJjZSA9ICZm
b3JOb2RlKG5vZGUuY2hpbGQxKCkpOworICAgICAgICBzb3VyY2UgPSAmZm9yTm9kZShub2RlUHRy
LT5jaGlsZDEoKSk7CiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQog
ICAgICAgICBwcmludGYoIiAgICAgICAgICBTZXR0aW5nLlxuIik7CiAjZW5kaWYKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCShyZXZp
c2lvbiAxMDY2MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFy
c2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTAxLDEzICsxMDEsNiBAQCBwcml2YXRlOgogICAg
IC8vIExpbmsgYmxvY2sgc3VjY2Vzc29ycy4KICAgICB2b2lkIGxpbmtCbG9jayhCYXNpY0Jsb2Nr
KiwgVmVjdG9yPEJsb2NrSW5kZXg+JiBwb3NzaWJsZVRhcmdldHMpOwogICAgIHZvaWQgbGlua0Js
b2NrcyhWZWN0b3I8VW5saW5rZWRCbG9jaz4mIHVubGlua2VkQmxvY2tzLCBWZWN0b3I8QmxvY2tJ
bmRleD4mIHBvc3NpYmxlVGFyZ2V0cyk7Ci0gICAgLy8gTGluayBHZXRMb2NhbCAmIFNldExvY2Fs
IG5vZGVzLCB0byBlbnN1cmUgbGl2ZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZC4KLSAgICBlbnVtIFBo
aVN0YWNrVHlwZSB7Ci0gICAgICAgIExvY2FsUGhpU3RhY2ssCi0gICAgICAgIEFyZ3VtZW50UGhp
U3RhY2sKLSAgICB9OwotICAgIHRlbXBsYXRlPFBoaVN0YWNrVHlwZSBzdGFja1R5cGU+Ci0gICAg
dm9pZCBwcm9jZXNzUGhpU3RhY2soKTsKICAgICAvLyBBZGQgc3BpbGwgbG9jYXRpb25zIHRvIG5v
ZGVzLgogICAgIHZvaWQgYWxsb2NhdGVWaXJ0dWFsUmVnaXN0ZXJzKCk7CiAgICAgCkBAIC0xODks
NyArMTgyLDcgQEAgcHJpdmF0ZToKICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJs
ZUFjY2Vzc0RhdGEgPSBuZXdWYXJpYWJsZUFjY2Vzc0RhdGEob3BlcmFuZCk7CiAgICAgICAgIAog
ICAgICAgICBOb2RlSW5kZXggcGhpID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyh2YXJpYWJsZUFj
Y2Vzc0RhdGEpKTsKLSAgICAgICAgbV9sb2NhbFBoaVN0YWNrLmFwcGVuZChQaGlTdGFja0VudHJ5
KG1fY3VycmVudEJsb2NrLCBwaGksIG9wZXJhbmQpKTsKKyAgICAgICAgbV9ncmFwaC5tX2xvY2Fs
UGhpU3RhY2suYXBwZW5kKFBoaVN0YWNrRW50cnkobV9jdXJyZW50QmxvY2ssIHBoaSwgb3BlcmFu
ZCkpOwogICAgICAgICBub2RlSW5kZXggPSBhZGRUb0dyYXBoKEdldExvY2FsLCBPcEluZm8odmFy
aWFibGVBY2Nlc3NEYXRhKSwgcGhpKTsKICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxl
c0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG5vZGVJbmRleDsKICAgICAgICAgCkBAIC0yNDQsNyAr
MjM3LDcgQEAgcHJpdmF0ZToKICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZUFj
Y2Vzc0RhdGEgPSBuZXdWYXJpYWJsZUFjY2Vzc0RhdGEob3BlcmFuZCk7CiAKICAgICAgICAgTm9k
ZUluZGV4IHBoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRhKSk7
Ci0gICAgICAgIG1fYXJndW1lbnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJl
bnRCbG9jaywgcGhpLCBhcmd1bWVudCkpOworICAgICAgICBtX2dyYXBoLm1fYXJndW1lbnRQaGlT
dGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBhcmd1bWVudCkp
OwogICAgICAgICBub2RlSW5kZXggPSBhZGRUb0dyYXBoKEdldExvY2FsLCBPcEluZm8odmFyaWFi
bGVBY2Nlc3NEYXRhKSwgcGhpKTsKICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0
VGFpbC5hcmd1bWVudChhcmd1bWVudCkgPSBub2RlSW5kZXg7CiAgICAgICAgIApAQCAtMjk4LDEx
ICsyOTEsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgTm9kZUluZGV4IHBoaSA9IGFkZFRvR3JhcGgo
UGhpLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRhKSk7CiAgICAgICAgIG5vZGVJbmRleCA9IGFk
ZFRvR3JhcGgoRmx1c2gsIE9wSW5mbyh2YXJpYWJsZUFjY2Vzc0RhdGEpLCBwaGkpOwogICAgICAg
ICBpZiAob3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpIHsKLSAgICAgICAgICAgIG1fYXJndW1l
bnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBpbmRl
eCkpOworICAgICAgICAgICAgbV9ncmFwaC5tX2FyZ3VtZW50UGhpU3RhY2suYXBwZW5kKFBoaVN0
YWNrRW50cnkobV9jdXJyZW50QmxvY2ssIHBoaSwgaW5kZXgpKTsKICAgICAgICAgICAgIG1fY3Vy
cmVudEJsb2NrLT52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQoaW5kZXgpID0gbm9kZUluZGV4Owog
ICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0SGVhZC5zZXRBcmd1bWVudEZp
cnN0VGltZShpbmRleCwgbm9kZUluZGV4KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IG1fbG9jYWxQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhp
LCBpbmRleCkpOworICAgICAgICAgICAgbV9ncmFwaC5tX2xvY2FsUGhpU3RhY2suYXBwZW5kKFBo
aVN0YWNrRW50cnkobV9jdXJyZW50QmxvY2ssIHBoaSwgaW5kZXgpKTsKICAgICAgICAgICAgIG1f
Y3VycmVudEJsb2NrLT52YXJpYWJsZXNBdFRhaWwubG9jYWwoaW5kZXgpID0gbm9kZUluZGV4Owog
ICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0SGVhZC5zZXRMb2NhbEZpcnN0
VGltZShpbmRleCwgbm9kZUluZGV4KTsKICAgICAgICAgfQpAQCAtODExLDIxICs4MDQsNiBAQCBw
cml2YXRlOgogICAgIC8vIFRoZSBpbmRleCBpbiB0aGUgZ2xvYmFsIHJlc29sdmUgaW5mby4KICAg
ICB1bnNpZ25lZCBtX2dsb2JhbFJlc29sdmVOdW1iZXI7CiAKLSAgICBzdHJ1Y3QgUGhpU3RhY2tF
bnRyeSB7Ci0gICAgICAgIFBoaVN0YWNrRW50cnkoQmFzaWNCbG9jayogYmxvY2ssIE5vZGVJbmRl
eCBwaGksIHVuc2lnbmVkIHZhck5vKQotICAgICAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQotICAg
ICAgICAgICAgLCBtX3BoaShwaGkpCi0gICAgICAgICAgICAsIG1fdmFyTm8odmFyTm8pCi0gICAg
ICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Ci0gICAgICAg
IE5vZGVJbmRleCBtX3BoaTsKLSAgICAgICAgdW5zaWduZWQgbV92YXJObzsKLSAgICB9OwotICAg
IFZlY3RvcjxQaGlTdGFja0VudHJ5LCAxNj4gbV9hcmd1bWVudFBoaVN0YWNrOwotICAgIFZlY3Rv
cjxQaGlTdGFja0VudHJ5LCAxNj4gbV9sb2NhbFBoaVN0YWNrOwotICAgIAogICAgIHN0cnVjdCBJ
bmxpbmVTdGFja0VudHJ5IHsKICAgICAgICAgQnl0ZUNvZGVQYXJzZXIqIG1fYnl0ZUNvZGVQYXJz
ZXI7CiAgICAgICAgIApAQCAtOTE0LDYgKzg5Miw5IEBAIHByaXZhdGU6CiAgICAgCiAgICAgLy8g
Q2FjaGUgb2YgY29kZSBibG9ja3MgdGhhdCB3ZSd2ZSBnZW5lcmF0ZWQgYnl0ZWNvZGUgZm9yLgog
ICAgIEJ5dGVDb2RlQ2FjaGU8Y2FuSW5saW5lRnVuY3Rpb25Gb3I+IG1fY29kZUJsb2NrQ2FjaGU7
CisKKyAgICAvLyBTdGFjayB0byB0cmFjayB0aGUgbG9vcHMgZW5jb3VudGVyZWQgaW4gdGhpcyBj
b2RlIGJsb2NrCisgICAgVmVjdG9yPEJsb2NrSW5kZXg+IG1fbG9vcFN0YWNrOwogfTsKIAogI2Rl
ZmluZSBORVhUX09QQ09ERShuYW1lKSBcCkBAIC0xOTIyLDYgKzE5MDMsOCBAQCBib29sIEJ5dGVD
b2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgIGNhc2Ugb3BfbG9vcDogewog
ICAgICAgICAgICAgdW5zaWduZWQgcmVsYXRpdmVPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25b
MV0udS5vcGVyYW5kOwogICAgICAgICAgICAgYWRkVG9HcmFwaChKdW1wLCBPcEluZm8obV9jdXJy
ZW50SW5kZXggKyByZWxhdGl2ZU9mZnNldCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BT
dGFjay5pc0VtcHR5KCkpOworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwog
ICAgICAgICAgICAgTEFTVF9PUENPREUob3BfbG9vcCk7CiAgICAgICAgIH0KIApAQCAtMTk0Myw2
ICsxOTI2LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAg
ICAgICAgICAgdW5zaWduZWQgcmVsYXRpdmVPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0u
dS5vcGVyYW5kOwogICAgICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlvbiA9IGdldChjdXJyZW50
SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNo
LCBPcEluZm8obV9jdXJyZW50SW5kZXggKyByZWxhdGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJl
bnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfbG9vcF9pZl90cnVlKSksIGNvbmRpdGlvbik7Cisg
ICAgICAgICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBt
X2xvb3BTdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09QQ09ERShvcF9sb29w
X2lmX3RydWUpOwogICAgICAgICB9CiAKQEAgLTE5NTAsNiArMTkzNSw4IEBAIGJvb2wgQnl0ZUNv
ZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIHVuc2lnbmVkIHJlbGF0
aXZlT2Zmc2V0ID0gY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKICAgICAgICAgICAg
IE5vZGVJbmRleCBjb25kaXRpb24gPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFu
ZCk7CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZvKG1fY3VycmVudEluZGV4
ICsgT1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2ZhbHNlKSksIE9wSW5mbyhtX2N1cnJlbnRJbmRl
eCArIHJlbGF0aXZlT2Zmc2V0KSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9s
b29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3Qo
KTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfZmFsc2UpOwogICAgICAgICB9
CiAKQEAgLTIwNDcsNiArMjAzNCw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2so
dW5zaWduZWQKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDIgPSBnZXQoY3VycmVudEluc3RydWN0
aW9uWzJdLnUub3BlcmFuZCk7CiAgICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gYWRk
VG9HcmFwaChDb21wYXJlTGVzcywgb3AxLCBvcDIpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChC
cmFuY2gsIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1f
Y3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2xlc3MpKSwgY29uZGl0aW9u
KTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAg
ICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9w
X2xvb3BfaWZfbGVzcyk7CiAgICAgICAgIH0KIApAQCAtMjA1Niw2ICsyMDQ1LDggQEAgYm9vbCBC
eXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgTm9kZUluZGV4
IG9wMiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAg
IE5vZGVJbmRleCBjb25kaXRpb24gPSBhZGRUb0dyYXBoKENvbXBhcmVMZXNzRXEsIG9wMSwgb3Ay
KTsKICAgICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXgg
KyByZWxhdGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgo
b3BfbG9vcF9pZl9sZXNzZXEpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9s
b29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3Qo
KTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfbGVzc2VxKTsKICAgICAgICAg
fQogCkBAIC0yMDY1LDYgKzIwNTYsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2Nr
KHVuc2lnbmVkCiAgICAgICAgICAgICBOb2RlSW5kZXggb3AyID0gZ2V0KGN1cnJlbnRJbnN0cnVj
dGlvblsyXS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlvbiA9IGFk
ZFRvR3JhcGgoQ29tcGFyZUdyZWF0ZXIsIG9wMSwgb3AyKTsKICAgICAgICAgICAgIGFkZFRvR3Jh
cGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyByZWxhdGl2ZU9mZnNldCksIE9wSW5m
byhtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfbG9vcF9pZl9ncmVhdGVyKSksIGNv
bmRpdGlvbik7CisgICAgICAgICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7Cisg
ICAgICAgICAgICBtX2xvb3BTdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09Q
Q09ERShvcF9sb29wX2lmX2dyZWF0ZXIpOwogICAgICAgICB9CiAKQEAgLTIwNzQsNiArMjA2Nyw4
IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAg
IE5vZGVJbmRleCBvcDIgPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZCk7CiAg
ICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gYWRkVG9HcmFwaChDb21wYXJlR3JlYXRl
ckVxLCBvcDEsIG9wMik7CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZvKG1f
Y3VycmVudEluZGV4ICsgcmVsYXRpdmVPZmZzZXQpLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyBP
UENPREVfTEVOR1RIKG9wX2xvb3BfaWZfZ3JlYXRlcmVxKSksIGNvbmRpdGlvbik7CisgICAgICAg
ICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBtX2xvb3BT
dGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09QQ09ERShvcF9sb29wX2lmX2dy
ZWF0ZXJlcSk7CiAgICAgICAgIH0KIApAQCAtMjE2NCw3ICsyMTU5LDE3IEBAIGJvb2wgQnl0ZUNv
ZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ug
b3BfbG9vcF9oaW50OiB7Ci0gICAgICAgICAgICAvLyBCYXNlbGluZS0+REZHIE9TUiBqdW1wcyBi
ZXR3ZWVuIGxvb3AgaGludHMuIFRoZSBERkcgYXNzdW1lcyB0aGF0IEJhc2VsaW5lLT5ERkcKKyAg
ICAgICAgICAgIEFTU0VSVF9VTlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxv
Y2tCZWdpbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEVtaXQgYSBwaGFudG9tIG5v
ZGUgdG8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBwbGFjZWhvbGRlciBub2RlIGZvciB0aGlzIGJ5
dGVjb2RlCisgICAgICAgICAgICAvLyBvcC4KKyAgICAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRv
bSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2xvb3BfaGludCk7
CisgICAgICAgIH0KKworICAgICAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOiB7CisgICAgICAg
ICAgICAvLyBCYXNlbGluZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxvb3AgcHJlaGVhZGVycy4g
VGhlIERGRyBhc3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRwogICAgICAgICAgICAgLy8gT1NSIGNh
biBvbmx5IGhhcHBlbiBhdCBiYXNpYyBibG9jayBib3VuZGFyaWVzLiBBc3NlcnQgdGhhdCB0aGVz
ZSB0d28gc3RhdGVtZW50cwogICAgICAgICAgICAgLy8gYXJlIGNvbXBhdGlibGUuCiAgICAgICAg
ICAgICBBU1NFUlRfVU5VU0VEKGJsb2NrQmVnaW4sIG1fY3VycmVudEluZGV4ID09IGJsb2NrQmVn
aW4pOwpAQCAtMjE3OSw3ICsyMTg0LDEzIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxv
Y2sodW5zaWduZWQKICAgICAgICAgICAgIC8vIG9wLgogICAgICAgICAgICAgYWRkVG9HcmFwaChQ
aGFudG9tKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgTkVYVF9PUENPREUob3BfbG9vcF9o
aW50KTsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggY3VycmVudEJsb2NrID0gbV9ncmFwaC5tX2Js
b2Nrcy5zaXplKCkgLSAxOworICAgICAgICAgICAgQmxvY2tJbmRleCBvdXRlckxvb3AgPSBtX2xv
b3BTdGFjay5pc0VtcHR5KCkgPyBOb0Jsb2NrIDogbV9sb29wU3RhY2subGFzdCgpOworICAgICAg
ICAgICAgbV9sb29wU3RhY2suYXBwZW5kKGN1cnJlbnRCbG9jayk7CisgICAgICAgICAgICBMb29w
UHJlSGVhZGVyIHByZUhlYWRlciA9IHtjdXJyZW50QmxvY2ssIG91dGVyTG9vcH07CisgICAgICAg
ICAgICBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnMuYXBwZW5kKHByZUhlYWRlcik7CisKKyAgICAg
ICAgICAgIE5FWFRfT1BDT0RFKG9wX2xvb3BfcHJlaGVhZGVyKTsKICAgICAgICAgfQogCiAgICAg
ICAgIGRlZmF1bHQ6CkBAIC0yMTkzLDE1MCArMjIwNCw2IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6
OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICB9CiB9CiAKLXRlbXBsYXRlPEJ5dGVDb2RlUGFyc2Vy
OjpQaGlTdGFja1R5cGUgc3RhY2tUeXBlPgotdm9pZCBCeXRlQ29kZVBhcnNlcjo6cHJvY2Vzc1Bo
aVN0YWNrKCkKLXsKLSAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+JiBwaGlTdGFjayA9IChz
dGFja1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykgPyBtX2FyZ3VtZW50UGhpU3RhY2sgOiBtX2xv
Y2FsUGhpU3RhY2s7Ci0KLSAgICB3aGlsZSAoIXBoaVN0YWNrLmlzRW1wdHkoKSkgewotICAgICAg
ICBQaGlTdGFja0VudHJ5IGVudHJ5ID0gcGhpU3RhY2subGFzdCgpOwotICAgICAgICBwaGlTdGFj
ay5yZW1vdmVMYXN0KCk7Ci0gICAgICAgIAotICAgICAgICBQcmVkZWNlc3Nvckxpc3QmIHByZWRl
Y2Vzc29ycyA9IGVudHJ5Lm1fYmxvY2stPm1fcHJlZGVjZXNzb3JzOwotICAgICAgICB1bnNpZ25l
ZCB2YXJObyA9IGVudHJ5Lm1fdmFyTm87Ci0gICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0
YUZvclBoaSA9IG1fZ3JhcGhbZW50cnkubV9waGldLnZhcmlhYmxlQWNjZXNzRGF0YSgpOwotCi0j
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICBwcmludGYo
IiAgIEhhbmRsaW5nIHBoaSBlbnRyeSBmb3IgdmFyICV1LCBwaGkgQCV1LlxuIiwgZW50cnkubV92
YXJObywgZW50cnkubV9waGkpOwotI2VuZGlmCi0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BS
T1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICBwcmludGYoIiAgICAgRGVhbGluZyB3aXRo
IHByZWRlY2Vzc29yIGJsb2NrICV1LlxuIiwgcHJlZGVjZXNzb3JzW2ldKTsKLSNlbmRpZgotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBCYXNpY0Jsb2NrKiBwcmVkZWNlc3NvckJsb2NrID0gbV9n
cmFwaC5tX2Jsb2Nrc1twcmVkZWNlc3NvcnNbaV1dLmdldCgpOwotCi0gICAgICAgICAgICBOb2Rl
SW5kZXgmIHZhciA9IChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykgPyBwcmVkZWNlc3Nv
ckJsb2NrLT52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQodmFyTm8pIDogcHJlZGVjZXNzb3JCbG9j
ay0+dmFyaWFibGVzQXRUYWlsLmxvY2FsKHZhck5vKTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgTm9kZUluZGV4IHZhbHVlSW5QcmVkZWNlc3NvciA9IHZhcjsKLSAgICAgICAgICAgIGlmICh2
YWx1ZUluUHJlZGVjZXNzb3IgPT0gTm9Ob2RlKSB7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9Q
QUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgRGlkIG5vdCBm
aW5kIG5vZGUsIGFkZGluZyBwaGkuXG4iKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgdmFs
dWVJblByZWRlY2Vzc29yID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyhuZXdWYXJpYWJsZUFjY2Vz
c0RhdGEoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVudFRvT3BlcmFuZCh2
YXJObykgOiBzdGF0aWNfY2FzdDxpbnQ+KHZhck5vKSkpKTsKLSAgICAgICAgICAgICAgICB2YXIg
PSB2YWx1ZUluUHJlZGVjZXNzb3I7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YWNrVHlwZSA9PSBB
cmd1bWVudFBoaVN0YWNrKQotICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvckJsb2NrLT52
YXJpYWJsZXNBdEhlYWQuc2V0QXJndW1lbnRGaXJzdFRpbWUodmFyTm8sIHZhbHVlSW5QcmVkZWNl
c3Nvcik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwcmVkZWNl
c3NvckJsb2NrLT52YXJpYWJsZXNBdEhlYWQuc2V0TG9jYWxGaXJzdFRpbWUodmFyTm8sIHZhbHVl
SW5QcmVkZWNlc3Nvcik7Ci0gICAgICAgICAgICAgICAgcGhpU3RhY2suYXBwZW5kKFBoaVN0YWNr
RW50cnkocHJlZGVjZXNzb3JCbG9jaywgdmFsdWVJblByZWRlY2Vzc29yLCB2YXJObykpOwotICAg
ICAgICAgICAgfSBlbHNlIGlmIChtX2dyYXBoW3ZhbHVlSW5QcmVkZWNlc3Nvcl0ub3AgPT0gR2V0
TG9jYWwpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAg
ICAgICAgICAgICAgcHJpbnRmKCIgICAgICBGb3VuZCBHZXRMb2NhbCBAJXUuXG4iLCB2YWx1ZUlu
UHJlZGVjZXNzb3IpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVu
c3VyZSB0aGF0IHRoZSBWYXJpYWJsZUFjY2Vzc0RhdGFzIGFyZSBpZGVudGljYWwgYmV0d2VlbiB0
aGUKLSAgICAgICAgICAgICAgICAvLyBHZXRMb2NhbCBhbmQgaXRzIGJsb2NrLWxvY2FsIFBoaS4g
U3RyaWN0bHkgc3BlYWtpbmcgd2Ugb25seSBuZWVkIHRoZSB0d28KLSAgICAgICAgICAgICAgICAv
LyB0byBiZSB1bmlmaWVkLiBCdXQgZm9yIGVmZmljaWVuY3ksIHdlIHdhbnQgdGhlIGNvZGUgdGhh
dCBjcmVhdGVzIEdldExvY2FscwotICAgICAgICAgICAgICAgIC8vIGFuZCBQaGlzIHRvIHRyeSB0
byByZXVzZSBWYXJpYWJsZUFjY2Vzc0RhdGFzIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gICAgICAg
ICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS52YXJpYWJsZUFjY2Vz
c0RhdGEoKSA9PSBtX2dyYXBoW21fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5jaGlsZDEoKV0u
dmFyaWFibGVBY2Nlc3NEYXRhKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
IHZhbHVlSW5QcmVkZWNlc3NvciA9IG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5jaGlsZDEo
KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElP
Tl9WRVJCT1NFKQotICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgRm91bmQgQCV1LlxuIiwg
dmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAg
QVNTRVJUKG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5vcCA9PSBTZXRMb2NhbCB8fCBtX2dy
YXBoW3ZhbHVlSW5QcmVkZWNlc3Nvcl0ub3AgPT0gUGhpIHx8IG1fZ3JhcGhbdmFsdWVJblByZWRl
Y2Vzc29yXS5vcCA9PSBGbHVzaCB8fCAobV9ncmFwaFt2YWx1ZUluUHJlZGVjZXNzb3JdLm9wID09
IFNldEFyZ3VtZW50ICYmIHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrKSk7Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclByZWRlY2Vzc29y
ID0gbV9ncmFwaFt2YWx1ZUluUHJlZGVjZXNzb3JdLnZhcmlhYmxlQWNjZXNzRGF0YSgpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBkYXRhRm9yUHJlZGVjZXNzb3ItPnVuaWZ5KGRhdGFGb3JQ
aGkpOwotCi0gICAgICAgICAgICBOb2RlKiBwaGlOb2RlID0gJm1fZ3JhcGhbZW50cnkubV9waGld
OwotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAg
IHByaW50ZigiICAgICAgUmVmIGNvdW50IG9mIEAldSA9ICV1LlxuIiwgZW50cnkubV9waGksIHBo
aU5vZGUtPnJlZkNvdW50KCkpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAocGhpTm9kZS0+cmVm
Q291bnQoKSkgewotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAg
ICAgICAgICAgICAgICBwcmludGYoIiAgICAgIFJlZmZpbmcgQCV1LlxuIiwgdmFsdWVJblByZWRl
Y2Vzc29yKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIG1fZ3JhcGgucmVmKHZhbHVlSW5QcmVk
ZWNlc3Nvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwaGlOb2RlLT5jaGls
ZDEoKSA9PSBOb05vZGUpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJP
U0UpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBTZXR0aW5nIEAldS0+Y2hpbGQxID0g
QCV1LlxuIiwgZW50cnkubV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0jZW5kaWYKLSAgICAg
ICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSB2YWx1ZUluUHJlZGVj
ZXNzb3I7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAg
ICAgICAgICAgIHByaW50ZigiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5tX3BoaSk7
Ci0gICAgICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7Ci0gICAgICAg
ICAgICAgICAgcHJpbnRmKCIuXG4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBoaU5vZGUtPmNoaWxkMigpID09IE5v
Tm9kZSkgewotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAg
ICAgICAgICAgICBwcmludGYoIiAgICAgIFNldHRpbmcgQCV1LT5jaGlsZDIgPSBAJXUuXG4iLCBl
bnRyeS5tX3BoaSwgdmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRpZgotICAgICAgICAgICAgICAg
IHBoaU5vZGUtPmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IHZhbHVlSW5QcmVkZWNlc3NvcjsKLSNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICAgICAg
cHJpbnRmKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKLSAgICAgICAg
ICAgICAgICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4oc3Rkb3V0KTsKLSAgICAgICAgICAgICAgICBw
cmludGYoIi5cbiIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBpZiAocGhpTm9kZS0+Y2hpbGQzKCkgPT0gTm9Ob2RlKSB7Ci0j
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgICAg
IHByaW50ZigiICAgICAgU2V0dGluZyBAJXUtPmNoaWxkMyA9IEAldS5cbiIsIGVudHJ5Lm1fcGhp
LCB2YWx1ZUluUHJlZGVjZXNzb3IpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgcGhpTm9kZS0+
Y2hpbGRyZW4uZml4ZWQuY2hpbGQzID0gdmFsdWVJblByZWRlY2Vzc29yOwotI2lmIERGR19FTkFC
TEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAgICAgICBwcmludGYoIiAg
ICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkpOwotICAgICAgICAgICAgICAgIHBo
aU5vZGUtPmR1bXBDaGlsZHJlbihzdGRvdXQpOwotICAgICAgICAgICAgICAgIHByaW50ZigiLlxu
Iik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRvR3JhcGgoUGhp
LCBPcEluZm8oZGF0YUZvclBoaSkpOwotICAgICAgICAgICAgCi0jaWYgREZHX0VOQUJMRShERUJV
R19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgcHJpbnRmKCIgICAgICBTcGxpdHRp
bmcgQCV1LCBjcmVhdGVkIEAldS5cbiIsIGVudHJ5Lm1fcGhpLCBuZXdQaGkpOwotI2VuZGlmCi0K
LSAgICAgICAgICAgIHBoaU5vZGUgPSAmbV9ncmFwaFtlbnRyeS5tX3BoaV07IC8vIHJlbG9hZCBh
ZnRlciB2ZWN0b3IgcmVzaXplCi0gICAgICAgICAgICBOb2RlJiBuZXdQaGlOb2RlID0gbV9ncmFw
aFtuZXdQaGldOwotICAgICAgICAgICAgaWYgKHBoaU5vZGUtPnJlZkNvdW50KCkpCi0gICAgICAg
ICAgICAgICAgbV9ncmFwaC5yZWYobmV3UGhpKTsKLQotICAgICAgICAgICAgbmV3UGhpTm9kZS5j
aGlsZHJlbi5maXhlZC5jaGlsZDEgPSBwaGlOb2RlLT5jaGlsZDEoKTsKLSAgICAgICAgICAgIG5l
d1BoaU5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyID0gcGhpTm9kZS0+Y2hpbGQyKCk7Ci0gICAg
ICAgICAgICBuZXdQaGlOb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IHBoaU5vZGUtPmNoaWxk
MygpOwotCi0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAg
ICAgICAgcHJpbnRmKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIG5ld1BoaSk7Ci0gICAgICAg
ICAgICBuZXdQaGlOb2RlLmR1bXBDaGlsZHJlbihzdGRvdXQpOwotICAgICAgICAgICAgcHJpbnRm
KCIuXG4iKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5j
aGlsZDEgPSBuZXdQaGk7Ci0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGls
ZDIgPSB2YWx1ZUluUHJlZGVjZXNzb3I7Ci0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5m
aXhlZC5jaGlsZDMgPSBOb05vZGU7Ci0KLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9O
X1ZFUkJPU0UpCi0gICAgICAgICAgICBwcmludGYoIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwg
ZW50cnkubV9waGkpOwotICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7
Ci0gICAgICAgICAgICBwcmludGYoIi5cbiIpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci19
Ci0KIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OmxpbmtCbG9jayhCYXNpY0Jsb2NrKiBibG9jaywgVmVj
dG9yPEJsb2NrSW5kZXg+JiBwb3NzaWJsZVRhcmdldHMpCiB7CiAgICAgQVNTRVJUKGJsb2NrLT5l
bmQgIT0gTm9Ob2RlKTsKQEAgLTI2MDEsMTUgKzI0NjgsMTcgQEAgYm9vbCBCeXRlQ29kZVBhcnNl
cjo6cGFyc2UoKQogICAgIAogICAgIG1fY3VycmVudFByb2ZpbGluZ0luZGV4ID0gbV9jdXJyZW50
SW5kZXg7CiAgICAgCi0gICAgcHJvY2Vzc1BoaVN0YWNrPExvY2FsUGhpU3RhY2s+KCk7CisgICAg
Ly8gTGluayBHZXRMb2NhbCAmIFNldExvY2FsIG5vZGVzLCB0byBlbnN1cmUgbGl2ZSB2YWx1ZXMg
YXJlIGdlbmVyYXRlZC4KKyAgICBtX2dyYXBoLnByb2Nlc3NQaGlTdGFjayhMb2NhbFBoaVN0YWNr
KTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgcHJpbnRm
KCJQcm9jZXNzaW5nIGFyZ3VtZW50IHBoaXMuXG4iKTsKICNlbmRpZgotICAgIHByb2Nlc3NQaGlT
dGFjazxBcmd1bWVudFBoaVN0YWNrPigpOworICAgIG1fZ3JhcGgucHJvY2Vzc1BoaVN0YWNrKEFy
Z3VtZW50UGhpU3RhY2spOwogICAgIAogICAgIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzID0gbV9w
cmVzZXJ2ZWRWYXJzOwogICAgIG1fZ3JhcGgubV9sb2NhbFZhcnMgPSBtX251bUxvY2FsczsKICAg
ICBtX2dyYXBoLm1fcGFyYW1ldGVyU2xvdHMgPSBtX3BhcmFtZXRlclNsb3RzOworICAgIG1fZ3Jh
cGgubV9vcmlnaW5hbFNpemUgPSBtX2dyYXBoLnNpemUoKTsKIAogICAgIHJldHVybiB0cnVlOwog
fQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCShy
ZXZpc2lvbiAxMDY2MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxp
dGllcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzAsNiArMTMwLDcgQEAgaW5saW5lIGJvb2wgY2Fu
Q29tcGlsZU9wY29kZShPcGNvZGVJRCBvcAogICAgIGNhc2Ugb3Bfam5ncmVhdGVyOgogICAgIGNh
c2Ugb3Bfam5ncmVhdGVyZXE6CiAgICAgY2FzZSBvcF9sb29wX2hpbnQ6CisgICAgY2FzZSBvcF9s
b29wX3ByZWhlYWRlcjoKICAgICBjYXNlIG9wX2xvb3BfaWZfbGVzczoKICAgICBjYXNlIG9wX2xv
b3BfaWZfbGVzc2VxOgogICAgIGNhc2Ugb3BfbG9vcF9pZl9ncmVhdGVyOgpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHJldmlzaW9uIDEwNjYyOSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjQs
NyArMTI0LDcgQEAgdm9pZCBHcmFwaDo6ZHVtcChOb2RlSW5kZXggbm9kZUluZGV4LCBDbwogCiAg
ICAgdW5zaWduZWQgcmVmQ291bnQgPSBub2RlLnJlZkNvdW50KCk7CiAgICAgYm9vbCBza2lwcGVk
ID0gIXJlZkNvdW50OwotICAgIGJvb2wgbXVzdEdlbmVyYXRlID0gbm9kZS5tdXN0R2VuZXJhdGUo
KTsKKyAgICBib29sIG11c3RHZW5lcmF0ZSA9IHJlZkNvdW50ICYmIG5vZGUubXVzdEdlbmVyYXRl
KCk7CiAgICAgaWYgKG11c3RHZW5lcmF0ZSkgewogICAgICAgICBBU1NFUlQocmVmQ291bnQpOwog
ICAgICAgICAtLXJlZkNvdW50OwpAQCAtMjkyLDcgKzI5Miw3IEBAIHZvaWQgR3JhcGg6OmR1bXAo
Q29kZUJsb2NrKiBjb2RlQmxvY2spCiAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICB9CiAgICAg
cHJpbnRmKCJQaGkgTm9kZXM6XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFz
dCgpLT5lbmQ7IGkgPCBzaXplKCk7ICsraSkKKyAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3Mu
bGFzdCgpLT5lbmQ7IGkgPCBtX29yaWdpbmFsU2l6ZTsgKytpKQogICAgICAgICBkdW1wKGksIGNv
ZGVCbG9jayk7CiB9CiAKQEAgLTM1NCw2ICszNTQsMTYxIEBAIHZvaWQgR3JhcGg6OnByZWRpY3RB
cmd1bWVudFR5cGVzKENvZGVCbG8KICAgICB9CiB9CiAKK3ZvaWQgR3JhcGg6OnByb2Nlc3NQaGlT
dGFjayhQaGlTdGFja1R5cGUgc3RhY2tUeXBlLCBCbG9ja0luZGV4IGRlZmluaXRpb25CbG9jaykK
K3sKKyAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+JiBwaGlTdGFjayA9IChzdGFja1R5cGUg
PT0gQXJndW1lbnRQaGlTdGFjaykgPyBtX2FyZ3VtZW50UGhpU3RhY2sgOiBtX2xvY2FsUGhpU3Rh
Y2s7CisKKyAgICB3aGlsZSAoIXBoaVN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICBQaGlTdGFj
a0VudHJ5IGVudHJ5ID0gcGhpU3RhY2subGFzdCgpOworICAgICAgICBwaGlTdGFjay5yZW1vdmVM
YXN0KCk7CisgICAgICAgIAorICAgICAgICBQcmVkZWNlc3Nvckxpc3QmIHByZWRlY2Vzc29ycyA9
IGVudHJ5Lm1fYmxvY2stPm1fcHJlZGVjZXNzb3JzOworICAgICAgICB1bnNpZ25lZCB2YXJObyA9
IGVudHJ5Lm1fdmFyTm87CisgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclBoaSA9
IGF0KGVudHJ5Lm1fcGhpKS52YXJpYWJsZUFjY2Vzc0RhdGEoKTsKKworI2lmIERGR19FTkFCTEUo
REVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCIgICBIYW5kbGluZyBw
aGkgZW50cnkgZm9yIHZhciAldSwgcGhpIEAldS5cbiIsIGVudHJ5Lm1fdmFyTm8sIGVudHJ5Lm1f
cGhpKTsKKyNlbmRpZgorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZGVjZXNz
b3JzLnNpemUoKTsgKytpKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJC
T1NFKQorICAgICAgICAgICAgcHJpbnRmKCIgICAgIERlYWxpbmcgd2l0aCBwcmVkZWNlc3NvciBi
bG9jayAldS5cbiIsIHByZWRlY2Vzc29yc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgQmFzaWNCbG9jayogcHJlZGVjZXNzb3JCbG9jayA9IG1fYmxvY2tzW3ByZWRlY2Vz
c29yc1tpXV0uZ2V0KCk7CisKKyAgICAgICAgICAgIE5vZGVJbmRleCYgdmFyID0gKHN0YWNrVHlw
ZSA9PSBBcmd1bWVudFBoaVN0YWNrKSA/IHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0VGFp
bC5hcmd1bWVudCh2YXJObykgOiBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdFRhaWwubG9j
YWwodmFyTm8pOworICAgICAgICAgICAgCisgICAgICAgICAgICBOb2RlSW5kZXggdmFsdWVJblBy
ZWRlY2Vzc29yID0gdmFyOworICAgICAgICAgICAgLy8gV2Ugb25seSB0YWtlIHRoZSBkZWZpbml0
aW9ucyBpbiB0aGUgc3BlY2lmaWVkIGRlZmluaXRpb24gYmxvY2suCisgICAgICAgICAgICBpZiAo
ZGVmaW5pdGlvbkJsb2NrICE9IE5vQmxvY2sgJiYgZGVmaW5pdGlvbkJsb2NrICE9IHByZWRlY2Vz
c29yc1tpXQorICAgICAgICAgICAgICAgICYmIHZhciAhPSBOb05vZGUgJiYgYXQodmFyKS5vcCA9
PSBTZXRMb2NhbCkKKyAgICAgICAgICAgICAgICB2YWx1ZUluUHJlZGVjZXNzb3IgPSBOb05vZGU7
CisKKyAgICAgICAgICAgIGlmICh2YWx1ZUluUHJlZGVjZXNzb3IgPT0gTm9Ob2RlKSB7CisjaWYg
REZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHBy
aW50ZigiICAgICAgRGlkIG5vdCBmaW5kIG5vZGUsIGFkZGluZyBwaGkuXG4iKTsKKyNlbmRpZgor
CisgICAgICAgICAgICAgICAgaW50IG9wZXJhbmQgPSAoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhp
U3RhY2sgPyBhcmd1bWVudFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNfY2FzdDxpbnQ+KHZhck5v
KSk7CisgICAgICAgICAgICAgICAgbV92YXJpYWJsZUFjY2Vzc0RhdGEuYXBwZW5kKFZhcmlhYmxl
QWNjZXNzRGF0YShzdGF0aWNfY2FzdDxWaXJ0dWFsUmVnaXN0ZXI+KG9wZXJhbmQpKSk7CisgICAg
ICAgICAgICAgICAgdmFsdWVJblByZWRlY2Vzc29yID0gKE5vZGVJbmRleClzaXplKCk7CisgICAg
ICAgICAgICAgICAgYXBwZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbygmbV92YXJp
YWJsZUFjY2Vzc0RhdGEubGFzdCgpKSkpOworICAgICAgICAgICAgICAgIGlmICh2YXIgPT0gTm9O
b2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlT
dGFjaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxl
c0F0SGVhZC5zZXRBcmd1bWVudEZpcnN0VGltZSh2YXJObywgdmFsdWVJblByZWRlY2Vzc29yKTsK
KyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVj
ZXNzb3JCbG9jay0+dmFyaWFibGVzQXRIZWFkLnNldExvY2FsRmlyc3RUaW1lKHZhck5vLCB2YWx1
ZUluUHJlZGVjZXNzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIg
PSB2YWx1ZUluUHJlZGVjZXNzb3I7CisgICAgICAgICAgICAgICAgcGhpU3RhY2suYXBwZW5kKFBo
aVN0YWNrRW50cnkocHJlZGVjZXNzb3JCbG9jaywgdmFsdWVJblByZWRlY2Vzc29yLCB2YXJObykp
OworICAgICAgICAgICAgfSBlbHNlIGlmIChhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLm9wID09IEdl
dExvY2FsKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAg
ICAgICAgICAgICAgIHByaW50ZigiICAgICAgRm91bmQgR2V0TG9jYWwgQCV1LlxuIiwgdmFsdWVJ
blByZWRlY2Vzc29yKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBl
bnN1cmUgdGhhdCB0aGUgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcmUgaWRlbnRpY2FsIGJldHdlZW4g
dGhlCisgICAgICAgICAgICAgICAgLy8gR2V0TG9jYWwgYW5kIGl0cyBibG9jay1sb2NhbCBQaGku
IFN0cmljdGx5IHNwZWFraW5nIHdlIG9ubHkgbmVlZCB0aGUgdHdvCisgICAgICAgICAgICAgICAg
Ly8gdG8gYmUgdW5pZmllZC4gQnV0IGZvciBlZmZpY2llbmN5LCB3ZSB3YW50IHRoZSBjb2RlIHRo
YXQgY3JlYXRlcyBHZXRMb2NhbHMKKyAgICAgICAgICAgICAgICAvLyBhbmQgUGhpcyB0byB0cnkg
dG8gcmV1c2UgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAg
ICAgICAgICAgIEFTU0VSVChhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLnZhcmlhYmxlQWNjZXNzRGF0
YSgpID09IGF0KGF0KHZhbHVlSW5QcmVkZWNlc3NvcikuY2hpbGQxKCkpLnZhcmlhYmxlQWNjZXNz
RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YWx1ZUluUHJlZGVj
ZXNzb3IgPSBhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLmNoaWxkMSgpOworICAgICAgICAgICAgfSBl
bHNlIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAg
ICAgICAgICAgcHJpbnRmKCIgICAgICBGb3VuZCBAJXUuXG4iLCB2YWx1ZUluUHJlZGVjZXNzb3Ip
OworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlQoYXQodmFsdWVJblBy
ZWRlY2Vzc29yKS5vcCA9PSBTZXRMb2NhbCB8fCBhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLm9wID09
IFBoaSB8fCBhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLm9wID09IEZsdXNoIHx8IChhdCh2YWx1ZUlu
UHJlZGVjZXNzb3IpLm9wID09IFNldEFyZ3VtZW50ICYmIHN0YWNrVHlwZSA9PSBBcmd1bWVudFBo
aVN0YWNrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSog
ZGF0YUZvclByZWRlY2Vzc29yID0gYXQodmFsdWVJblByZWRlY2Vzc29yKS52YXJpYWJsZUFjY2Vz
c0RhdGEoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGF0YUZvclByZWRlY2Vzc29yLT51
bmlmeShkYXRhRm9yUGhpKTsKKworICAgICAgICAgICAgTm9kZSogcGhpTm9kZSA9ICZhdChlbnRy
eS5tX3BoaSk7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAg
ICAgICAgICAgcHJpbnRmKCIgICAgICBSZWYgY291bnQgb2YgQCV1ID0gJXUuXG4iLCBlbnRyeS5t
X3BoaSwgcGhpTm9kZS0+cmVmQ291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChwaGlO
b2RlLT5yZWZDb3VudCgpKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJC
T1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgUmVmZmluZyBAJXUuXG4iLCB2YWx1
ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmVmKHZhbHVlSW5QcmVk
ZWNlc3Nvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwaGlOb2RlLT5jaGls
ZDEoKSA9PSBOb05vZGUpIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJP
U0UpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBTZXR0aW5nIEAldS0+Y2hpbGQxID0g
QCV1LlxuIiwgZW50cnkubV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7CisjZW5kaWYKKyAgICAg
ICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSB2YWx1ZUluUHJlZGVj
ZXNzb3I7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAg
ICAgICAgICAgIHByaW50ZigiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5tX3BoaSk7
CisgICAgICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7CisgICAgICAg
ICAgICAgICAgcHJpbnRmKCIuXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBoaU5vZGUtPmNoaWxkMigpID09IE5v
Tm9kZSkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAg
ICAgICAgICAgICBwcmludGYoIiAgICAgIFNldHRpbmcgQCV1LT5jaGlsZDIgPSBAJXUuXG4iLCBl
bnRyeS5tX3BoaSwgdmFsdWVJblByZWRlY2Vzc29yKTsKKyNlbmRpZgorICAgICAgICAgICAgICAg
IHBoaU5vZGUtPmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IHZhbHVlSW5QcmVkZWNlc3NvcjsKKyNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAg
cHJpbnRmKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKKyAgICAgICAg
ICAgICAgICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4oc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICBw
cmludGYoIi5cbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBpZiAocGhpTm9kZS0+Y2hpbGQzKCkgPT0gTm9Ob2RlKSB7Cisj
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAg
IHByaW50ZigiICAgICAgU2V0dGluZyBAJXUtPmNoaWxkMyA9IEAldS5cbiIsIGVudHJ5Lm1fcGhp
LCB2YWx1ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcGhpTm9kZS0+
Y2hpbGRyZW4uZml4ZWQuY2hpbGQzID0gdmFsdWVJblByZWRlY2Vzc29yOworI2lmIERGR19FTkFC
TEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiAg
ICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkpOworICAgICAgICAgICAgICAgIHBo
aU5vZGUtPmR1bXBDaGlsZHJlbihzdGRvdXQpOworICAgICAgICAgICAgICAgIHByaW50ZigiLlxu
Iik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IChOb2RlSW5kZXgpc2l6
ZSgpOworICAgICAgICAgICAgYXBwZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbyhk
YXRhRm9yUGhpKSkpOworICAgICAgICAgICAgLy8gTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRvR3Jh
cGgoUGhpLCBPcEluZm8oZGF0YUZvclBoaSkpOworICAgICAgICAgICAgCisjaWYgREZHX0VOQUJM
RShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRmKCIgICAgICBT
cGxpdHRpbmcgQCV1LCBjcmVhdGVkIEAldS5cbiIsIGVudHJ5Lm1fcGhpLCBuZXdQaGkpOworI2Vu
ZGlmCisKKyAgICAgICAgICAgIHBoaU5vZGUgPSAmYXQoZW50cnkubV9waGkpOyAvLyByZWxvYWQg
YWZ0ZXIgdmVjdG9yIHJlc2l6ZQorICAgICAgICAgICAgTm9kZSYgbmV3UGhpTm9kZSA9IGF0KG5l
d1BoaSk7CisgICAgICAgICAgICBpZiAocGhpTm9kZS0+cmVmQ291bnQoKSkKKyAgICAgICAgICAg
ICAgICByZWYobmV3UGhpKTsKKworICAgICAgICAgICAgbmV3UGhpTm9kZS5jaGlsZHJlbi5maXhl
ZC5jaGlsZDEgPSBwaGlOb2RlLT5jaGlsZDEoKTsKKyAgICAgICAgICAgIG5ld1BoaU5vZGUuY2hp
bGRyZW4uZml4ZWQuY2hpbGQyID0gcGhpTm9kZS0+Y2hpbGQyKCk7CisgICAgICAgICAgICBuZXdQ
aGlOb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IHBoaU5vZGUtPmNoaWxkMygpOworCisjaWYg
REZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRm
KCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIG5ld1BoaSk7CisgICAgICAgICAgICBuZXdQaGlO
b2RlLmR1bXBDaGlsZHJlbihzdGRvdXQpOworICAgICAgICAgICAgcHJpbnRmKCIuXG4iKTsKKyNl
bmRpZgorCisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSBuZXdQ
aGk7CisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDIgPSB2YWx1ZUlu
UHJlZGVjZXNzb3I7CisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDMg
PSBOb05vZGU7CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisg
ICAgICAgICAgICBwcmludGYoIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkp
OworICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7CisgICAgICAgICAg
ICBwcmludGYoIi5cbiIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpERkcKIAogI2VuZGlmCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdHcmFwaC5oCShyZXZpc2lvbiAxMDY2MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDYgKzYzLDI5IEBAIHN0cnVjdCBSZXNv
bHZlR2xvYmFsRGF0YSB7CiAgICAgdW5zaWduZWQgcmVzb2x2ZUluZm9JbmRleDsKIH07CiAKK3N0
cnVjdCBMb29wUHJlSGVhZGVyIHsKKyAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXg7CisgICAgQmxv
Y2tJbmRleCBvdXRlckxvb3A7Cit9OworCitlbnVtIFBoaVN0YWNrVHlwZSB7CisgICAgTG9jYWxQ
aGlTdGFjaywKKyAgICBBcmd1bWVudFBoaVN0YWNrCit9OworCitzdHJ1Y3QgUGhpU3RhY2tFbnRy
eSB7CisgICAgUGhpU3RhY2tFbnRyeShCYXNpY0Jsb2NrKiBibG9jaywgTm9kZUluZGV4IHBoaSwg
dW5zaWduZWQgdmFyTm8pCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICAgICAgLCBtX3Bo
aShwaGkpCisgICAgICAgICwgbV92YXJObyh2YXJObykKKyAgICB7CisgICAgfQorCisgICAgQmFz
aWNCbG9jayogbV9ibG9jazsKKyAgICBOb2RlSW5kZXggbV9waGk7CisgICAgdW5zaWduZWQgbV92
YXJObzsKK307CisKIC8vIAogLy8gPT09IEdyYXBoID09PQogLy8KQEAgLTI1NCw3ICsyNzcsMTAg
QEAgcHVibGljOgogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICB2b2lkIHByb2Nlc3NQ
aGlTdGFjayhQaGlTdGFja1R5cGUsIEJsb2NrSW5kZXggZGVmaW5pdGlvbkJsb2NrID0gTm9CbG9j
ayk7CisKICAgICBWZWN0b3I8IE93blB0cjxCYXNpY0Jsb2NrPiAsIDg+IG1fYmxvY2tzOworICAg
IFZlY3RvcjxMb29wUHJlSGVhZGVyLCA4PiBtX2xvb3BQcmVIZWFkZXJzOwogICAgIFZlY3RvcjxO
b2RlSW5kZXgsIDE2PiBtX3ZhckFyZ0NoaWxkcmVuOwogICAgIFZlY3RvcjxTdG9yYWdlQWNjZXNz
RGF0YT4gbV9zdG9yYWdlQWNjZXNzRGF0YTsKICAgICBWZWN0b3I8UmVzb2x2ZUdsb2JhbERhdGE+
IG1fcmVzb2x2ZUdsb2JhbERhdGE7CkBAIC0yNjIsOSArMjg4LDEyIEBAIHB1YmxpYzoKICAgICBT
ZWdtZW50ZWRWZWN0b3I8VmFyaWFibGVBY2Nlc3NEYXRhLCAxNj4gbV92YXJpYWJsZUFjY2Vzc0Rh
dGE7CiAgICAgU2VnbWVudGVkVmVjdG9yPFN0cnVjdHVyZVNldCwgMTY+IG1fc3RydWN0dXJlU2V0
OwogICAgIFNlZ21lbnRlZFZlY3RvcjxTdHJ1Y3R1cmVUcmFuc2l0aW9uRGF0YSwgOD4gbV9zdHJ1
Y3R1cmVUcmFuc2l0aW9uRGF0YTsKKyAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+IG1fYXJn
dW1lbnRQaGlTdGFjazsKKyAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+IG1fbG9jYWxQaGlT
dGFjazsKICAgICBCaXRWZWN0b3IgbV9wcmVzZXJ2ZWRWYXJzOwogICAgIHVuc2lnbmVkIG1fbG9j
YWxWYXJzOwogICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyU2xvdHM7CisgICAgdW5zaWduZWQgbV9v
cmlnaW5hbFNpemU7IC8vIFRoZSBncmFwaCBzaXplIGJlZm9yZSB3ZSBkbyBvcHRpbWl6YXRpb25z
IHdoaWNoIHdpbGwgZXhwYW5kIHRoZSBncmFwaC4KIHByaXZhdGU6CiAgICAgCiAgICAgYm9vbCBh
ZGRJbW1lZGlhdGVTaG91bGRTcGVjdWxhdGVJbnRlZ2VyKENvZGVCbG9jayogY29kZUJsb2NrLCBO
b2RlJiBhZGQsIE5vZGUmIHZhcmlhYmxlLCBOb2RlJiBpbW1lZGlhdGUpCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiAxMDY2MjkpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTMyMSwxNCArMzIxLDE0IEBAIHB1YmxpYzoKICAgICAgICAgLy8gdmFsdWUgb2YgKE5v
bmUsIFtdKS4gQnV0IHRoZSBvbGQgSklUIG1heSBzdGFzaCBzb21lIHZhbHVlcyB0aGVyZS4gU28g
d2UgcmVhbGx5CiAgICAgICAgIC8vIG5lZWQgKFRvcCwgVE9QKS4KICAgICAgICAgZm9yIChzaXpl
X3QgYXJndW1lbnQgPSAwOyBhcmd1bWVudCA8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLm51
bWJlck9mQXJndW1lbnRzKCk7ICsrYXJndW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChiYXNpY0Js
b2NrLnZhcmlhYmxlc0F0SGVhZC5hcmd1bWVudChhcmd1bWVudCkgPT0gTm9Ob2RlKQorICAgICAg
ICAgICAgaWYgKCFiYXNpY0Jsb2NrLmNmYUhhc1Zpc2l0ZWQgfHwgYmFzaWNCbG9jay52YXJpYWJs
ZXNBdEhlYWQuYXJndW1lbnQoYXJndW1lbnQpID09IE5vTm9kZSkKICAgICAgICAgICAgICAgICBl
bnRyeS0+bV9leHBlY3RlZFZhbHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgpOwogICAg
ICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNpY0Jsb2Nr
LnZhcmlhYmxlc0F0SGVhZC5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CiAgICAgICAgICAg
ICBOb2RlSW5kZXggbm9kZUluZGV4ID0gYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwo
bG9jYWwpOwotICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSBOb05vZGUpCisgICAgICAgICAg
ICBpZiAoIWJhc2ljQmxvY2suY2ZhSGFzVmlzaXRlZCB8fCBub2RlSW5kZXggPT0gTm9Ob2RlKQog
ICAgICAgICAgICAgICAgIGVudHJ5LT5tX2V4cGVjdGVkVmFsdWVzLmxvY2FsKGxvY2FsKS5tYWtl
VG9wKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChtX2dyYXBoW25vZGVJbmRleF0udmFyaWFibGVB
Y2Nlc3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKQorICAgICAgICAgICAgaWYgKG5v
ZGVJbmRleCAhPSBOb05vZGUgJiYgbV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNjZXNzRGF0
YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkKICAgICAgICAgICAgICAgICBlbnRyeS0+bV9s
b2NhbHNGb3JjZWREb3VibGUuc2V0KGxvY2FsKTsKICAgICAgICAgfQogI2Vsc2UKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCShyZXZpc2lvbiAxMDY2MjkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDk3LDYgKzQ5
NywxMiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIHJldHVybiB2YXJpYWJsZUFjY2Vzc0RhdGEo
KS0+bG9jYWwoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldFZhcmlhYmxlQWNjZXNzRGF0YSh2b2lk
KiBkYXRhKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGhhc1ZhcmlhYmxlQWNjZXNzRGF0YSgpKTsK
KyAgICAgICAgbV9vcEluZm8gPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGF0YSk7Cisg
ICAgfQorCiAgICAgYm9vbCBoYXNJZGVudGlmaWVyKCkKICAgICB7CiAgICAgICAgIHN3aXRjaCAo
b3ApIHsKQEAgLTEwMzEsNyArMTAzNyw3IEBAIHN0cnVjdCBOb2RlIHsKICAgICB7CiAgICAgICAg
IHJldHVybiBub2RlQ2FuU3BlY3VsYXRlSW50ZWdlcihhcml0aE5vZGVGbGFncygpKTsKICAgICB9
Ci0gICAgCisKICAgICB2b2lkIGR1bXBDaGlsZHJlbihGSUxFKiBvdXQpCiAgICAgewogICAgICAg
ICBpZiAoY2hpbGQxKCkgPT0gTm9Ob2RlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdQcm9wYWdhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCShyZXZpc2lvbiAxMDY2MjkpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3
NSwxMyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7CiAjZW5k
aWYKIAorICAgICAgICBsb29wSW52YXJpYW50Q29kZU1vdGlvbigpOworCisjaWYgREZHX0VOQUJM
RShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIkdyYXBoIGFmdGVy
IGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uOlxuIik7CisgICAgICAgIG1fZ3JhcGguZHVtcCht
X2NvZGVCbG9jayk7CisjZW5kaWYKKwogICAgICAgICBhbGxvY2F0ZVZpcnR1YWxSZWdpc3RlcnMo
KTsKIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKQEAgLTI4OSw3
ICsyOTYsNyBAQCBwcml2YXRlOgogICAgIAogICAgIHZvaWQgcHJvcGFnYXRlTm9kZVByZWRpY3Rp
b25zKE5vZGUmIG5vZGUpCiAgICAgewotICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUo
KSkKKyAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkgJiYgbm9kZS5vcCAhPSBTZXRM
b2NhbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAgICAgIE5vZGVUeXBlIG9w
ID0gbm9kZS5vcDsKQEAgLTExMjMsNiArMTEzMCwxMyBAQCBwcml2YXRlOgogICAgICAgICByZXR1
cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCk7
CiAgICAgfQogICAgIAorICAgIGJvb2wgY29tcGFyZUVxSXNQdXJlKE5vZGUmIG5vZGUpCisgICAg
eworICAgICAgICByZXR1cm4gaXNQcmVkaWN0ZWROdW1lcmljYWwobm9kZSkKKyAgICAgICAgICAg
IHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KG1fZ3JhcGhbbm9kZS5jaGlsZDEo
KV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0pCisgICAgICAgICAgICB8fCBOb2RlOjpzaG91bGRT
cGVjdWxhdGVBcnJheShtX2dyYXBoW25vZGUuY2hpbGQxKCldLCBtX2dyYXBoW25vZGUuY2hpbGQy
KCldKTsKKyAgICB9CisKICAgICBib29sIGxvZ2ljYWxOb3RJc1B1cmUoTm9kZSYgbm9kZSkKICAg
ICB7CiAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1fZ3JhcGhbbm9kZS5jaGls
ZDEoKV0ucHJlZGljdGlvbigpOwpAQCAtMTE1MCw4ICsxMTY0LDkgQEAgcHJpdmF0ZToKICAgICAg
ICAgY2FzZSBDb21wYXJlTGVzc0VxOgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgogICAg
ICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6Ci0gICAgICAgIGNhc2UgQ29tcGFyZUVxOgogICAg
ICAgICAgICAgcmV0dXJuICFpc1ByZWRpY3RlZE51bWVyaWNhbChub2RlKTsKKyAgICAgICAgY2Fz
ZSBDb21wYXJlRXE6CisgICAgICAgICAgICByZXR1cm4gIWNvbXBhcmVFcUlzUHVyZShub2RlKTsK
ICAgICAgICAgY2FzZSBMb2dpY2FsTm90OgogICAgICAgICAgICAgcmV0dXJuICFsb2dpY2FsTm90
SXNQdXJlKG5vZGUpOwogICAgICAgICBjYXNlIEdldEJ5VmFsOgpAQCAtMTQ0NSw3ICsxNDYwLDcg
QEAgcHJpdmF0ZToKICAgICB2b2lkIHBlcmZvcm1TdWJzdGl0dXRpb24oTm9kZUluZGV4JiBjaGls
ZCwgYm9vbCBhZGRSZWYgPSB0cnVlKQogICAgIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBv
cGVyYW5kIGlzIGFjdHVhbGx5IHVudXNlZC4KLSAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSkK
KyAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSB8fCBjaGlsZCA+PSBtX3JlcGxhY2VtZW50cy5z
aXplKCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAogICAgICAgICAvLyBDaGVjayBp
ZiB0aGVyZSBpcyBhbnkgcmVwbGFjZW1lbnQuCkBAIC0xNDU3LDEwICsxNDcyLDEwIEBAIHByaXZh
dGU6CiAgICAgICAgIAogICAgICAgICAvLyBUaGVyZSBpcyBkZWZpbml0ZWx5IGEgcmVwbGFjZW1l
bnQuIEFzc2VydCB0aGF0IHRoZSByZXBsYWNlbWVudCBkb2VzIG5vdAogICAgICAgICAvLyBoYXZl
IGEgcmVwbGFjZW1lbnQuCi0gICAgICAgIEFTU0VSVChtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0g
Tm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkID49IG1fcmVwbGFjZW1lbnRzLnNpemUoKSB8
fCBtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKICAgICAgICAgCiAgICAgICAgIGlm
IChhZGRSZWYpCi0gICAgICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgICAg
IG1fZ3JhcGgucmVmKGNoaWxkKTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBzZXRSZXBsYWNlbWVu
dChOb2RlSW5kZXggcmVwbGFjZW1lbnQpCkBAIC0xNjYxLDYgKzE2NzYsNjk1IEBAIHByaXZhdGU6
CiAjZW5kaWYKICAgICAgICAgZm9yICh1bnNpZ25lZCBibG9jayA9IDA7IGJsb2NrIDwgbV9ncmFw
aC5tX2Jsb2Nrcy5zaXplKCk7ICsrYmxvY2spCiAgICAgICAgICAgICBwZXJmb3JtQmxvY2tDU0Uo
Km1fZ3JhcGgubV9ibG9ja3NbYmxvY2tdKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbV9yZXBsYWNlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX3JlcGxhY2Vt
ZW50c1tpXSA9IE5vTm9kZTsKKyAgICB9CisgICAgCisjZGVmaW5lIE1BWF9IT0lTVEVEX0xPT1Bf
SU5WQVJJQU5UUyAyNTYKKworICAgIHN0cnVjdCBMb29wU2lkZUVmZmVjdHMgeworICAgICAgICBl
bnVtIENsb2JiZXJLaW5kIHsKKyAgICAgICAgICAgIENsb2JiZXJHZXRHbG9iYWxWYXIsCisgICAg
ICAgICAgICBDbG9iYmVyR2V0QnlWYWwsCisgICAgICAgICAgICBDbG9iYmVyQ2hlY2tTdHJ1Y3R1
cmUsCisgICAgICAgICAgICBDbG9iYmVyR2V0QnlPZmZzZXQsCisgICAgICAgICAgICBDbG9iYmVy
R2V0UHJvcGVydHlTdG9yYWdlLAorICAgICAgICAgICAgQ2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0
eVN0b3JhZ2UsCisgICAgICAgICAgICBDbG9iYmVyR2V0QXJyYXlMZW5ndGgsCisgICAgICAgICAg
ICBDbG9iYmVyR2V0U3RyaW5nTGVuZ3RoCisgICAgICAgIH07CisKKyAgICAgICAgTG9vcFNpZGVF
ZmZlY3RzKEJsb2NrSW5kZXggcHJlSGVhZGVyKQorICAgICAgICAgICAgOiBwcmVIZWFkZXJJbmRl
eChwcmVIZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY2FuSG9p
c3RHZXRHbG9iYWxWYXIoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRHbG9iYWxW
YXIpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRCeVZhbCgpIHsgcmV0dXJuICFjbG9iYmVy
cy5nZXQoQ2xvYmJlckdldEJ5VmFsKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0Q2hlY2tTdHJ1
Y3R1cmUoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJDaGVja1N0cnVjdHVyZSk7IH0K
KyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEJ5T2Zmc2V0KCkgeyByZXR1cm4gIWNsb2JiZXJzLmdl
dChDbG9iYmVyR2V0QnlPZmZzZXQpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRQcm9wZXJ0
eVN0b3JhZ2UoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRQcm9wZXJ0eVN0b3Jh
Z2UpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCkg
eyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSk7
IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEFycmF5TGVuZ3RoKCkgeyByZXR1cm4gIWNsb2Ji
ZXJzLmdldChDbG9iYmVyR2V0QXJyYXlMZW5ndGgpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RH
ZXRTdHJpbmdMZW5ndGgoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRTdHJpbmdM
ZW5ndGgpOyB9CisKKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0R2xvYmFsVmFyKCkgeyBjbG9iYmVy
cy5zZXQoQ2xvYmJlckdldEdsb2JhbFZhcik7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0QnlW
YWwoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0QnlWYWwpOyB9CisgICAgICAgIHZvaWQgY2xv
YmJlckNoZWNrU3RydWN0dXJlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckNoZWNrU3RydWN0dXJl
KTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRCeU9mZnNldCgpIHsgY2xvYmJlcnMuc2V0KENs
b2JiZXJHZXRCeU9mZnNldCk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0UHJvcGVydHlTdG9y
YWdlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAg
ICAgdm9pZCBjbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpIHsgY2xvYmJlcnMuc2V0
KENsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICB2b2lkIGNsb2Ji
ZXJHZXRBcnJheUxlbmd0aCgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJHZXRBcnJheUxlbmd0aCk7
IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0U3RyaW5nTGVuZ3RoKCkgeyBjbG9iYmVycy5zZXQo
Q2xvYmJlckdldFN0cmluZ0xlbmd0aCk7IH0KKworICAgICAgICBWZWN0b3I8aW50LCA4PiBwb2xs
dXRlZExvY2FsczsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCA0PiBwb2xsdXRlZEdsb2JhbHM7
CisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDQ+IG5vZGVzV2l0aFBvbGx1dGVkU3RydWN0dXJl
czsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCA0PiBwb2xsdXRlZElkZW50aWZpZXJzOworICAg
ICAgICBWZWN0b3I8aW50LCA4PiBnZXRMb2NhbHM7CisgICAgICAgIEJpdFZlY3RvciBjbG9iYmVy
czsKKyAgICAgICAgQmxvY2tJbmRleCBwcmVIZWFkZXJJbmRleDsKKyAgICB9OworCisgICAgdm9p
ZCBhbmFseXplTG9vcFNpZGVFZmZlY3RzKE5vZGVJbmRleCBsb29wQmVnaW4sIE5vZGVJbmRleCBs
b29wRW5kLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgZm9yIChO
b2RlSW5kZXggaW5kZXggPSBsb29wQmVnaW47IGluZGV4IDwgbG9vcEVuZDsgaW5kZXgrKykgewor
ICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOworCisgICAgICAgICAgICBp
ZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgICAgICAgICBjYXNlIFB1dEJ5VmFs
OgorICAgICAgICAgICAgY2FzZSBQdXRCeVZhbEFsaWFzOgorICAgICAgICAgICAgICAgIC8vIElm
IFB1dEJ5VmFsIHNwZWN1bGF0ZXMgdGhhdCBpdCdzIGFjY2Vzc2luZyBhbiBhcnJheSB3aXRoIGFu
CisgICAgICAgICAgICAgICAgLy8gaW50ZWdlciBpbmRleCwgdGhlbiBpdCdzIGltcG9zc2libGUg
Zm9yIGl0IHRvIGNhdXNlIGEgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlLgor
ICAgICAgICAgICAgICAgIGlmICghYnlWYWxJc1B1cmUobm9kZSkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgbG9vcEluZm8uY2xvYmJlckNoZWNrU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAg
ICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeU9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICBs
b29wSW5mby5jbG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAg
IC8vIFB1dEJ5VmFsQWxpYXMgY2FuJ3QgY2hhbmdlIHRoZSBpbmRleGVkIHN0b3JhZ2UgcG9pbnRl
cgorICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBQdXRCeVZhbCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdl
KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm9wID09IFB1dEJ5VmFsICYmICFp
c0ZpeGVkSW5kZXhlZFN0b3JhZ2VPYmplY3RQcmVkaWN0aW9uKG1fZ3JhcGhbbm9kZS5jaGlsZDEo
KV0ucHJlZGljdGlvbigpKSkKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdl
dEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGFz
c3VtZSB0aGF0IHRoZSBQdXRCeVZhbCB3aWxsIGNsb2JiZXIgdGhlIGxvY2F0aW9uIHdlJ3JlIGdl
dHRpbmcgZnJvbS4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgY2FuIGRvIGJldHRlcjsg
aWYgd2Uga25vdyB0aGF0IHRoZSBQdXRCeVZhbCBpcyBhY2Nlc3NpbmcgYW4gYXJyYXkgb2YgYQor
ICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIEdldEJ5VmFsLCB0aGVu
IHdlIGtub3cgdGhhdCB0aGV5IHdvbid0IGNsb2JiZXIgZWFjaCBvdGhlci4KKyAgICAgICAgICAg
ICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlWYWwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgUHV0U3RydWN0dXJlOgorICAgICAgICAgICAgICAgIC8vIENoYW5n
aW5nIHRoZSBzdHJ1Y3R1cmUgb3IgcHV0dGluZyB0byB0aGUgc3RvcmFnZSBjYW5ub3QKKyAgICAg
ICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHByb3BlcnR5IHN0b3JhZ2UgcG9pbnRlci4KKyAgICAg
ICAgICAgICAgICAvLyBDaGFuZ2luZyB0aGUgc3RydWN0dXJlIGNhbm5vdCBjaGFuZ2UgdGhlIG91
dGNvbWUgb2YgYSBwcm9wZXJ0eSBnZXQuCisgICAgICAgICAgICAgICAgbG9vcEluZm8ubm9kZXNX
aXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzLmFwcGVuZChub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUHV0QnlPZmZzZXQ6CisgICAgICAgICAgICAg
ICAgLy8gU2V0dGluZyBhIHByb3BlcnR5IGNhbm5vdCBjaGFuZ2UgdGhlIHN0cnVjdHVyZS4KKyAg
ICAgICAgICAgICAgICBsb29wSW5mby5wb2xsdXRlZElkZW50aWZpZXJzLmFwcGVuZChtX2dyYXBo
Lm1fc3RvcmFnZUFjY2Vzc0RhdGFbbm9kZS5zdG9yYWdlQWNjZXNzRGF0YUluZGV4KCldLmlkZW50
aWZpZXJOdW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBB
cnJheVBvcDoKKyAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QnlWYWwoKTsKKyAg
ICAgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2guCisgICAgICAgICAgICBjYXNlIEFycmF5UHVz
aDoKKyAgICAgICAgICAgICAgICAvLyBBIHB1c2ggY2Fubm90IGFmZmVjdCBwcmV2aW91c2x5IGV4
aXN0aW5nIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICAgICAgICAgICAgICBsb29wSW5mby5j
bG9iYmVyR2V0QXJyYXlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGNhc2UgUHV0R2xvYmFsVmFyOgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLnBvbGx1dGVk
R2xvYmFscy5hcHBlbmQobm9kZS52YXJOdW1iZXIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIFNldExvY2FsOgorICAgICAgICAgICAgY2FzZSBGbHVzaDoKKyAg
ICAgICAgICAgICAgICBsb29wSW5mby5wb2xsdXRlZExvY2Fscy5hcHBlbmQobm9kZS5sb2NhbCgp
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR2V0TG9jYWw6Cisg
ICAgICAgICAgICAgICAgbG9vcEluZm8uZ2V0TG9jYWxzLmFwcGVuZChub2RlLmxvY2FsKCkpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICBpZiAoY2xvYmJlcnNXb3JsZChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9v
cEluZm8uY2xvYmJlckNoZWNrU3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJ
bmZvLmNsb2JiZXJHZXRCeU9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5j
bG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZv
LmNsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAg
IGxvb3BJbmZvLmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5m
by5jbG9iYmVyR2V0QXJyYXlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8u
Y2xvYmJlckdldFN0cmluZ0xlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5v
cCA9PSBDYWxsIHx8IG5vZGUub3AgPT0gQ29uc3RydWN0KQorICAgICAgICAgICAgICAgICAgICAg
ICAgbG9vcEluZm8uY2xvYmJlckdldEdsb2JhbFZhcigpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGJvb2wgaXNIb2lzdENhbmRpZGF0ZShOb2RlJiBub2RlLCBMb29wU2lkZUVmZmVjdHMmIGxv
b3BJbmZvKQorICAgIHsKKyAgICAgICAgYm9vbCBpc0NhbmRpZGF0ZSA9IGZhbHNlOworCisgICAg
ICAgIHN3aXRjaCAobm9kZS5vcCkgeworCisgICAgICAgIGNhc2UgR2V0Q2FsbGVlOgorICAgICAg
ICBjYXNlIENoZWNrRnVuY3Rpb246CisgICAgICAgIGNhc2UgU3RyaW5nQ2hhckNvZGVBdDoKKyAg
ICAgICAgY2FzZSBTdHJpbmdDaGFyQXQ6CisgICAgICAgIGNhc2UgQ2hlY2tIYXNJbnN0YW5jZToK
KyAgICAgICAgY2FzZSBJbnN0YW5jZU9mOgorICAgICAgICBjYXNlIENvbXBhcmVTdHJpY3RFcToK
KyAgICAgICAgY2FzZSBCaXRBbmQ6CisgICAgICAgIGNhc2UgQml0T3I6CisgICAgICAgIGNhc2Ug
Qml0WG9yOgorICAgICAgICBjYXNlIEJpdExTaGlmdDoKKyAgICAgICAgY2FzZSBCaXRSU2hpZnQ6
CisgICAgICAgIGNhc2UgQml0VVJTaGlmdDoKKyAgICAgICAgY2FzZSBWYWx1ZVRvSW50MzI6Cisg
ICAgICAgIGNhc2UgVUludDMyVG9OdW1iZXI6CisgICAgICAgIGNhc2UgQXJpdGhBZGQ6CisgICAg
ICAgIGNhc2UgQXJpdGhTdWI6CisgICAgICAgIGNhc2UgQXJpdGhNdWw6CisgICAgICAgIGNhc2Ug
QXJpdGhNb2Q6CisgICAgICAgIGNhc2UgQXJpdGhEaXY6CisgICAgICAgIGNhc2UgQXJpdGhBYnM6
CisgICAgICAgIGNhc2UgQXJpdGhNaW46CisgICAgICAgIGNhc2UgQXJpdGhNYXg6CisgICAgICAg
IGNhc2UgQXJpdGhTcXJ0OgorICAgICAgICBjYXNlIFZhbHVlVG9OdW1iZXI6CisgICAgICAgIGNh
c2UgVmFsdWVUb0RvdWJsZToKKyAgICAgICAgY2FzZSBKU0NvbnN0YW50OgorICAgICAgICBjYXNl
IFdlYWtKU0NvbnN0YW50OgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSB0cnVlOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVmFsdWVBZGQ6CisgICAgICAgIGNhc2UgQ29tcGFy
ZUxlc3M6CisgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAgICAgY2FzZSBDb21wYXJl
R3JlYXRlcjoKKyAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgorICAgICAgICBjYXNlIENv
bXBhcmVFcToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gaXNQcmVkaWN0ZWROdW1lcmljYWwo
bm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMb2dpY2FsTm90OgorICAg
ICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb2dpY2FsTm90SXNQdXJlKG5vZGUpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2hlY2tTdHJ1Y3R1cmU6CisgICAgICAgICAgICBpc0Nh
bmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0Q2hlY2tTdHJ1Y3R1cmUoKSAmJiAhbG9vcEluZm8u
bm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzLmNvbnRhaW5zKG5vZGUuY2hpbGQxKCkpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlWYWw6CisgICAgICAgICAgICBpc0Nh
bmRpZGF0ZSA9IGJ5VmFsSXNQdXJlKG5vZGUpICYmIGxvb3BJbmZvLmNhbkhvaXN0R2V0QnlWYWwo
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldFByb3BlcnR5U3RvcmFnZToK
KyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9pc3RHZXRQcm9wZXJ0eVN0
b3JhZ2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEluZGV4ZWRQcm9w
ZXJ0eVN0b3JhZ2U6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0
R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgR2V0QnlPZmZzZXQ6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNh
bkhvaXN0R2V0QnlPZmZzZXQoKSAmJiAhbG9vcEluZm8ucG9sbHV0ZWRJZGVudGlmaWVycy5jb250
YWlucyhtX2dyYXBoLm1fc3RvcmFnZUFjY2Vzc0RhdGFbbm9kZS5zdG9yYWdlQWNjZXNzRGF0YUlu
ZGV4KCldLmlkZW50aWZpZXJOdW1iZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgR2V0QXJyYXlMZW5ndGg6CisgICAgICAgIGNhc2UgR2V0Qnl0ZUFycmF5TGVuZ3RoOgorICAg
ICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdEdldEFycmF5TGVuZ3RoKCk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRTdHJpbmdMZW5ndGg6CisgICAg
ICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0U3RyaW5nTGVuZ3RoKCk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRHbG9iYWxWYXI6CisgICAgICAg
ICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0R2xvYmFsVmFyKCkgJiYgIWxv
b3BJbmZvLnBvbGx1dGVkR2xvYmFscy5jb250YWlucyhub2RlLnZhck51bWJlcigpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldExvY2FsOgorICAgICAgICAgICAgaXNDYW5k
aWRhdGUgPSAhbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgpKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBEYW5nZXJvdXMhIFBheSBtb3JlIGF0dGVu
dGlvbiBwbGVhc2UuCisgICAgICAgIGNhc2UgU2V0TG9jYWw6CisgICAgICAgICAgICBpc0NhbmRp
ZGF0ZSA9ICFsb29wSW5mby5wb2xsdXRlZExvY2Fscy5jb250YWlucyhub2RlLmxvY2FsKCkpICYm
ICFsb29wSW5mby5nZXRMb2NhbHMuY29udGFpbnMobm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KworICAgICAgICByZXR1cm4gaXNDYW5kaWRhdGU7CisgICAgfQorCisgICAgYm9vbCBub2RlQ2Fu
QmVIb2lzdGVkKE5vZGUmIG5vZGUsIEJhc2ljQmxvY2smIHRhcmdldEJsb2NrLCBWZWN0b3I8Tm9k
ZUluZGV4LCAzPiYgaG9pc3RlZENoaWxkcmVuKQorICAgIHsKKyAgICAgICAgYm9vbCBjYW5Ib2lz
dCA9IHRydWU7CisKKyAgICAgICAgaWYgKG5vZGUub3AgJiBOb2RlSGFzVmFyQXJncykgeworICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBjaGls
ZElkeCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsr
KSB7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkID0gbV9ncmFwaC5tX3ZhckFyZ0No
aWxkcmVuW2NoaWxkSWR4XTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gTm9Ob2RlKSB7
CisgICAgICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1l
bnRzW2NoaWxkXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdl
dEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAg
ICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZCk7CisgICAgICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgTm9kZUluZGV4IGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxOwor
ICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMiA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQy
OworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hp
bGQzOworCisgICAgICAgICAgICBpZiAoY2hpbGQxICE9IE5vTm9kZSkgeworICAgICAgICAgICAg
ICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkMV07CisgICAg
ICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxh
Y2VtZW50IDwgdGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hp
bGRyZW4uYXBwZW5kKGNoaWxkMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KGNoaWxkMiAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1l
bnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDJdOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNl
bWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVu
ZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZDIpOwor
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDMgIT0gTm9Ob2RlKSB7Cisg
ICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hp
bGQzXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFyZ2V0QmxvY2suYmVn
aW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAgICAgICAgICAgICAg
IGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4gY2FuSG9pc3Q7CisgICAgfQorCisgICAgdm9pZCBwZXJm
b3JtSG9pc3QoTm9kZUluZGV4IGluZGV4LCBCYXNpY0Jsb2NrJiB0YXJnZXRCbG9jaywgdW5zaWdu
ZWQmIGhvaXN0ZWQpCisgICAgeworICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07
CisKKyAgICAgICAgaWYgKCFob2lzdGVkKQorICAgICAgICAgICAgdGFyZ2V0QmxvY2suYmVnaW4g
PSBtX2dyYXBoLnNpemUoKTsKKworICAgICAgICBtX2dyYXBoLmFwcGVuZChub2RlKTsKKyAgICAg
ICAgTm9kZSYgcmVwbGFjZW1lbnQgPSBtX2dyYXBoLmxhc3QoKTsKKyAgICAgICAgcmVwbGFjZW1l
bnQuc2V0UmVmQ291bnQoIW5vZGUuaGFzUmVzdWx0KCkgJiYgKG5vZGUub3AgJiBOb2RlTXVzdEdl
bmVyYXRlKSA/IDEgOiAwKTsKKyAgICAgICAgLy8gT25seSBwZXJmb3JtIGNoaWxkcmVuIHN1YnN0
aXR1dGlvbiBmb3IgdGhlIHJlcGxhY2VtZW50IG5vZGUuCisgICAgICAgIGlmIChyZXBsYWNlbWVu
dC5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNoaWxk
SWR4ID0gcmVwbGFjZW1lbnQuZmlyc3RDaGlsZCgpOyBjaGlsZElkeCA8IHJlcGxhY2VtZW50LmZp
cnN0Q2hpbGQoKSArIHJlcGxhY2VtZW50Lm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspCisgICAg
ICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5b
Y2hpbGRJZHhdLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsgLy8gRG9uJ3QgcmVmZXJlbmNlIHRo
ZSBuZXcgY2hpbGQgaGVyZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcmZvcm1T
dWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQxLCByZXBsYWNlbWVu
dC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1l
bnQuY2hpbGRyZW4uZml4ZWQuY2hpbGQyLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAg
ICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uZml4ZWQuY2hp
bGQzLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgfQorI2lmIERGR19FTkFCTEUo
REVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCIgICBSZXBsYWNpbmcg
QCV1IC0+IEAlenUiLCBpbmRleCwgbV9ncmFwaC5zaXplKCkgLSAxKTsKKyNlbmRpZgorICAgICAg
ICBtX3JlcGxhY2VtZW50c1tpbmRleF0gPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgIE5v
ZGUmIG5ld05vZGUgPSBtX2dyYXBoW2luZGV4XTsgLy8gVGhpcyBjYW4gZGlmZmVyIGZyb20gIm5v
ZGUiIGJlY2F1c2UgbV9ncmFwaCBpcyBleHBhbmRlZAorICAgICAgICBuZXdOb2RlLnNldFJlZkNv
dW50KDApOworICAgICAgICArK2hvaXN0ZWQ7CisgICAgICAgIHRhcmdldEJsb2NrLmVuZCA9IG1f
Z3JhcGguc2l6ZSgpOworICAgIH0KKworICAgIHZvaWQgaG9pc3RHZXRMb2NhbChOb2RlSW5kZXgg
aW5kZXgsIEJhc2ljQmxvY2smIHRhcmdldEJsb2NrLCB1bnNpZ25lZCYgaG9pc3RlZCkKKyAgICB7
CisgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKKyAgICAgICAgQVNTRVJUKG5v
ZGUub3AgPT0gR2V0TG9jYWwpOworCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9W
RVJCT1NFKQorICAgICAgICBwcmludGYoIiAgICVzIEAldTogIiwgR3JhcGg6Om9wTmFtZShtX2dy
YXBoW2luZGV4XS5vcCksIGluZGV4KTsKKyNlbmRpZgorCisgICAgICAgIGludCBvcGVyYW5kID0g
bm9kZS5sb2NhbCgpOworICAgICAgICBOb2RlSW5kZXggbGFzdERlZmluZUluZGV4ID0gTm9Ob2Rl
OworICAgICAgICBpZiAob3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICBs
YXN0RGVmaW5lSW5kZXggPSB0YXJnZXRCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3Bl
cmFuZFRvQXJndW1lbnQob3BlcmFuZCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0
RGVmaW5lSW5kZXggPSB0YXJnZXRCbG9jay52YXJpYWJsZXNBdFRhaWwubG9jYWwob3BlcmFuZCk7
CisKKyAgICAgICAgQVNTRVJUKGxhc3REZWZpbmVJbmRleCAhPSBOb05vZGUpOworICAgICAgICBO
b2RlJiBsYXN0RGVmaW5lID0gbV9ncmFwaFtsYXN0RGVmaW5lSW5kZXhdOworICAgICAgICBpZiAo
bGFzdERlZmluZS5vcCA9PSBHZXRMb2NhbCkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBA
JXVcbiIsIGluZGV4LCBsYXN0RGVmaW5lSW5kZXgpOworI2VuZGlmCisgICAgICAgICAgICBtX3Jl
cGxhY2VtZW50c1tpbmRleF0gPSBsYXN0RGVmaW5lSW5kZXg7CisgICAgICAgICAgICBub2RlLnNl
dFJlZkNvdW50KDApOworICAgICAgICAgICAgcmV0dXJuOyAvLyBXZSdyZSBkb25lLgorICAgICAg
ICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gU2V0TG9jYWwpIHsKKyAgICAgICAg
ICAgIC8vIFdlIHNob3VsZCBub3QgcmVhY2ggaGVyZSBiZWNhdXNlIGEgU2V0TG9jYWwgd2l0aCB0
aGlzIG9wZXJhbmQKKyAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgaG9pc3RlZCB0byB0aGlz
IGJsb2NrIAorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9PSBQaGkpIHsKKyAgICAgICAgICAgIGlmICghaG9p
c3RlZCkKKyAgICAgICAgICAgICAgICB0YXJnZXRCbG9jay5iZWdpbiA9IG1fZ3JhcGguc2l6ZSgp
OworICAgICAgICAgICAgbV9ncmFwaC5hcHBlbmQobV9ncmFwaFtpbmRleF0pOworICAgICAgICAg
ICAgTm9kZSYgZ2V0TG9jYWxOb2RlID0gbV9ncmFwaFtpbmRleF07CisgICAgICAgICAgICBOb2Rl
JiBnZXRMb2NhbFJlcGxhY2VtZW50ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgICAgICBnZXRM
b2NhbFJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSA9IGxhc3REZWZpbmVJbmRleDsK
KyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2luZGV4XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsK
KyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICBw
cmludGYoIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV6dVxuIiwgaW5kZXgsIG1fZ3JhcGguc2l6ZSgp
IC0gMSk7CisjZW5kaWYKKyAgICAgICAgICAgIGdldExvY2FsUmVwbGFjZW1lbnQuc2V0UmVmQ291
bnQoMCk7CisgICAgICAgICAgICBnZXRMb2NhbE5vZGUuc2V0UmVmQ291bnQoMCk7CisgICAgICAg
ICAgICArK2hvaXN0ZWQ7CisgICAgICAgICAgICB0YXJnZXRCbG9jay5lbmQgPSBtX2dyYXBoLnNp
emUoKTsKKworICAgICAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKQorICAg
ICAgICAgICAgICAgIHRhcmdldEJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChvcGVyYW5k
VG9Bcmd1bWVudChvcGVyYW5kKSkgPSBtX2dyYXBoLnNpemUoKSAtIDE7CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9w
ZXJhbmQpID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgdm9p
ZCBmaXhIb2lzdGVkQ2hpbGRXaXRoU2V0TG9jYWwoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2Rl
SW5kZXggY2hpbGQsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBO
b2RlJiBjaGlsZE5vZGUgPSBtX2dyYXBoW2NoaWxkXTsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxh
Y2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1l
bnQgIT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkTm9kZS5vcCAhPSBHZXRMb2NhbCAm
JiBjaGlsZE5vZGUub3AgIT0gUGhpICYmIGNoaWxkTm9kZS5vcCAhPSBTZXRMb2NhbCk7CisgICAg
ICAgIE5vZGUmIHNldExvY2FsTm9kZSA9IG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAxXTsKKyAgICAg
ICAgQVNTRVJUKHNldExvY2FsTm9kZS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFTU0VSVChz
ZXRMb2NhbE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID09IHJlcGxhY2VtZW50KTsKKworICAg
ICAgICBjaGlsZE5vZGUub3AgPSBHZXRMb2NhbDsKKyAgICAgICAgY2hpbGROb2RlLnNldFZhcmlh
YmxlQWNjZXNzRGF0YShzZXRMb2NhbE5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkpOworICAgICAg
ICBpbnQgb3BlcmFuZCA9IGNoaWxkTm9kZS5sb2NhbCgpOworICAgICAgICBCYXNpY0Jsb2NrJiBw
cmVIZWFkZXJCbG9jayA9ICptX2dyYXBoLm1fYmxvY2tzW2xvb3BJbmZvLnByZUhlYWRlckluZGV4
XTsKKyAgICAgICAgQmFzaWNCbG9jayYgY3VycmVudEJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3Nb
YmxvY2tJbmRleF07CisgICAgICAgIE5vZGVJbmRleCBmaXJzdERlZmluZUluZGV4ID0gTm9Ob2Rl
OworICAgICAgICBsb29wSW5mby5wb2xsdXRlZExvY2Fscy5hcHBlbmQob3BlcmFuZCk7CisgICAg
ICAgIGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkgeworICAgICAgICAgICAgdW5zaWdu
ZWQgYXJnID0gb3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCk7CisgICAgICAgICAgICBwcmVIZWFk
ZXJCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQoYXJnKSA9IHJlcGxhY2VtZW50ICsgMTsK
KyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjdXJyZW50QmxvY2sudmFyaWFibGVzQXRI
ZWFkLmFyZ3VtZW50KGFyZyk7CisgICAgICAgICAgICBjdXJyZW50QmxvY2sudmFyaWFibGVzQXRU
YWlsLmFyZ3VtZW50KGFyZykgPSBjaGlsZDsKKyAgICAgICAgICAgIGlmIChmaXJzdERlZmluZUlu
ZGV4ID09IE5vTm9kZSkKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2sudmFyaWFibGVzQXRI
ZWFkLnNldEFyZ3VtZW50Rmlyc3RUaW1lKGFyZywgY2hpbGQpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQp
ID0gcmVwbGFjZW1lbnQgKyAxOworICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJl
bnRCbG9jay52YXJpYWJsZXNBdEhlYWQubG9jYWwob3BlcmFuZCk7CisgICAgICAgICAgICBjdXJy
ZW50QmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQpID0gY2hpbGQ7CisgICAgICAg
ICAgICBpZiAoZmlyc3REZWZpbmVJbmRleCA9PSBOb05vZGUpCisgICAgICAgICAgICAgICAgY3Vy
cmVudEJsb2NrLnZhcmlhYmxlc0F0SGVhZC5zZXRMb2NhbEZpcnN0VGltZShvcGVyYW5kLCBjaGls
ZCk7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVhZHMgb2YgdGVtcG9yYXJpZXMgZnJvbSBw
cmlvciBibG9ja3MsCisgICAgICAgICAgICAvLyBleHBhbmQgbV9wcmVzZXJ2ZWRWYXJzIHRvIGNv
dmVyIHRoZXNlLgorICAgICAgICAgICAgbV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMuc2V0KG9wZXJh
bmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0RGVmaW5lSW5kZXggIT0gTm9Ob2Rl
ICYmIG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0ub3AgPT0gR2V0TG9jYWwpCisgICAgICAgICAg
ICBmaXJzdERlZmluZUluZGV4ID0gbV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5jaGlsZDEoKTsK
KyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIG9kZCEgV2UnbGwgbWFrZSB0
aGUgbmV4dCAodW51c2VkKSBub2RlIG9mIHRoZSBHZXRMb2NhbAorICAgICAgICAgICAgLy8gdG8g
YmUgdGhlIGNoaWxkIChhIFBoaSBub2RlKSBvZiB0aGUgR2V0TG9jYWwuCisgICAgICAgICAgICBO
b2RlJiBuZXh0Tm9kZSA9IG1fZ3JhcGhbY2hpbGQgKyAxXTsKKyAgICAgICAgICAgIEFTU0VSVCgh
bmV4dE5vZGUuc2hvdWxkR2VuZXJhdGUoKSk7CisgICAgICAgICAgICBuZXh0Tm9kZS5vcCA9IFBo
aTsKKyAgICAgICAgICAgIG5leHROb2RlLnNldFZhcmlhYmxlQWNjZXNzRGF0YShzZXRMb2NhbE5v
ZGUudmFyaWFibGVBY2Nlc3NEYXRhKCkpOworICAgICAgICAgICAgbmV4dE5vZGUuY2hpbGRyZW4u
Zml4ZWQuY2hpbGQxID0gTm9Ob2RlOworICAgICAgICAgICAgbmV4dE5vZGUuY2hpbGRyZW4uZml4
ZWQuY2hpbGQyID0gTm9Ob2RlOworICAgICAgICAgICAgbmV4dE5vZGUuY2hpbGRyZW4uZml4ZWQu
Y2hpbGQzID0gTm9Ob2RlOworICAgICAgICAgICAgLy8gbV9ncmFwaC5hcHBlbmQoTm9kZShQaGks
IENvZGVPcmlnaW4oKSwgT3BJbmZvKGNoaWxkTm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKSkpKTsK
KyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjaGlsZCArIDE7CisgICAgICAgICAgICBp
ZiAob3BlcmFuZElzQXJndW1lbnQob3BlcmFuZCkpCisgICAgICAgICAgICAgICAgbV9ncmFwaC5t
X2FyZ3VtZW50UGhpU3RhY2suYXBwZW5kKFBoaVN0YWNrRW50cnkoJmN1cnJlbnRCbG9jaywgZmly
c3REZWZpbmVJbmRleCwgb3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkpKTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBtX2dyYXBoLm1fbG9jYWxQaGlTdGFjay5hcHBlbmQoUGhp
U3RhY2tFbnRyeSgmY3VycmVudEJsb2NrLCBmaXJzdERlZmluZUluZGV4LCBvcGVyYW5kKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBtX2dyYXBoW2ZpcnN0RGVmaW5lSW5kZXhdLnJlZigpOworICAg
ICAgICBjaGlsZE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID0gZmlyc3REZWZpbmVJbmRleDsK
KyAgICAgICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IE5vTm9kZTsKKyAgICAg
ICAgY2hpbGROb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IE5vTm9kZTsKKyAgICB9CisKKyAg
ICBib29sIGZpeEhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBj
aGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7CisgICAgICAgIGJvb2wgc3Vj
Y2Vzc2Z1bCA9IHRydWU7CisgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFj
ZW1lbnRzW2NoaWxkXTsKKyAgICAgICAgQVNTRVJUKHJlcGxhY2VtZW50ICE9IE5vTm9kZSk7IC8v
IENoaWxkcmVuIG9mIGEgaG9pc3RlZCBub2RlIG11c3QgaGF2ZSBiZWVuIGhvaXN0ZWQgYXMgd2Vs
bC4KKworICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgaWYgKG1fZ3JhcGhb
Y2hpbGRdLnJlZkNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgLy8gT25seSBmaXggdGhpcyBj
aGlsZCBvbmNlLgorICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLm9wICE9IEdldExvY2Fs
ICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IEpTQ29uc3RhbnQgJiYgbV9ncmFwaFtjaGlsZF0ub3Ag
IT0gV2Vha0pTQ29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9ncmFwaFtjaGls
ZF0ub3AgIT0gUGhpICYmIG1fZ3JhcGhbY2hpbGRdLm9wICE9IFNldExvY2FsKTsKKyAgICAgICAg
ICAgICAgICBpZiAocmVwbGFjZW1lbnQgPCBtX2dyYXBoLnNpemUoKSAtIDEgJiYgbV9ncmFwaFty
ZXBsYWNlbWVudCArIDFdLm9wID09IFNldExvY2FsKQorICAgICAgICAgICAgICAgICAgICBmaXhI
b2lzdGVkQ2hpbGRXaXRoU2V0TG9jYWwoYmxvY2tJbmRleCwgY2hpbGQsIGxvb3BJbmZvKTsKKyAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtX2dyYXBoW2NoaWxkXS5vcCAmIE5v
ZGVNdXN0R2VuZXJhdGUpCisgICAgICAgICAgICAgICAgbV9ncmFwaFtjaGlsZF0ucmVmKCk7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7CisgICAgfQorCisgICAgdm9pZCBo
YW5kbGVIb2lzdGVkQ2hpbGQoQmxvY2tJbmRleCBibG9ja0luZGV4LCBOb2RlSW5kZXggY2hpbGQs
IExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBpZiAoZml4SG9pc3Rl
ZENoaWxkKGJsb2NrSW5kZXgsIGNoaWxkLCBsb29wSW5mbykpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGZpeCB0aGlzIGNoaWxkLCB3ZSBuZWVkIHRvIGJh
Y2sgdHJhY2suCisgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDM+IGhvaXN0ZWRDaGlsZHJlbldp
dGhvdXRTZXRMb2NhbDsKKyAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFw
cGVuZChjaGlsZCk7CisgICAgICAgIHdoaWxlICghaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExv
Y2FsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaG9pc3Rl
ZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmxhc3QoKV07CisgICAgICAgICAgICBob2lzdGVkQ2hp
bGRyZW5XaXRob3V0U2V0TG9jYWwucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgaWYgKG5vZGUu
b3AgJiBOb2RlSGFzVmFyQXJncykgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgY2hp
bGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hpbGQoKSAr
IG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBO
b2RlSW5kZXgmIGNoaWxkeCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHggIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hp
bGQoYmxvY2tJbmRleCwgY2hpbGR4LCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgICAg
ICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkeCk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5k
ZXgmIGNoaWxkMSA9IG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxOworICAgICAgICAgICAgICAg
IE5vZGVJbmRleCYgY2hpbGQyID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDI7CisgICAgICAg
ICAgICAgICAgTm9kZUluZGV4JiBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsK
KworICAgICAgICAgICAgICAgIGlmIChjaGlsZDEgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hp
bGQoYmxvY2tJbmRleCwgY2hpbGQxLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhv
aXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQxKTsKKworICAgICAgICAg
ICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRl
eCwgY2hpbGQyLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJl
bldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQyKTsKKworICAgICAgICAgICAgICAgIGlmIChj
aGlsZDMgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQzLCBs
b29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRM
b2NhbC5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGJvb2wgaXNMb29wUHJlSGVhZGVyQmxvY2soQmxvY2tJbmRleCBpbmRleCkKKyAgICB7Cisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnMu
c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnNb
aV0uYmxvY2tJbmRleCA9PSBpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQWRvcHQgdGhl
IGRvbWluYW5jZSBhbGdvcml0aG0gYnkgQ29vcGVyLCBLZWl0aCBELjsgSGFydmV5LCBUaW1vdGh5
IEo7IGFuZCBLZW5uZWR5LCBLZW4gKDIwMDEpLiAKKyAgICAvLyAiQSBTaW1wbGUsIEZhc3QgRG9t
aW5hbmNlIEFsZ29yaXRobSIKKyAgICAvLyBodHRwOi8vd3d3LmhpcGVyc29mdC5yaWNlLmVkdS9n
cmFkcy9wdWJsaWNhdGlvbnMvZG9tMTQucGRmCisgICAgdW5zaWduZWQgaW50ZXJzZWN0KHVuc2ln
bmVkIGIxLCB1bnNpZ25lZCBiMiwgVmVjdG9yPHVuc2lnbmVkPiYgZG9tVHJlZSkKKyAgICB7Cisg
ICAgICAgIHVuc2lnbmVkIGZpbmdlcjEgPSBiMTsKKyAgICAgICAgdW5zaWduZWQgZmluZ2VyMiA9
IGIyOworCisgICAgICAgIHdoaWxlIChmaW5nZXIxICE9IGZpbmdlcjIpIHsKKyAgICAgICAgICAg
IHdoaWxlIChmaW5nZXIxID4gZmluZ2VyMikKKyAgICAgICAgICAgICAgIGZpbmdlcjEgPSBkb21U
cmVlW2ZpbmdlcjFdOworICAgICAgICAgICAgd2hpbGUgKGZpbmdlcjIgPiBmaW5nZXIxKQorICAg
ICAgICAgICAgICAgZmluZ2VyMiA9IGRvbVRyZWVbZmluZ2VyMl07CisgICAgICAgIH0KKworICAg
ICAgICByZXR1cm4gZmluZ2VyMTsKKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVEb21pbmF0b3Jz
KEJsb2NrSW5kZXggYmVnaW4sIEJsb2NrSW5kZXggZW5kLCBWZWN0b3I8QmxvY2tJbmRleCwgOD4m
IGRvbWluYXRvcnMpCisgICAgeworICAgICAgICAvLyBGaXJzdGx5IGNvbXB1dGUgdGhlIGRvbWlu
YXRvciB0cmVlLgorICAgICAgICAvLyBUaGUgdHJlZSBub2RlIGluZGV4IGlzIHRoZSBibG9jayBp
bmRleCBvZmZzZXRlZCBieSB0aGUgYmVnaW4gYmxvY2sgaW5kZXguCisgICAgICAgIFZlY3Rvcjx1
bnNpZ25lZD4gZG9tVHJlZTsKKyAgICAgICAgdW5zaWduZWQgc2l6ZSA9IGVuZCAtIGJlZ2luICsg
MTsKKworICAgICAgICBkb21UcmVlLnJlc2l6ZShzaXplKTsKKyAgICAgICAgZG9tVHJlZVswXSA9
IDA7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBzaXplOyBpKyspCisgICAgICAg
ICAgICBkb21UcmVlW2ldID0gc2l6ZTsKKworICAgICAgICBib29sIGNoYW5nZWQgPSB0cnVlOwor
CisgICAgICAgIHdoaWxlIChjaGFuZ2VkKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7
CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIW1fZ3JhcGgubV9ibG9ja3NbYmVnaW4gKyBpXS0+aXNSZWFjaGFi
bGUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8g
RklYTUU6IFZlcmlmeSBhbmQgZW5zdXJlIHRoYXQgdGhlIHByZWNlc3NvcnMgYXJlIG9yZGVyZWQg
YnkgaW5kZXguCisgICAgICAgICAgICAgICAgUHJlZGVjZXNzb3JMaXN0JiBwcmVkZWNlc3NvcnMg
PSBtX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0tPm1fcHJlZGVjZXNzb3JzOworICAgICAgICAg
ICAgICAgIHVuc2lnbmVkIGogPSAwOworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0
IHByZWRlY2Vzc29yIGluIHRoaXMgc3ViZ3JhcGgKKyAgICAgICAgICAgICAgICB3aGlsZSAocHJl
ZGVjZXNzb3JzW2pdIDwgYmVnaW4pCisgICAgICAgICAgICAgICAgICAgIGorKzsKKworICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIG5ld0lEb20gPSBwcmVkZWNlc3NvcnNbal0gLSBiZWdpbjsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQoZG9tVHJlZVtuZXdJRG9tXSAhPSBzaXplKTsgLy8gTXVzdCBo
YXZlIGJlZW4gcHJvY2Vzc2VkLgorICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAg
ICBmb3IgKDsgaiA8IHByZWRlY2Vzc29ycy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAg
ICAgICB1bnNpZ25lZCBwcmVkID0gcHJlZGVjZXNzb3JzW2pdIC0gYmVnaW47CisgICAgICAgICAg
ICAgICAgICAgIGlmIChkb21UcmVlW3ByZWRdICE9IHNpemUpIC8vIE1lYW5zIGl0J3MgYWxyZWFk
eSBjYWxjdWxhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SURvbSA9IGludGVyc2Vj
dChwcmVkLCBuZXdJRG9tLCBkb21UcmVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgaWYgKGRvbVRyZWVbaV0gIT0gbmV3SURvbSkgeworICAgICAgICAgICAgICAgICAgICBk
b21UcmVlW2ldID0gbmV3SURvbTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzTG9vcFByZUhlYWRl
ckJsb2NrKGJlZ2luICsgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY29u
ZGl0aW9uYWwgaW5uZXIgbG9vcHMgaWYgcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgIE5v
ZGUmIGp1bXAgPSBtX2dyYXBoW21fZ3JhcGgubV9ibG9ja3NbYmVnaW4gKyBpXS0+ZW5kIC0gMV07
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChqdW1wLm9wID09IEp1bXApOworICAgICAgICAg
ICAgICAgICAgICBpID0ganVtcC50YWtlbkJsb2NrSW5kZXgoKSAtIGJlZ2luIC0gMTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVu
IHRyYXZlcnNlIHRoZSBkb21pbmF0b3IgdHJlZSB0byBnZXQgdGhlIGRvbWluYXRvcnMgb2YgdGhl
IGxhc3QgYmxvY2suCisgICAgICAgIHVuc2lnbmVkIGlkb20gPSBkb21UcmVlLmxhc3QoKTsKKyAg
ICAgICAgd2hpbGUgKGlkb20pIHsKKyAgICAgICAgICAgIGRvbWluYXRvcnMuYXBwZW5kKGlkb20g
KyBiZWdpbik7CisgICAgICAgICAgICBpZG9tID0gZG9tVHJlZVtpZG9tXTsKKyAgICAgICAgfQor
ICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChiZWdpbik7CisgICAgfQorCisgICAgdm9pZCBwZXJm
b3JtTElDTShMb29wUHJlSGVhZGVyJiBwcmVIZWFkZXIpCisgICAgeworICAgICAgICBCbG9ja0lu
ZGV4IHByZUhlYWRlckluZGV4ID0gcHJlSGVhZGVyLmJsb2NrSW5kZXg7CisgICAgICAgIEJhc2lj
QmxvY2smIHByZUhlYWRlckJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbcHJlSGVhZGVySW5kZXhd
OworICAgICAgICBCbG9ja0luZGV4IGxvb3BIZWFkZXJJbmRleCA9IG1fZ3JhcGhbcHJlSGVhZGVy
QmxvY2suZW5kIC0gMV0udGFrZW5CbG9ja0luZGV4KCk7CisgICAgICAgIEJhc2ljQmxvY2smIGJs
b2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbbG9vcEhlYWRlckluZGV4XTsKKyAgICAgICAgdW5zaWdu
ZWQgcHJlSGVhZGVyRW5kQmVmb3JlTElDTSA9IHByZUhlYWRlckJsb2NrLmVuZDsKKyAgICAgICAg
TG9vcFNpZGVFZmZlY3RzIGxvb3BJbmZvKHByZUhlYWRlckluZGV4KTsKKyAgICAgICAgdW5zaWdu
ZWQgaG9pc3RlZCA9IDA7CisgICAgICAgIEJsb2NrSW5kZXggbGFzdExvb3BCbG9ja0luZGV4ID0g
bG9vcEhlYWRlckluZGV4OworICAgICAgICB1bnNpZ25lZCBpID0gMDsKKyAgICAgICAgLy8gYm9v
bCBtZXRJbmxpbmUgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmxvY2subV9w
cmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChibG9jay5tX3ByZWRl
Y2Vzc29yc1tpXSA+IGxhc3RMb29wQmxvY2tJbmRleCkKKyAgICAgICAgICAgICAgICBsYXN0TG9v
cEJsb2NrSW5kZXggPSBibG9jay5tX3ByZWRlY2Vzc29yc1tpXTsgLy8gVGhlIGZyb20gYmxvY2sg
b2YgdGhlIGJhY2sgZWRnZS4KKyAgICAgICAgfQorCisgICAgICAgIEJsb2NrSW5kZXggZmlyc3RM
b29wQmxvY2tJbmRleCA9IHByZUhlYWRlckluZGV4ICsgMTsKKyAgICAgICAgVmVjdG9yPEJsb2Nr
SW5kZXgsIDg+IG11c3RSZWFjaEJsb2Nrc0luTG9vcDsKKyAgICAgICAgbXVzdFJlYWNoQmxvY2tz
SW5Mb29wLmFwcGVuZChsYXN0TG9vcEJsb2NrSW5kZXgpOworICAgICAgICBjb21wdXRlRG9taW5h
dG9ycyhmaXJzdExvb3BCbG9ja0luZGV4LCBsYXN0TG9vcEJsb2NrSW5kZXgsIG11c3RSZWFjaEJs
b2Nrc0luTG9vcCk7CisgICAgICAgIGFuYWx5emVMb29wU2lkZUVmZmVjdHMobV9ncmFwaC5tX2Js
b2Nrc1tmaXJzdExvb3BCbG9ja0luZGV4XS0+YmVnaW4sIG1fZ3JhcGgubV9ibG9ja3NbbGFzdExv
b3BCbG9ja0luZGV4XS0+ZW5kLCBsb29wSW5mbyk7CisKKyAgICAgICAgd2hpbGUgKCFtdXN0UmVh
Y2hCbG9ja3NJbkxvb3AuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBCbG9ja0luZGV4IGJsb2Nr
SW5kZXggPSBtdXN0UmVhY2hCbG9ja3NJbkxvb3AubGFzdCgpOworICAgICAgICAgICAgbXVzdFJl
YWNoQmxvY2tzSW5Mb29wLnJlbW92ZUxhc3QoKTsKKworI2lmIDAKKyAgICAgICAgICAgIC8vIEZJ
WE1FOiByZWNvbnNpZGVyIHRoaXMgbGF0ZXIgdG8gYmFsYW5jZSB0aGUgZXhlY3V0aW9uIHBlcmZv
cm1hbmNlIGFuZCBjb21waWxlIHRpbWUuCisgICAgICAgICAgICBpZiAobWV0SW5saW5lKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgIGZvciAobV9jb21waWxl
SW5kZXggPSBtX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdLT5iZWdpbjsgbV9jb21waWxlSW5k
ZXggPCBtX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdLT5lbmQ7ICsrbV9jb21waWxlSW5kZXgp
IHsKKyAgICAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFttX2NvbXBpbGVJbmRleF07
CisKKyNpZiAwCisgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgd2UgbWVldCBpbmxpbmVk
IGJvZGllcyBpbiB0aGUgbG9vcC4KKyAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBJbmxp
bmVTdGFydCkgeworICAgICAgICAgICAgICAgICAgICBtZXRJbmxpbmUgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAg
ICAgICAgICAgIGlmIChub2RlLm9wID09IFBoaSB8fCBub2RlLm9wID09IEZsdXNoKSB7CisgICAg
ICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obm9kZS5jaGlsZHJlbi5maXhlZC5j
aGlsZDEpOworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hp
bGRyZW4uZml4ZWQuY2hpbGQyKTsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1
dGlvbihub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyk7CisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxk
R2VuZXJhdGUgPSBub2RlLnNob3VsZEdlbmVyYXRlKCk7CisgICAgICAgICAgICAgICAgYm9vbCBj
YW5Ib2lzdCA9IGhvaXN0ZWQgPCBNQVhfSE9JU1RFRF9MT09QX0lOVkFSSUFOVFMgLSAxCisgICAg
ICAgICAgICAgICAgICAgICYmIGlzSG9pc3RDYW5kaWRhdGUobm9kZSwgbG9vcEluZm8pOworCisg
ICAgICAgICAgICAgICAgLy8gTG9vayBvbmUgc3RlcCBhaGVhZC4KKyAgICAgICAgICAgICAgICBp
ZiAobV9ncmFwaFttX2NvbXBpbGVJbmRleCArIDFdLm9wID09IFNldExvY2FsICYmIGxvb3BJbmZv
LnBvbGx1dGVkTG9jYWxzLmNvbnRhaW5zKG1fZ3JhcGhbbV9jb21waWxlSW5kZXggKyAxXS5sb2Nh
bCgpKSkKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxzZTsKKworICAgICAgICAg
ICAgICAgIGlmIChub2RlLm9wID09IEdldExvY2FsICYmIGNhbkhvaXN0ICYmIHNob3VsZEdlbmVy
YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGhvaXN0R2V0TG9jYWwobV9jb21waWxlSW5kZXgs
IHByZUhlYWRlckJsb2NrLCBob2lzdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwg
Mz4gaG9pc3RlZENoaWxkcmVuOworICAgICAgICAgICAgICAgIGNhbkhvaXN0ICY9IG5vZGVDYW5C
ZUhvaXN0ZWQobm9kZSwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWRDaGlsZHJlbik7CisKKyAgICAg
ICAgICAgICAgICAvLyBXZSB3YW50IHRvIGhvaXN0IHRoZSBTZXRMb2NhbCBub2RlIHdoYXRldmVy
LgorICAgICAgICAgICAgICAgIGlmICghc2hvdWxkR2VuZXJhdGUgJiYgbm9kZS5vcCAhPSBTZXRM
b2NhbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorI2lmIERGR19F
TkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmludGYo
IiAgICVzIEAldTogIiwgR3JhcGg6Om9wTmFtZShtX2dyYXBoW21fY29tcGlsZUluZGV4XS5vcCks
IG1fY29tcGlsZUluZGV4KTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKGNhbkhvaXN0
KQorICAgICAgICAgICAgICAgICAgICBwZXJmb3JtSG9pc3QobV9jb21waWxlSW5kZXgsIHByZUhl
YWRlckJsb2NrLCBob2lzdGVkKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGRHZW5l
cmF0ZSAmJiAhaG9pc3RlZENoaWxkcmVuLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBUaGlzIG5vZGUgY2Fubm90IGJlIGhvaXN0ZWQgYnV0IGl0IGNvbnRhaW5zIHNvbWUgcmVm
ZXJlbmNlcyB0byB0aGUgaG9pc3RlZCBub2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQWRq
dXN0IHN1Y2ggcmVmZXJlbmNlcyBieSB1dGlsaXppbmcgU2V0TG9jYWwvR2V0TG9jYWwgZm9yIGNy
b3NzIGJsb2NrIHJlZmVyZW5jZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBob2lzdGVkQ2hpbGRyZW4uc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAg
ICAgICAgICBoYW5kbGVIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgaG9pc3RlZENoaWxkcmVuW2ld
LCBsb29wSW5mbyk7CisgICAgICAgICAgICAgICAgfQorCisjaWYgREZHX0VOQUJMRShERUJVR19Q
Uk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRp
ZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvaXN0ZWQpIHsKKyAg
ICAgICAgICAgIEFTU0VSVChtX2dyYXBoW3ByZUhlYWRlckVuZEJlZm9yZUxJQ00gLSAxXS5vcCA9
PSBKdW1wKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1fZ3JhcGhbcHJlSGVhZGVyRW5k
QmVmb3JlTElDTSAtIDFdKTsKKyAgICAgICAgICAgIHByZUhlYWRlckJsb2NrLmVuZCA9IG1fZ3Jh
cGguc2l6ZSgpOworCisgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBuZXdseSBjcmVhdGVkIFBo
aSBub2RlcyBkdXJpbmcgTElDTS4KKyAgICAgICAgICAgIG1fZ3JhcGgucHJvY2Vzc1BoaVN0YWNr
KExvY2FsUGhpU3RhY2ssIHByZUhlYWRlckluZGV4KTsKKyAgICAgICAgICAgIG1fZ3JhcGgucHJv
Y2Vzc1BoaVN0YWNrKEFyZ3VtZW50UGhpU3RhY2ssIHByZUhlYWRlckluZGV4KTsKKworICAgICAg
ICAgICAgLy8gQWRqdXN0IHRoZSByZWZlcmVuY2UgY291bnRzIG9mIHRoZSBNdXN0R2VuZXJhdGUg
bm9kZXMuCisgICAgICAgICAgICAvLyBGb3IgZWZmaWNpZW5jeSB3ZSBpbml0aWFsbHkgc2V0IHRo
ZSBjb3VudCB0byBiZSB6ZXJvIHdoZW4gaG9pc3RpbmcgdGhlbQorICAgICAgICAgICAgLy8gYXMg
dGhleSBtYXkgYmUgZmluYWxseSBub3QgbmVlZGVkIHRvIGJlIGhvaXN0ZWQsIHNvIHRoYXQgdGhl
eSB3b24ndCBiZQorICAgICAgICAgICAgLy8gKHdhc3RlZnVsbHkpIGV2YWx1YXRlZC4KKyAgICAg
ICAgICAgIC8vIEJ1dCBpbiBjYXNlIGlmIHRoZXkncmUgaW5kZWVkIGhvaXN0ZWQgYW5kIG5lZWRl
ZCB0byBiZSBldmFsdWF0ZWQKKyAgICAgICAgICAgIC8vIGFmdGVyIHdlIGZpbmlzaCBMSUNNIGZv
ciBhIGxvb3AsIHdlIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBjb3VudCB0byB0aGVtLgorICAgICAg
ICAgICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBwcmVIZWFkZXJCbG9jay5iZWdpbjsgaW5kZXgg
PCBwcmVIZWFkZXJCbG9jay5lbmQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBOb2RlJiBu
b2RlID0gbV9ncmFwaFtpbmRleF07CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuaGFzUmVzdWx0
KCkgJiYgbm9kZS5zaG91bGRHZW5lcmF0ZSgpICYmIChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0
ZSkpCisgICAgICAgICAgICAgICAgICAgIG5vZGUucmVmKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvb3BJbnZhcmlhbnRDb2RlTW90aW9uKCkKKyAgICB7
CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmlu
dGYoIlBlcmZvcm1pbmcgbG9vcCBpbnZhcmlhbnQgY29kZSBtb3Rpb246Iik7CisjZW5kaWYKKyAg
ICAgICAgQml0VmVjdG9yIG5vbkxlYWZMb29wczsgLy8gVG8gbWFyayB1cCB0aG9zZSBsb29wcyB3
aGljaCBoYXZlIGlubmVyIGxvb3BzLgorICAgICAgICB1bnNpZ25lZCBpID0gMDsKKyAgICAgICAg
Zm9yIChpID0gMDsgaSA8IG1fZ3JhcGgubV9sb29wUHJlSGVhZGVycy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgQmxvY2tJbmRleCBvdXRlckxvb3AgPSBtX2dyYXBoLm1fbG9vcFByZUhlYWRl
cnNbaV0ub3V0ZXJMb29wOworICAgICAgICAgICAgaWYgKG91dGVyTG9vcCAhPSBOb0Jsb2NrKQor
ICAgICAgICAgICAgICAgIG5vbkxlYWZMb29wcy5zZXQob3V0ZXJMb29wKTsKKyAgICAgICAgfQor
CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgIExvb3BQcmVIZWFkZXIgcHJlSGVhZGVyID0gbV9ncmFwaC5t
X2xvb3BQcmVIZWFkZXJzW2ldOworICAgICAgICAgICAgLy8gV2Ugb25seSBwZXJmb3JtIExJQ00g
Zm9yIHRoZSBsZWFmIChpbm5lcm1vc3QpIGxvb3BzIGZvciBub3chCisgICAgICAgICAgICAvLyBB
cyBPU1IgaW4gdGhlIGlubmVyIGxvb3BzIHdpbGwgbWFrZSBMSUNNIGZvciB0aGUgb3V0ZXIgbG9v
cHMKKyAgICAgICAgICAgIC8vIG1lYW5pbmdsZXNzIGJ1dCB3YXN0ZWZ1bCwgdW5sZXNzIHdlIGZp
Z3VyZSBvdXQgYSBnb29kIHNvbHV0aW9uLgorICAgICAgICAgICAgaWYgKCFub25MZWFmTG9vcHMu
Z2V0KHByZUhlYWRlci5ibG9ja0luZGV4KSkKKyAgICAgICAgICAgICAgICBwZXJmb3JtTElDTShw
cmVIZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29tZSBQaGkgbm9kZXMgbWF5IG5v
dCBnZXQgdXBkYXRlZCBjaGlsZHJlbiBmb3Igbm93LgorICAgICAgICBmb3IgKGkgPSBtX2dyYXBo
Lm1fYmxvY2tzLmxhc3QoKS0+ZW5kOyBpIDwgbV9ncmFwaC5tX29yaWdpbmFsU2l6ZTsgaSsrKSB7
CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uZml4
ZWQuY2hpbGQxKTsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obV9ncmFwaFtpXS5j
aGlsZHJlbi5maXhlZC5jaGlsZDIpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbiht
X2dyYXBoW2ldLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBDbGVhbi11cC4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fcmVwbGFjZW1lbnRzLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbaV0gPSBOb05vZGU7CiAgICAgfQog
ICAgIAogICAgIHZvaWQgYWxsb2NhdGVWaXJ0dWFsUmVnaXN0ZXJzKCkKQEAgLTE2NzEsOCArMjM3
NSwxMSBAQCBwcml2YXRlOgogICAgICAgICBwcmludGYoIlxuIik7CiAjZW5kaWYKICAgICAgICAg
U2NvcmVCb2FyZCBzY29yZUJvYXJkKG1fZ3JhcGgsIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzKTsK
LSAgICAgICAgdW5zaWduZWQgc2l6ZUV4Y2x1ZGluZ1BoaU5vZGVzID0gbV9ncmFwaC5tX2Jsb2Nr
cy5sYXN0KCktPmVuZDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplRXhjbHVk
aW5nUGhpTm9kZXM7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fZ3Jh
cGguc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIHBoaSBub2RlcworICAg
ICAgICAgICAgaWYgKGkgPj0gbV9ncmFwaC5tX2Jsb2Nrcy5sYXN0KCktPmVuZCAmJiBpIDwgbV9n
cmFwaC5tX29yaWdpbmFsU2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAg
ICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaV07CiAgICAgICAgIAogICAgICAgICAgICAgaWYg
KCFub2RlLnNob3VsZEdlbmVyYXRlKCkpCkBAIC0xNzI1LDYgKzI0MzIsOCBAQCBwcml2YXRlOgog
ICAgICAgICBwcmludGYoIiAgIEJsb2NrICMldSAoYmMjJXUpOlxuIiwgYmxvY2tJbmRleCwgYmxv
Y2stPmJ5dGVjb2RlQmVnaW4pOwogI2VuZGlmCiAgICAgICAgIHN0YXRlLmJlZ2luQmFzaWNCbG9j
ayhibG9jayk7CisgICAgICAgIGJsb2NrLT5jZmFTaG91bGRSZXZpc2l0ID0gZmFsc2U7CisgICAg
ICAgIGJsb2NrLT5jZmFIYXNWaXNpdGVkID0gdHJ1ZTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1BS
T1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgIHByaW50ZigiICAgICAgaGVhZCB2YXJzOiAiKTsK
ICAgICAgICAgZHVtcE9wZXJhbmRzKGJsb2NrLT52YWx1ZXNBdEhlYWQsIHN0ZG91dCk7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHAJKHJldmlzaW9uIDEwNjYyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3MjUsMjEgKzE3
MjUsMjUgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgIH0K
IAogICAgIGNhc2UgU2V0TG9jYWw6IHsKLSAgICAgICAgLy8gU2V0TG9jYWwgZG91YmxlcyBhcyBh
IGhpbnQgYXMgdG8gd2hlcmUgYSBub2RlIHdpbGwgYmUgc3RvcmVkIGFuZAotICAgICAgICAvLyBh
cyBhIHNwZWN1bGF0aW9uIHBvaW50LiBTbyBiZWZvcmUgd2Ugc3BlY3VsYXRlIG1ha2Ugc3VyZSB0
aGF0IHdlCi0gICAgICAgIC8vIGtub3cgd2hlcmUgdGhlIGNoaWxkIG9mIHRoaXMgbm9kZSBuZWVk
cyB0byBnbyBpbiB0aGUgdmlydHVhbAotICAgICAgICAvLyByZWdpc3RlciBmaWxlLgotICAgICAg
ICBjb21waWxlTW92SGludChub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFzIGZhciBhcyBP
U1IgaXMgY29uY2VybmVkLCB3ZSdyZSBvbiB0aGUgYnl0ZWNvZGUgaW5kZXggY29ycmVzcG9uZGlu
ZwotICAgICAgICAvLyB0byB0aGUgKm5leHQqIGluc3RydWN0aW9uLCBzaW5jZSB3ZSd2ZSBhbHJl
YWR5ICJleGVjdXRlZCIgdGhlCi0gICAgICAgIC8vIFNldExvY2FsIGFuZCB3aGF0ZXZlciBvdGhl
ciBERkcgTm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyBieXRl
Y29kZSBpbmRleCBhcyB0aGUgU2V0TG9jYWwuCi0gICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5G
b3JPU1IgPT0gbm9kZS5jb2RlT3JpZ2luKTsKLSAgICAgICAgTm9kZSYgbmV4dE5vZGUgPSBhdCht
X2NvbXBpbGVJbmRleCArIDEpOworICAgICAgICBib29sIGlzSG9pc3RlZE5vZGUgPSAobV9jb21w
aWxlSW5kZXggPj0gbV9qaXQuZ3JhcGgoKS5tX29yaWdpbmFsU2l6ZSk7CisKKyAgICAgICAgaWYg
KCFpc0hvaXN0ZWROb2RlKSB7CisgICAgICAgICAgICAvLyBTZXRMb2NhbCBkb3VibGVzIGFzIGEg
aGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBiZSBzdG9yZWQgYW5kCisgICAgICAgICAgICAv
LyBhcyBhIHNwZWN1bGF0aW9uIHBvaW50LiBTbyBiZWZvcmUgd2Ugc3BlY3VsYXRlIG1ha2Ugc3Vy
ZSB0aGF0IHdlCisgICAgICAgICAgICAvLyBrbm93IHdoZXJlIHRoZSBjaGlsZCBvZiB0aGlzIG5v
ZGUgbmVlZHMgdG8gZ28gaW4gdGhlIHZpcnR1YWwKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGZp
bGUuCisgICAgICAgICAgICBjb21waWxlTW92SGludChub2RlKTsKICAgICAgICAgCi0gICAgICAg
IG1fY29kZU9yaWdpbkZvck9TUiA9IG5leHROb2RlLmNvZGVPcmlnaW47CisgICAgICAgICAgICAv
LyBBcyBmYXIgYXMgT1NSIGlzIGNvbmNlcm5lZCwgd2UncmUgb24gdGhlIGJ5dGVjb2RlIGluZGV4
IGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHRvIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24s
IHNpbmNlIHdlJ3ZlIGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKKyAgICAgICAgICAgIC8vIFNldExv
Y2FsIGFuZCB3aGF0ZXZlciBvdGhlciBERkcgTm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUg
c2FtZQorICAgICAgICAgICAgLy8gYnl0ZWNvZGUgaW5kZXggYXMgdGhlIFNldExvY2FsLgorICAg
ICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNvZGVPcmlnaW4pOwor
ICAgICAgICAgICAgTm9kZSYgbmV4dE5vZGUgPSBhdChtX2NvbXBpbGVJbmRleCArIDEpOwogICAg
ICAgICAKKyAgICAgICAgICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IG5leHROb2RlLmNvZGVPcmln
aW47CisgICAgICAgIH0KKwogICAgICAgICBpZiAobm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+
c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKICAgICAgICAgICAgIFNwZWN1bGF0ZURvdWJsZU9w
ZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICBtX2ppdC5zdG9y
ZURvdWJsZSh2YWx1ZS5mcHIoKSwgSklUQ29tcGlsZXI6OmFkZHJlc3NGb3Iobm9kZS5sb2NhbCgp
KSk7CkBAIC0xNzQ3LDcgKzE3NTEsOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5v
ZGUmIG5vZGUpCiAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5l
Y2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgIC8vIHRoaXMgYnl0
ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMgb3Igb3RoZXIgbG9jYXRpb25zIGluIHRoZSBy
ZWdpc3RlciBmaWxlLAogICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXQgaXMgc3RvcmVkIGFzIGEg
ZG91YmxlLgotICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUu
bG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CisgICAgICAgICAg
ICBpZiAoIWlzSG9pc3RlZE5vZGUpCisgICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVu
Y2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVy
RmlsZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQcmVkaWN0ZWRUeXBlIHByZWRp
Y3RlZFR5cGUgPSBub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5wcmVkaWN0aW9uKCk7CiAgICAg
ICAgICAgICBpZiAobV9nZW5lcmF0aW9uSW5mb1thdChub2RlLmNoaWxkMSgpKS52aXJ0dWFsUmVn
aXN0ZXIoKV0ucmVnaXN0ZXJGb3JtYXQoKSA9PSBEYXRhRm9ybWF0RG91YmxlKSB7CkBAIC0xNzg1
LDcgKzE3OTAsOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAK
ICAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHRv
IHJldHJpZXZlIHRoZSB2YWx1ZSBvZgogICAgICAgICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJp
YWJsZSBmcm9tIHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZp
bGUuCi0gICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2Nh
bCgpKSA9IFZhbHVlU291cmNlOjpmb3JQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpOworICAgICAg
ICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgIHZhbHVlU291cmNlUmVm
ZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rp
b24ocHJlZGljdGVkVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQu
Y3BwCShyZXZpc2lvbiAxMDY2MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Nw
ZWN1bGF0aXZlSklUNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzk5LDMwICsxNzk5LDM0IEBA
IHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICB9CiAKICAgICBj
YXNlIFNldExvY2FsOiB7Ci0gICAgICAgIC8vIFNldExvY2FsIGRvdWJsZXMgYXMgYSBoaW50IGFz
IHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3JlZCBhbmQKLSAgICAgICAgLy8gYXMgYSBzcGVj
dWxhdGlvbiBwb2ludC4gU28gYmVmb3JlIHdlIHNwZWN1bGF0ZSBtYWtlIHN1cmUgdGhhdCB3ZQot
ICAgICAgICAvLyBrbm93IHdoZXJlIHRoZSBjaGlsZCBvZiB0aGlzIG5vZGUgbmVlZHMgdG8gZ28g
aW4gdGhlIHZpcnR1YWwKLSAgICAgICAgLy8gcmVnaXN0ZXIgZmlsZS4KLSAgICAgICAgY29tcGls
ZU1vdkhpbnQobm9kZSk7CisgICAgICAgIGJvb2wgaXNIb2lzdGVkTm9kZSA9IChtX2NvbXBpbGVJ
bmRleCA+PSBtX2ppdC5ncmFwaCgpLm1fb3JpZ2luYWxTaXplKTsKKworICAgICAgICBpZiAoIWlz
SG9pc3RlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIFNldExvY2FsIGRvdWJsZXMgYXMgYSBoaW50
IGFzIHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3JlZCBhbmQKKyAgICAgICAgICAgIC8vIGFz
IGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3ZSBzcGVjdWxhdGUgbWFrZSBzdXJlIHRo
YXQgd2UKKyAgICAgICAgICAgIC8vIGtub3cgd2hlcmUgdGhlIGNoaWxkIG9mIHRoaXMgbm9kZSBu
ZWVkcyB0byBnbyBpbiB0aGUgdmlydHVhbAorICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZmlsZS4K
KyAgICAgICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOwogICAgICAgICAKLSAgICAgICAgLy8g
QXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3JlIG9uIHRoZSBieXRlY29kZSBpbmRleCBj
b3JyZXNwb25kaW5nCi0gICAgICAgIC8vIHRvIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24sIHNpbmNl
IHdlJ3ZlIGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKLSAgICAgICAgLy8gU2V0TG9jYWwgYW5kIHdo
YXRldmVyIG90aGVyIERGRyBOb2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lCi0gICAg
ICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFzIHRoZSBTZXRMb2NhbC4KLSAgICAgICAgQVNTRVJUKG1f
Y29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNvZGVPcmlnaW4pOwotICAgICAgICBOb2RlJiBuZXh0
Tm9kZSA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7CisgICAgICAgICAgICAvLyBBcyBmYXIgYXMg
T1NSIGlzIGNvbmNlcm5lZCwgd2UncmUgb24gdGhlIGJ5dGVjb2RlIGluZGV4IGNvcnJlc3BvbmRp
bmcKKyAgICAgICAgICAgIC8vIHRvIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24sIHNpbmNlIHdlJ3Zl
IGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKKyAgICAgICAgICAgIC8vIFNldExvY2FsIGFuZCB3aGF0
ZXZlciBvdGhlciBERkcgTm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQorICAgICAg
ICAgICAgLy8gYnl0ZWNvZGUgaW5kZXggYXMgdGhlIFNldExvY2FsLgorICAgICAgICAgICAgQVNT
RVJUKG1fY29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNvZGVPcmlnaW4pOworICAgICAgICAgICAg
Tm9kZSYgbmV4dE5vZGUgPSBhdChtX2NvbXBpbGVJbmRleCArIDEpOwogICAgICAgICAKLSAgICAg
ICAgLy8gT2RkbHksIGl0J3MgcG9zc2libGUgZm9yIHRoZSBieXRlY29kZSBpbmRleCBmb3IgdGhl
IG5leHQgbm9kZSB0byBiZQotICAgICAgICAvLyBlcXVhbCB0byBvdXJzLiBUaGlzIHdpbGwgaGFw
cGVuIGZvciBvcF9wb3N0X2luYy4gQW5kLCBldmVuIG1vcmUgb2RkbHksCi0gICAgICAgIC8vIHRo
aXMgaXMganVzdCBmaW5lLiBPcmRpbmFyaWx5LCB0aGlzIHdvdWxkbid0IGJlIGZpbmUsIHNpbmNl
IGlmIHRoZQotICAgICAgICAvLyBuZXh0IG5vZGUgZmFpbGVkIE9TUiB0aGVuIHdlJ2QgYmUgT1NS
LWluZyB3aXRoIHRoaXMgU2V0TG9jYWwncyBsb2NhbAotICAgICAgICAvLyB2YXJpYWJsZSBhbHJl
YWR5IHNldCBldmVuIHRob3VnaCBmcm9tIHRoZSBzdGFuZHBvaW50IG9mIHRoZSBvbGQgSklULAot
ICAgICAgICAvLyB0aGlzIFNldExvY2FsIHNob3VsZCBub3QgaGF2ZSBleGVjdXRlZC4gQnV0IGZv
ciBvcF9wb3N0X2luYywgaXQncyBqdXN0Ci0gICAgICAgIC8vIGZpbmUsIGJlY2F1c2UgdGhpcyBT
ZXRMb2NhbCdzIGxvY2FsIChpLmUuIHRoZSBMSFMgaW4gYSB4ID0geSsrCi0gICAgICAgIC8vIHN0
YXRlbWVudCkgd291bGQgYmUgZGVhZCBhbnl3YXkgLSBzbyB0aGUgZmFjdCB0aGF0IERGRyB3b3Vs
ZCBoYXZlCi0gICAgICAgIC8vIGFscmVhZHkgbWFkZSB0aGUgYXNzaWdubWVudCwgYW5kIGJha2Vk
IGl0IGludG8gdGhlIHJlZ2lzdGVyIGZpbGUgZHVyaW5nCi0gICAgICAgIC8vIE9TUiBleGl0LCB3
b3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUgb2xkIEpJVCBpbiBhbnkgd2F5LgotICAgICAgICBt
X2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0Tm9kZS5jb2RlT3JpZ2luOworICAgICAgICAgICAgLy8g
T2RkbHksIGl0J3MgcG9zc2libGUgZm9yIHRoZSBieXRlY29kZSBpbmRleCBmb3IgdGhlIG5leHQg
bm9kZSB0byBiZQorICAgICAgICAgICAgLy8gZXF1YWwgdG8gb3Vycy4gVGhpcyB3aWxsIGhhcHBl
biBmb3Igb3BfcG9zdF9pbmMuIEFuZCwgZXZlbiBtb3JlIG9kZGx5LAorICAgICAgICAgICAgLy8g
dGhpcyBpcyBqdXN0IGZpbmUuIE9yZGluYXJpbHksIHRoaXMgd291bGRuJ3QgYmUgZmluZSwgc2lu
Y2UgaWYgdGhlCisgICAgICAgICAgICAvLyBuZXh0IG5vZGUgZmFpbGVkIE9TUiB0aGVuIHdlJ2Qg
YmUgT1NSLWluZyB3aXRoIHRoaXMgU2V0TG9jYWwncyBsb2NhbAorICAgICAgICAgICAgLy8gdmFy
aWFibGUgYWxyZWFkeSBzZXQgZXZlbiB0aG91Z2ggZnJvbSB0aGUgc3RhbmRwb2ludCBvZiB0aGUg
b2xkIEpJVCwKKyAgICAgICAgICAgIC8vIHRoaXMgU2V0TG9jYWwgc2hvdWxkIG5vdCBoYXZlIGV4
ZWN1dGVkLiBCdXQgZm9yIG9wX3Bvc3RfaW5jLCBpdCdzIGp1c3QKKyAgICAgICAgICAgIC8vIGZp
bmUsIGJlY2F1c2UgdGhpcyBTZXRMb2NhbCdzIGxvY2FsIChpLmUuIHRoZSBMSFMgaW4gYSB4ID0g
eSsrCisgICAgICAgICAgICAvLyBzdGF0ZW1lbnQpIHdvdWxkIGJlIGRlYWQgYW55d2F5IC0gc28g
dGhlIGZhY3QgdGhhdCBERkcgd291bGQgaGF2ZQorICAgICAgICAgICAgLy8gYWxyZWFkeSBtYWRl
IHRoZSBhc3NpZ25tZW50LCBhbmQgYmFrZWQgaXQgaW50byB0aGUgcmVnaXN0ZXIgZmlsZSBkdXJp
bmcKKyAgICAgICAgICAgIC8vIE9TUiBleGl0LCB3b3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUg
b2xkIEpJVCBpbiBhbnkgd2F5LgorICAgICAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbmV4
dE5vZGUuY29kZU9yaWdpbjsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKG5vZGUu
dmFyaWFibGVBY2Nlc3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKSB7CiAgICAgICAg
ICAgICBTcGVjdWxhdGVEb3VibGVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwpA
QCAtMTgzMSw3ICsxODM1LDggQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBu
b2RlKQogICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBpdCdzIG5vIGxvbmdlciBuZWNlc3Nh
cnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCiAgICAgICAgICAgICAvLyB0aGlzIGJ5dGVjb2Rl
IHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0
ZXIgZmlsZSwKICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGl0IGlzIHN0b3JlZCBhcyBhIGRvdWJs
ZS4KLSAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2Fs
KCkpID0gVmFsdWVTb3VyY2UoRG91YmxlSW5SZWdpc3RlckZpbGUpOworICAgICAgICAgICAgaWYg
KCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9y
T3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoRG91YmxlSW5SZWdpc3RlckZpbGUp
OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0ZWRU
eXBlID0gbm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+cHJlZGljdGlvbigpOwogICAgICAgICAg
ICAgaWYgKGlzSW50MzJQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CkBAIC0xODY0LDcgKzE4
NjksOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAKICAgICAg
ICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHJldHJp
ZXZlIHRoZSB2YWx1ZSBvZgogICAgICAgICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBm
cm9tIHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUuCi0g
ICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9
IFZhbHVlU291cmNlOjpmb3JQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpOworICAgICAgICAgICAg
aWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNl
Rm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rpb24ocHJl
ZGljdGVkVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlz
aW9uIDEwNjYyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MjAsNyArOTIwLDggQEAgdm9pZCBTcGVjdWxhdGl2
ZUpJVDo6Y29tcGlsZU1vdkhpbnQoTm9kZQogdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShC
YXNpY0Jsb2NrJiBibG9jaykKIHsKICAgICBBU1NFUlQobV9jb21waWxlT2theSk7Ci0gICAgQVNT
RVJUKG1fY29tcGlsZUluZGV4ID09IGJsb2NrLmJlZ2luKTsKKyAgICAvLyBBU1NFUlQobV9jb21w
aWxlSW5kZXggPT0gYmxvY2suYmVnaW4pOworICAgIG1fY29tcGlsZUluZGV4ID0gYmxvY2suYmVn
aW47CiAgICAgCiAgICAgaWYgKCFibG9jay5pc1JlYWNoYWJsZSkgewogICAgICAgICBtX2NvbXBp
bGVJbmRleCA9IGJsb2NrLmVuZDsKQEAgLTk1NiwzNiArOTU3LDQxIEBAIHZvaWQgU3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKICAgICB9CiAgICAgCiAgICAgbV9sYXN0U2V0T3Bl
cmFuZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgbV9jb2RlT3JpZ2lu
Rm9yT1NSID0gQ29kZU9yaWdpbigpOworICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IGF0KGJsb2Nr
LmVuZCAtIDEpLmNvZGVPcmlnaW47IC8vIEluaXRpYWxpemUgaXQgd2l0aCB0aGUgbGFzdCBub2Rl
J3Mgb3JpZ2luIGluIHRoaXMgYmxvY2suCisgICAgYm9vbCBibG9ja0NvbnRhaW5zSG9pc3RlZE5v
ZGVzID0gKG1fY29tcGlsZUluZGV4ID49IG1faml0LmdyYXBoKCkubV9vcmlnaW5hbFNpemUpOwog
CiAgICAgZm9yICg7IG1fY29tcGlsZUluZGV4IDwgYmxvY2suZW5kOyArK21fY29tcGlsZUluZGV4
KSB7CiAgICAgICAgIE5vZGUmIG5vZGUgPSBhdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgIG1f
Y29kZU9yaWdpbkZvck9TUiA9IG5vZGUuY29kZU9yaWdpbjsKKyAgICAgICAgaWYgKCFibG9ja0Nv
bnRhaW5zSG9pc3RlZE5vZGVzKQorICAgICAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbm9k
ZS5jb2RlT3JpZ2luOworCiAgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKSB7CiAj
aWYgREZHX0VOQUJMRShERUJVR19WRVJCT1NFKQogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJTcGVjdWxhdGl2ZUpJVCBza2lwcGluZyBOb2RlIEAlZCAoYmMjJXUpIGF0IEpJVCBvZmZzZXQg
MHgleCAgICAgIiwgKGludCltX2NvbXBpbGVJbmRleCwgbm9kZS5jb2RlT3JpZ2luLmJ5dGVjb2Rl
SW5kZXgsIG1faml0LmRlYnVnT2Zmc2V0KCkpOwogI2VuZGlmCi0gICAgICAgICAgICBzd2l0Y2gg
KG5vZGUub3ApIHsKLSAgICAgICAgICAgIGNhc2UgU2V0TG9jYWw6Ci0gICAgICAgICAgICAgICAg
Y29tcGlsZU1vdkhpbnQobm9kZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg
ICAgIGNhc2UgSW5saW5lU3RhcnQ6IHsKLSAgICAgICAgICAgICAgICBJbmxpbmVDYWxsRnJhbWUq
IGlubGluZUNhbGxGcmFtZSA9IG5vZGUuY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWU7Ci0gICAg
ICAgICAgICAgICAgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzID0gaW5saW5lQ2FsbEZy
YW1lLT5hcmd1bWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXM7ICsraSkgewotICAgICAgICAgICAgICAgICAg
ICBWYWx1ZVJlY292ZXJ5IHJlY292ZXJ5ID0gY29tcHV0ZVZhbHVlUmVjb3ZlcnlGb3IobV92YXJp
YWJsZXNbaW5saW5lQ2FsbEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZTo6YXJndW1lbnRP
ZmZzZXRJbmNsdWRpbmdUaGlzKGkpXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNv
dmVyeSBjYW5ub3QgcG9pbnQgdG8gcmVnaXN0ZXJzLCBzaW5jZSB0aGUgY2FsbCBmcmFtZSByZWlm
aWNhdGlvbiBpc24ndAotICAgICAgICAgICAgICAgICAgICAvLyBhcyBzbWFydCBhcyBPU1IsIHNv
IGl0IGNhbid0IGhhbmRsZSB0aGF0LiBUaGUgZXhjZXB0aW9uIGlzIHRoZSB0aGlzIGFyZ3VtZW50
LAotICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBi
ZSBhYmxlIHRvIHJlY292ZXIuCi0gICAgICAgICAgICAgICAgICAgIEFTU0VSVCghaSB8fCAhcmVj
b3ZlcnkuaXNJblJlZ2lzdGVycygpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2FsbEZy
YW1lLT5hcmd1bWVudHNbaV0gPSByZWNvdmVyeTsKKyAgICAgICAgICAgIGlmICghYmxvY2tDb250
YWluc0hvaXN0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkgewor
ICAgICAgICAgICAgICAgIGNhc2UgU2V0TG9jYWw6CisgICAgICAgICAgICAgICAgICAgIGNvbXBp
bGVNb3ZIaW50KG5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgICAgIGNhc2UgSW5saW5lU3RhcnQ6IHsKKyAgICAgICAgICAgICAgICAgICAgSW5saW5lQ2Fs
bEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBub2RlLmNvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1l
OworICAgICAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMgPSBp
bmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50cy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXM7ICsraSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgVmFsdWVSZWNvdmVyeSByZWNvdmVyeSA9IGNvbXB1dGVWYWx1
ZVJlY292ZXJ5Rm9yKG1fdmFyaWFibGVzW2lubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQgKyBD
YWxsRnJhbWU6OmFyZ3VtZW50T2Zmc2V0SW5jbHVkaW5nVGhpcyhpKV0pOworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gVGhlIHJlY292ZXJ5IGNhbm5vdCBwb2ludCB0byByZWdpc3RlcnMsIHNp
bmNlIHRoZSBjYWxsIGZyYW1lIHJlaWZpY2F0aW9uIGlzbid0CisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBhcyBzbWFydCBhcyBPU1IsIHNvIGl0IGNhbid0IGhhbmRsZSB0aGF0LiBUaGUgZXhj
ZXB0aW9uIGlzIHRoZSB0aGlzIGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8g
d2hpY2ggd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyLgorICAgICAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKCFpIHx8ICFyZWNvdmVyeS5pc0luUmVnaXN0ZXJzKCkp
OworICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2FsbEZyYW1lLT5hcmd1bWVudHNbaV0g
PSByZWNvdmVyeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgICAgIApAQCAtMTUyMSwyMCArMTUyNywyMiBAQCB2b2lkIFNwZWN1bGF0
aXZlSklUOjpjb21waWxlVUludDMyVG9OdW1iCiAgICAgLy8gdG8gZG8gdGhpcyBiZWNhdXNlIGJ5
IHRoaXMgcG9pbnQsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgbmVjZXNzYXJ5IHRvIGNvbXBpbGUgd2hh
dGV2ZXIKICAgICAvLyBvcGVyYXRpb24gdGhlIFVJbnQzMlRvTnVtYmVyIG9yaWdpbmF0ZWQgZnJv
bSBtaWdodCBiZSBkZWFkLgogICAgIHNwZWN1bGF0aW9uQ2hlY2soT3ZlcmZsb3csIEpTVmFsdWVS
ZWdzKCksIE5vTm9kZSwgbV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6Okxlc3NUaGFuLCBv
cDEuZ3ByKCksIFRydXN0ZWRJbW0zMigwKSkpOworIAorICAgIGlmIChtX2NvbXBpbGVJbmRleCA8
IG1faml0LmdyYXBoKCkubV9vcmlnaW5hbFNpemUpIHsKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQg
d2UgY2FuIGRvIHJvbGwgZm9yd2FyZC4KKyAgICAgICAgQVNTRVJUKGF0KG1fY29tcGlsZUluZGV4
ICsgMSkub3AgPT0gU2V0TG9jYWwpOworICAgICAgICBBU1NFUlQoYXQobV9jb21waWxlSW5kZXgg
KyAxKS5jb2RlT3JpZ2luID09IG5vZGUuY29kZU9yaWdpbik7CisgICAgICAgIEFTU0VSVChhdCht
X2NvbXBpbGVJbmRleCArIDIpLmNvZGVPcmlnaW4gIT0gbm9kZS5jb2RlT3JpZ2luKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIE5vdyBkbyB0aGUgbWFnaWMuCisgICAgICAgIE9TUkV4aXQmIGV4aXQg
PSBtX2ppdC5jb2RlQmxvY2soKS0+bGFzdE9TUkV4aXQoKTsKKyAgICAgICAgTm9kZSYgc2V0TG9j
YWwgPSBhdChtX2NvbXBpbGVJbmRleCArIDEpOworICAgICAgICBleGl0Lm1fY29kZU9yaWdpbiA9
IGF0KG1fY29tcGlsZUluZGV4ICsgMikuY29kZU9yaWdpbjsKKyAgICAgICAgZXhpdC5tX2xhc3RT
ZXRPcGVyYW5kID0gc2V0TG9jYWwubG9jYWwoKTsKICAgICAgICAgCi0gICAgLy8gVmVyaWZ5IHRo
YXQgd2UgY2FuIGRvIHJvbGwgZm9yd2FyZC4KLSAgICBBU1NFUlQoYXQobV9jb21waWxlSW5kZXgg
KyAxKS5vcCA9PSBTZXRMb2NhbCk7Ci0gICAgQVNTRVJUKGF0KG1fY29tcGlsZUluZGV4ICsgMSku
Y29kZU9yaWdpbiA9PSBub2RlLmNvZGVPcmlnaW4pOwotICAgIEFTU0VSVChhdChtX2NvbXBpbGVJ
bmRleCArIDIpLmNvZGVPcmlnaW4gIT0gbm9kZS5jb2RlT3JpZ2luKTsKLSAgICAgICAgCi0gICAg
Ly8gTm93IGRvIHRoZSBtYWdpYy4KLSAgICBPU1JFeGl0JiBleGl0ID0gbV9qaXQuY29kZUJsb2Nr
KCktPmxhc3RPU1JFeGl0KCk7Ci0gICAgTm9kZSYgc2V0TG9jYWwgPSBhdChtX2NvbXBpbGVJbmRl
eCArIDEpOwotICAgIGV4aXQubV9jb2RlT3JpZ2luID0gYXQobV9jb21waWxlSW5kZXggKyAyKS5j
b2RlT3JpZ2luOwotICAgIGV4aXQubV9sYXN0U2V0T3BlcmFuZCA9IHNldExvY2FsLmxvY2FsKCk7
Ci0gICAgICAgIAotICAgIC8vIENyZWF0ZSB0aGUgdmFsdWUgcmVjb3ZlcnksIGFuZCBzdHVmZiBp
dCBpbnRvIHRoZSByaWdodCBwbGFjZS4KLSAgICBleGl0LnZhbHVlUmVjb3ZlcnlGb3JPcGVyYW5k
KHNldExvY2FsLmxvY2FsKCkpID0gVmFsdWVSZWNvdmVyeTo6dWludDMySW5HUFIob3AxLmdwcigp
KTsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSB2YWx1ZSByZWNvdmVyeSwgYW5kIHN0dWZmIGl0IGlu
dG8gdGhlIHJpZ2h0IHBsYWNlLgorICAgICAgICBleGl0LnZhbHVlUmVjb3ZlcnlGb3JPcGVyYW5k
KHNldExvY2FsLmxvY2FsKCkpID0gVmFsdWVSZWNvdmVyeTo6dWludDMySW5HUFIob3AxLmdwcigp
KTsKKyAgICB9CiAKICAgICBtX2ppdC5tb3ZlKG9wMS5ncHIoKSwgcmVzdWx0LmdwcigpKTsKICAg
ICBpbnRlZ2VyUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9jb21waWxlSW5kZXgsIG9wMS5mb3JtYXQo
KSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRl
cnByZXRlci5jcHAJKHJldmlzaW9uIDEwNjYyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9p
bnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3MTAsNiArMzcx
MCwxMSBAQCBza2lwX2lkX2N1c3RvbV9zZWxmOgogICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdU
SChvcF9sb29wX2hpbnQpOwogICAgICAgICBORVhUX0lOU1RSVUNUSU9OKCk7CiAgICAgfQorICAg
IERFRklORV9PUENPREUob3BfbG9vcF9wcmVoZWFkZXIpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBh
IG5vLW9wIHVubGVzcyB3ZSBpbnRlbmQgb24gZG9pbmcgT1NSIGZyb20gdGhlIGludGVycHJldGVy
LgorICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9sb29wX3ByZWhlYWRlcik7CisgICAg
ICAgIE5FWFRfSU5TVFJVQ1RJT04oKTsKKyAgICB9CiAgICAgREVGSU5FX09QQ09ERShvcF9sb29w
X2lmX3RydWUpIHsKICAgICAgICAgLyogbG9vcF9pZl90cnVlIGNvbmQocikgdGFyZ2V0KG9mZnNl
dCkKICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAkocmV2aXNpb24g
MTA2NjI5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMDEsOCArMTAxLDEwIEBAIHZvaWQgSklUOjplbWl0T3B0aW1pemF0aW9uQ2hlY2so
T3B0aW1pemEKICAgICAKICAgICBKdW1wIHNraXBPcHRpbWl6ZSA9IGJyYW5jaEFkZDMyKFNpZ25l
ZCwgVHJ1c3RlZEltbTMyKGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gT3B0aW9uczo6
ZXhlY3V0aW9uQ291bnRlckluY3JlbWVudEZvckxvb3AgOiBPcHRpb25zOjpleGVjdXRpb25Db3Vu
dGVySW5jcmVtZW50Rm9yUmV0dXJuKSwgQWJzb2x1dGVBZGRyZXNzKG1fY29kZUJsb2NrLT5hZGRy
ZXNzT2ZKSVRFeGVjdXRlQ291bnRlcigpKSk7CiAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhp
cywga2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBjdGlfb3B0aW1pemVfZnJvbV9sb29w
IDogY3RpX29wdGltaXplX2Zyb21fcmV0KTsKLSAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1pemF0
aW9uQ2hlY2spCi0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0ZWNvZGVP
ZmZzZXQpKTsKKyAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2spIHsKKyAgICAg
ICAgSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY29kZUJsb2NrLT5pbnN0cnVj
dGlvbnMoKS5iZWdpbigpICsgbV9ieXRlY29kZU9mZnNldDsKKyAgICAgICAgc3R1YkNhbGwuYWRk
QXJndW1lbnQoSW1tMzIobV9ieXRlY29kZU9mZnNldCArIGN1cnJlbnRJbnN0cnVjdGlvblsxXS51
Lm9wZXJhbmQpKTsKKyAgICB9CiAgICAgc3R1YkNhbGwuY2FsbCgpOwogICAgIHNraXBPcHRpbWl6
ZS5saW5rKHRoaXMpOwogfQpAQCAtMjkxLDYgKzI5Myw3IEBAIHZvaWQgSklUOjpwcml2YXRlQ29t
cGlsZU1haW5QYXNzKCkKICAgICAgICAgREVGSU5FX09QKG9wX2p0cnVlKQogICAgICAgICBERUZJ
TkVfT1Aob3BfbG9vcCkKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaGludCkKKyAgICAgICAg
REVGSU5FX09QKG9wX2xvb3BfcHJlaGVhZGVyKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9p
Zl9sZXNzKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9sZXNzZXEpCiAgICAgICAgIERF
RklORV9PUChvcF9sb29wX2lmX2dyZWF0ZXIpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aml0L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmgJ
KHJldmlzaW9uIDEwNjYyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmgJKHdv
cmtpbmcgY29weSkKQEAgLTgyMSw2ICs4MjEsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAg
dm9pZCBlbWl0X29wX2p0cnVlKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9s
b29wKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2hpbnQoSW5zdHJ1
Y3Rpb24qKTsKKyAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9u
Kik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3MoSW5zdHJ1Y3Rpb24qKTsKICAg
ICAgICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfbGVzc2VxKEluc3RydWN0aW9uKik7CiAgICAgICAg
IHZvaWQgZW1pdF9vcF9sb29wX2lmX2dyZWF0ZXIoSW5zdHJ1Y3Rpb24qKTsKQEAgLTExMDIsNiAr
MTEwMywxMCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgZW1pdE9wdGltaXphdGlvbkNoZWNr
KExvb3BPcHRpbWl6YXRpb25DaGVjayk7CiAgICAgfQogCisgICAgaW5saW5lIHZvaWQgSklUOjpl
bWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9uKikKKyAgICB7CisgICAgfQorCiAgICAg
aW5saW5lIHZvaWQgSklUOjplbWl0X29wX2xvb3BfaWZfdHJ1ZShJbnN0cnVjdGlvbiogY3VycmVu
dEluc3RydWN0aW9uKQogICAgIHsKICAgICAgICAgZW1pdFRpbWVvdXRDaGVjaygpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125578</attachid>
            <date>2012-02-05 23:12:42 -0800</date>
            <delta_ts>2012-02-27 21:41:00 -0800</delta_ts>
            <desc>WIP patch</desc>
            <filename>76770.14.patch</filename>
            <type>text/plain</type>
            <size>93484</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzOSBA
QAorMjAxMi0wMi0wNSAgWXVxaWFuZyBYaWFuICA8eXVxaWFuZy54aWFuQGludGVsLmNvbT4KKwor
ICAgICAgICBMb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBpbiBKU0MgREZHCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3MuCisK
KyAgICAgICAgVGhlIGZyYW1ld29yayB0byBzdXBwb3J0IG1vdmluZyBhIERGRyBub2RlIChhbmQg
dGhlIG5vZGVzIGNoYWluZWQgd2l0aAorICAgICAgICByZWZlcmVuY2VzKSB0byBhIGRpZmZlcmVu
dCBiYXNpYyBibG9jayBpcyBzdXBwb3NlZCB0byB3b3JrLCBhcyB3ZWxsIGFzCisgICAgICAgIHRo
ZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBjcm9zcy1ibG9jayByZWZlcmVuY2VzLgorICAgICAgICBB
IGJhc2ljIGJsb2NrIGRvbWluYW5jZSBhbmFseXNpcyBhbGdvcml0aG0gaXMgaW50cm9kdWNlZCB0
byBkZXRlcm1pbmUKKyAgICAgICAgd2hpY2ggbG9vcCBibG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVy
ZWQgZm9yIGNvZGUgbW90aW9uOiB0aGUgYmxvY2tzCisgICAgICAgIHRoYXQgZG9taW5hdGUgdGhl
IGxvb3AgZXhpdC4KKyAgICAgICAgU2lkZSBlZmZlY3RzIGFuYWx5c2lzIG9mIGEgbG9vcCBpcyBw
ZXJmb3JtZWQgdG8gZmluZCBvdXQgaWYgdGhlcmUncmUKKyAgICAgICAgcG9zc2libGUgbW9kaWZp
Y2F0aW9ucyB0byB0aGUgcHJvcGVydGllcyBvciB0aGUgc3RydWN0dXJlcywgYW5kIGlmCisgICAg
ICAgIHRoZXJlJ3JlIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGxvY2FsIG9yIHRoZSBn
bG9iYWwgdmFyaWFibGVzLAorICAgICAgICB0byBoZWxwIHVzIG1vcmUgYWNjdXJhdGVseSBkZXRl
cm1pbmUgd2hldGhlciBhIERGRyBub2RlIGlzIGluZGVlZCBsb29wCisgICAgICAgIGludmFyaWFu
dCBvciBub3QuCisgICAgICAgIFRoZSBQaGkgc3RhY2sgcHJvY2Vzc2luZyBsb2dpYyBpcyBtb3Zl
ZCBmcm9tIERGR0J5dGVDb2RlUGFyc2VyIHRvCisgICAgICAgIERGR0dyYXBoLCBhcyB0aGVyZSds
bCBiZSBuZXcgUGhpIG5vZGVzIHRvIGJlIHByb2Nlc3NlZCBhZnRlciBMSUNNLgorICAgICAgICBT
b21lIENGQSBhbmFseXNpcyBpc3N1ZXMgYWZ0ZXIgTElDTSBpcyBleHBvc2VkIGFuZCBmaXhlZC4K
KyAgICAgICAgVGhlIE9TUiBlbnRyeSBpcyBtb2RpZmllZC4gVGhlcmUncyBhIGRlZGljYXRlZCBs
b29wIHByZWhlYWRlciBibG9jayBhcworICAgICAgICB0aGUgT1NSIGVudHJ5LiBBbHNvIHNvbWUg
Q0ZBIGFuYWx5c2lzIHByb2JsZW1zIHRoYXQgY2F1c2UgT1NSIGZhaWx1cmVzCisgICAgICAgIGFy
ZSBmaXhlZC4gQW5kIGR1ZSB0byB0aGUgZmFjdCB0aGF0IE9TUiBlbnRyeSBjYW4gYmUgaW4gYSBu
ZXN0ZWQgbG9vcCwKKyAgICAgICAgY3VycmVudGx5IExJQ00gaXMgb25seSBwZXJmb3JtZWQgZm9y
IGlubmVybW9zdCBsb29wcy4KKyAgICAgICAgU29tZSB0d2Vha3MgYXJlIG1hZGUgd2hlbiByZWNv
cmRpbmcgdGhlIGxvY2FsIHZhcmlhYmxlcycgc3RhdGVzIGluCisgICAgICAgIGNvZGUgZ2VuZXJh
dGlvbiwgdG8gZW5zdXJlIHRoZSBzdGF0ZXMgYXJlIGNvcnJlY3QgYXQgT1NSIGV4aXQsCisgICAg
ICAgIGVzcGVjaWFsbHkgaWYgdGhlIE9TUiBleGl0IGhhcHBlbnMgaW5zaWRlIGEgbG9vcCB3aGlj
aCBoYXMgaG9pc3RlZAorICAgICAgICBsb29wIGludmFyaWFudHMuCisKKyAgICAgICAgKiBieXRl
Y29kZS9Db2RlQmxvY2suY3BwOgorICAgICAgICAoSlNDOjpDb2RlQmxvY2s6OmR1bXApOgorICAg
ICAgICAqIGJ5dGVjb2RlL09wY29kZS5oOgorICAgICAgICAoSlNDKToKKyAgICAgICAgKEpTQzo6
cGFkT3Bjb2RlTmFtZSk6CisgICAgICAgICogYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wSGludCk6Cisg
ICAgICAgIChKU0MpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvb3BQ
cmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oOgor
ICAgICAgICAoQnl0ZWNvZGVHZW5lcmF0b3IpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9Ob2Rl
c0NvZGVnZW4uY3BwOgorICAgICAgICAoSlNDOjpEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKToK
KyAgICAgICAgKEpTQzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpG
b3JOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlNDOjpGb3JJbk5vZGU6OmVtaXRCeXRl
Y29kZSk6CisgICAgICAgICogZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlND
OjpERkc6OkFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNCbG9jayk6CisgICAgICAgIChKU0M6OkRG
Rzo6QWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VGFpbCk6CisgICAgICAgICogZGZnL0RGR0J5
dGVDb2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEJ5dGVDb2RlUGFyc2VyKToKKyAgICAgICAgKEpT
Qzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6Z2V0TG9jYWwpOgorICAgICAgICAoSlNDOjpERkc6OkJ5
dGVDb2RlUGFyc2VyOjpnZXRBcmd1bWVudCk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQ
YXJzZXI6OmZsdXNoKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2VC
bG9jayk6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2Vy
OjpwYXJzZSk6CisgICAgICAgICogZGZnL0RGR0NhcGFiaWxpdGllcy5oOgorICAgICAgICAoSlND
OjpERkc6OmNhbkNvbXBpbGVPcGNvZGUpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmR1bXApOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBo
OjpwcmVkaWN0QXJndW1lbnRUeXBlcyk6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpwcm9jZXNzUGhpU3RhY2spOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5oOgor
ICAgICAgICAoTG9vcFByZUhlYWRlcik6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OlBoaVN0YWNrRW50cnk6OlBoaVN0YWNrRW50cnkpOgorICAgICAgICAoUGhpU3RhY2tFbnRy
eSk6CisgICAgICAgIChHcmFwaCk6CisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6Cisg
ICAgICAgIChKU0M6OkRGRzo6SklUQ29tcGlsZXI6Om5vdGljZU9TUkVudHJ5KToKKyAgICAgICAg
KiBkZmcvREZHTm9kZS5oOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OnNldFZhcmlhYmxlQWNj
ZXNzRGF0YSk6CisgICAgICAgIChOb2RlKToKKyAgICAgICAgKiBkZmcvREZHUHJvcGFnYXRvci5j
cHA6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Zml4cG9pbnQpOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6OnByb3BhZ2F0ZU5vZGVQcmVkaWN0aW9ucyk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6Y29tcGFyZUVxSXNQdXJlKToKKyAgICAgICAgKFByb3Bh
Z2F0b3IpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmNsb2JiZXJzV29ybGQpOgor
ICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OnBlcmZvcm1TdWJzdGl0dXRpb24pOgorICAg
ICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmxvY2FsQ1NFKToKKyAgICAgICAgKEpTQzo6REZH
OjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6Okxvb3BTaWRlRWZmZWN0cyk6CisgICAgICAg
IChMb29wU2lkZUVmZmVjdHMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRHbG9iYWxWYXIpOgorICAgICAgICAoSlNDOjpERkc6OlBy
b3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRCeVZhbCk6CisgICAgICAgIChK
U0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdENoZWNrU3RydWN0
dXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNh
bkhvaXN0R2V0QnlPZmZzZXQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BT
aWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAoSlNDOjpE
Rkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRJbmRleGVkUHJvcGVy
dHlTdG9yYWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVj
dHM6OmNhbkhvaXN0R2V0QXJyYXlMZW5ndGgpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRTdHJpbmdMZW5ndGgpOgorICAgICAgICAo
SlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZmZWN0czo6Y2xvYmJlckdldEdsb2JhbFZh
cik6CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9i
YmVyR2V0QnlWYWwpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6Okxvb3BTaWRlRWZm
ZWN0czo6Y2xvYmJlckNoZWNrU3RydWN0dXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdh
dG9yOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRCeU9mZnNldCk6CisgICAgICAgIChKU0M6
OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyR2V0UHJvcGVydHlTdG9y
YWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNs
b2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9w
YWdhdG9yOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRBcnJheUxlbmd0aCk6CisgICAgICAg
IChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyR2V0U3RyaW5n
TGVuZ3RoKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjphbmFseXplTG9vcFNpZGVF
ZmZlY3RzKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjppc0hvaXN0Q2FuZGlkYXRl
KToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpub2RlQ2FuQmVIb2lzdGVkKToKKyAg
ICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtSG9pc3QpOgorICAgICAgICAoSlND
OjpERkc6OlByb3BhZ2F0b3I6OmhvaXN0R2V0TG9jYWwpOgorICAgICAgICAoSlNDOjpERkc6OlBy
b3BhZ2F0b3I6OmZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6UHJvcGFnYXRvcjo6Zml4SG9pc3RlZENoaWxkKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9w
YWdhdG9yOjpoYW5kbGVIb2lzdGVkQ2hpbGQpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0
b3I6OmlzTG9vcFByZUhlYWRlckJsb2NrKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9y
OjppbnRlcnNlY3QpOgorICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmNvbXB1dGVEb21p
bmF0b3JzKToKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdhdG9yOjpwZXJmb3JtTElDTSk6Cisg
ICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6bG9vcEludmFyaWFudENvZGVNb3Rpb24pOgor
ICAgICAgICAoSlNDOjpERkc6OlByb3BhZ2F0b3I6OmFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycyk6
CisgICAgICAgIChKU0M6OkRGRzo6UHJvcGFnYXRvcjo6cGVyZm9ybUJsb2NrQ0ZBKToKKyAgICAg
ICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1
bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6
Y29tcGlsZVVJbnQzMlRvTnVtYmVyKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgor
ICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZSk6CisgICAgICAgICogaW50ZXJwcmV0ZXIvSW50ZXJw
cmV0ZXIuY3BwOgorICAgICAgICAoSlNDOjpJbnRlcnByZXRlcjo6cHJpdmF0ZUV4ZWN1dGUpOgor
ICAgICAgICAqIGppdC9KSVQuY3BwOgorICAgICAgICAoSlNDOjpKSVQ6OmVtaXRPcHRpbWl6YXRp
b25DaGVjayk6CisgICAgICAgIChKU0M6OkpJVDo6cHJpdmF0ZUNvbXBpbGVNYWluUGFzcyk6Cisg
ICAgICAgICogaml0L0pJVC5oOgorICAgICAgICAoSklUKToKKyAgICAgICAgKEpTQzo6SklUOjpl
bWl0X29wX2xvb3BfaGludCk6CisgICAgICAgIChKU0MpOgorICAgICAgICAoSlNDOjpKSVQ6OmVt
aXRfb3BfbG9vcF9wcmVoZWFkZXIpOgorCiAyMDEyLTAyLTA1ICBHeXV5b3VuZyBLaW0gIDxneXV5
b3VuZy5raW1Ac2Ftc3VuZy5jb20+CiAKICAgICAgICAgW0NNQUtFXSBTdXBwb3J0IGphdmFzY3Jp
cHRjb3JlIHRlc3QgZm9yIEVGTCBwb3J0LiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9Db2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxMDY3NzEpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA5
Miw3ICsxMDkyLDEyIEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wKEV4ZWNTdGF0ZSogZXhlYywgY28K
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Ugb3BfbG9vcF9oaW50
OiB7Ci0gICAgICAgICAgICBwcmludGYoIlslNGRdIGxvb3BfaGludFxuIiwgbG9jYXRpb24pOwor
ICAgICAgICAgICAgaW50IG9mZnNldCA9ICgrK2l0KS0+dS5vcGVyYW5kOworICAgICAgICAgICAg
cHJpbnRmKCJbJTRkXSBsb29wX2hpbnRcdFx0IHByZUhlYWRlcigtPiVkKVxuIiwgbG9jYXRpb24s
IGxvY2F0aW9uICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIHByaW50ZigiWyU0ZF0g
bG9vcF9wcmVoZWFkZXJcbiIsIGxvY2F0aW9uKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICB9CiAgICAgICAgIGNhc2Ugb3Bfc3dpdGNoX2ltbTogewpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9PcGNvZGUuaAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb2RlL09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNTYsNyArMTU2
LDggQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIG1hY3JvKG9wX2xvb3BfaWZfbGVzc2VxLCA0
KSBcCiAgICAgICAgIG1hY3JvKG9wX2xvb3BfaWZfZ3JlYXRlciwgNCkgXAogICAgICAgICBtYWNy
byhvcF9sb29wX2lmX2dyZWF0ZXJlcSwgNCkgXAotICAgICAgICBtYWNybyhvcF9sb29wX2hpbnQs
IDEpIFwKKyAgICAgICAgbWFjcm8ob3BfbG9vcF9oaW50LCAyKSBcCisgICAgICAgIG1hY3JvKG9w
X2xvb3BfcHJlaGVhZGVyLCAxKSBcCiAgICAgICAgIG1hY3JvKG9wX3N3aXRjaF9pbW0sIDQpIFwK
ICAgICAgICAgbWFjcm8ob3Bfc3dpdGNoX2NoYXIsIDQpIFwKICAgICAgICAgbWFjcm8ob3Bfc3dp
dGNoX3N0cmluZywgNCkgXApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxl
ci9CeXRlY29kZUdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDEwNjc3MSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3Iu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NjUsMTAgKzY2NSwxOSBAQCBWYWx1ZVByb2ZpbGUqIEJ5
dGVjb2RlR2VuZXJhdG9yOjplbWl0UHJvCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBC
eXRlY29kZUdlbmVyYXRvcjo6ZW1pdExvb3BIaW50KCkKK3ZvaWQgQnl0ZWNvZGVHZW5lcmF0b3I6
OmVtaXRMb29wSGludChMYWJlbCogcHJlSGVhZGVyKQogewogI2lmIEVOQUJMRShERkdfSklUKQor
ICAgIHNpemVfdCBiZWdpbiA9IGluc3RydWN0aW9ucygpLnNpemUoKTsKICAgICBlbWl0T3Bjb2Rl
KG9wX2xvb3BfaGludCk7CisgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHByZUhlYWRlci0+Ymlu
ZChiZWdpbiwgaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKSk7CisjZW5kaWYKK30KKwordm9pZCBCeXRl
Y29kZUdlbmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIoKQoreworI2lmIEVOQUJMRShERkdfSklU
KQorICAgIGVtaXRPcGNvZGUob3BfbG9vcF9wcmVoZWFkZXIpOwogI2VuZGlmCiB9CiAKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2Rl
R2VuZXJhdG9yLmgJKHJldmlzaW9uIDEwNjc3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNDczLDcg
KzQ3Myw4IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB2b2lkIGVtaXRUb1ByaW1pdGl2ZShS
ZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIHNyYyk7CiAKICAgICAgICAgUGFzc1JlZlB0cjxM
YWJlbD4gZW1pdExhYmVsKExhYmVsKik7Ci0gICAgICAgIHZvaWQgZW1pdExvb3BIaW50KCk7Cisg
ICAgICAgIHZvaWQgZW1pdExvb3BIaW50KExhYmVsKiBwcmVIZWFkZXIpOworICAgICAgICB2b2lk
IGVtaXRMb29wUHJlSGVhZGVyKCk7CiAgICAgICAgIFBhc3NSZWZQdHI8TGFiZWw+IGVtaXRKdW1w
KExhYmVsKiB0YXJnZXQpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBlbWl0SnVtcElmVHJ1
ZShSZWdpc3RlcklEKiBjb25kLCBMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxM
YWJlbD4gZW1pdEp1bXBJZkZhbHNlKFJlZ2lzdGVySUQqIGNvbmQsIExhYmVsKiB0YXJnZXQpOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXND
b2RlZ2VuLmNwcAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTExLDkgKzE1
MTEsMTMgQEAgUmVnaXN0ZXJJRCogRG9XaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeQogewogICAg
IFJlZlB0cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVs
U2NvcGU6Okxvb3ApOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJh
dG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdl
dCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKKwogICAgIFJlZlB0cjxM
YWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2VuZXJhdG9yLmVt
aXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQoKTsK
KyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwogICAgIGdl
bmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwg
bGFzdExpbmUoKSk7CiAgICAKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJh
dG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwpAQCAtMTUzNywxNSArMTU0MSwxOCBAQCBS
ZWdpc3RlcklEKiBXaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiB7CiAgICAgUmVmUHRyPExh
YmVsU2NvcGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TG9v
cCk7CiAKKyAgICBSZWZQdHI8TGFiZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5lcmF0b3IubmV3TGFi
ZWwoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIuZ2V0KCkpOworICAg
IGdlbmVyYXRvci5lbWl0TG9vcFByZUhlYWRlcigpOwogICAgIGdlbmVyYXRvci5lbWl0SnVtcChz
Y29wZS0+Y29udGludWVUYXJnZXQoKSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9wT2ZMb29w
LmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KCk7Ci0gICAgCisKICAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7CiAKICAgICBnZW5lcmF0b3IuZW1pdExh
YmVsKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50
KGxvb3BQcmVIZWFkZXIuZ2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxF
eGVjdXRlU3RhdGVtZW50LCBtX2V4cHItPmxpbmVObygpLCBtX2V4cHItPmxpbmVObygpKTsKIAog
ICAgIGlmIChtX2V4cHItPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkpCkBAIC0xNTcyLDEy
ICsxNTc5LDE1IEBAIFJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY28KICAg
ICBpZiAobV9leHByMSkKICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVyYXRvci5pZ25v
cmVkUmVzdWx0KCksIG1fZXhwcjEpOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVy
ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJl
SGVhZGVyLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKKwogICAg
IFJlZlB0cjxMYWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgZ2Vu
ZXJhdG9yLmVtaXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IHRv
cE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwo
dG9wT2ZMb29wLmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KCk7CiAKICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0
ZW1lbnQpOwogCkBAIC0xNTg3LDYgKzE1OTcsNyBAQCBSZWdpc3RlcklEKiBGb3JOb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvCiAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShnZW5lcmF0b3IuaWdu
b3JlZFJlc3VsdCgpLCBtX2V4cHIzKTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoY29uZGl0
aW9uLmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50KGxvb3BQcmVIZWFkZXIuZ2V0
KCkpOwogICAgIGlmIChtX2V4cHIyKSB7CiAgICAgICAgIGlmIChtX2V4cHIyLT5oYXNDb25kaXRp
b25Db250ZXh0Q29kZWdlbigpKQogICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlSW5Db25k
aXRpb25Db250ZXh0KG1fZXhwcjIsIHRvcE9mTG9vcC5nZXQoKSwgc2NvcGUtPmJyZWFrVGFyZ2V0
KCksIGZhbHNlKTsKQEAgLTE2MjEsMTEgKzE2MzIsMTQgQEAgUmVnaXN0ZXJJRCogRm9ySW5Ob2Rl
OjplbWl0Qnl0ZWNvZGUoQnl0ZQogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzaXplID0gZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpOwogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBleHBlY3RlZFN1YnNj
cmlwdDsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gaXRlciA9IGdlbmVyYXRvci5lbWl0R2V0UHJv
cGVydHlOYW1lcyhnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGJhc2UuZ2V0KCksIGkuZ2V0KCks
IHNpemUuZ2V0KCksIHNjb3BlLT5icmVha1RhcmdldCgpKTsKKworICAgIFJlZlB0cjxMYWJlbD4g
bG9vcFByZUhlYWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0
TGFiZWwobG9vcFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVh
ZGVyKCk7CiAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsK
IAogICAgIFJlZlB0cjxMYWJlbD4gbG9vcFN0YXJ0ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAg
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wU3RhcnQuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5l
bWl0TG9vcEhpbnQoKTsKIAogICAgIFJlZ2lzdGVySUQqIHByb3BlcnR5TmFtZTsKICAgICBib29s
IG9wdGltaXplZEZvcmluQWNjZXNzID0gZmFsc2U7CkBAIC0xNjcyLDYgKzE2ODYsNyBAQCBSZWdp
c3RlcklEKiBGb3JJbk5vZGU6OmVtaXRCeXRlY29kZShCeXRlCiAgICAgICAgIGdlbmVyYXRvci5w
b3BPcHRpbWlzZWRGb3JJbigpOwogCiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+Y29u
dGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludChsb29wUHJlSGVhZGVy
LmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdE5leHRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1l
LCBiYXNlLmdldCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBpdGVyLmdldCgpLCBsb29wU3RhcnQu
Z2V0KCkpOwogICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50
LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CiAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29w
ZS0+YnJlYWtUYXJnZXQoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Fi
c3RyYWN0U3RhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHQWJzdHJhY3RTdGF0ZS5jcHAJKHJldmlzaW9uIDEwNjc3MSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkyLDgg
KzkyLDYgQEAgdm9pZCBBYnN0cmFjdFN0YXRlOjpiZWdpbkJhc2ljQmxvY2soQmFzaQogICAgICAg
ICB9CiAgICAgfQogICAgIAotICAgIGJhc2ljQmxvY2stPmNmYVNob3VsZFJldmlzaXQgPSBmYWxz
ZTsKLSAgICBiYXNpY0Jsb2NrLT5jZmFIYXNWaXNpdGVkID0gdHJ1ZTsKICAgICBtX2Jsb2NrID0g
YmFzaWNCbG9jazsKICAgICBtX2lzVmFsaWQgPSB0cnVlOwogfQpAQCAtOTQ4LDE1ICs5NDYsMjAg
QEAgaW5saW5lIGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VAogICAgICAgICAKICAg
ICBBYnN0cmFjdFZhbHVlKiBzb3VyY2U7CiAgICAgICAgIAotICAgIE5vZGUmIG5vZGUgPSBtX2dy
YXBoW25vZGVJbmRleF07Ci0gICAgaWYgKCFub2RlLnJlZkNvdW50KCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBOb2RlKiBub2RlUHRyID0gJm1fZ3JhcGhbbm9kZUluZGV4XTsKKyAgICBp
ZiAoIW5vZGVQdHItPnJlZkNvdW50KCkpIHsKKyAgICAgICAgaWYgKG5vZGVQdHItPm9wID09IEdl
dExvY2FsKSB7CisgICAgICAgICAgICBBU1NFUlQobm9kZVB0ci0+Y2hpbGQxKCkgIT0gTm9Ob2Rl
KTsKKyAgICAgICAgICAgIG5vZGVQdHIgPSAmbV9ncmFwaFtub2RlUHRyLT5jaGlsZDEoKV07Cisg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAKICNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgICAgICBwcmlu
dGYoIiAgICAgICAgICBJdCdzIGxpdmUsIG5vZGUgQCV1LlxuIiwgbm9kZUluZGV4KTsKICNlbmRp
ZgogCi0gICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgc3dpdGNoIChub2RlUHRyLT5vcCkgewog
ICAgIGNhc2UgUGhpOgogICAgIGNhc2UgU2V0QXJndW1lbnQ6CiAgICAgY2FzZSBGbHVzaDoKQEAg
LTk3OCw3ICs5ODEsNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJnZVN0YXRlQXRU
CiAgICAgY2FzZSBTZXRMb2NhbDoKICAgICAgICAgLy8gVGhlIGJsb2NrIHNldHMgdGhlIHZhcmlh
YmxlLCBhbmQgcG90ZW50aWFsbHkgcmVmaW5lcyBpdCwgYm90aAogICAgICAgICAvLyBiZWZvcmUg
YW5kIGFmdGVyIHNldHRpbmcgaXQuCi0gICAgICAgIHNvdXJjZSA9ICZmb3JOb2RlKG5vZGUuY2hp
bGQxKCkpOworICAgICAgICBzb3VyY2UgPSAmZm9yTm9kZShub2RlUHRyLT5jaGlsZDEoKSk7CiAj
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICBwcmludGYo
IiAgICAgICAgICBTZXR0aW5nLlxuIik7CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCShyZXZpc2lvbiAxMDY3NzEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTAxLDEzICsxMDEsNiBAQCBwcml2YXRlOgogICAgIC8vIExpbmsgYmxvY2sg
c3VjY2Vzc29ycy4KICAgICB2b2lkIGxpbmtCbG9jayhCYXNpY0Jsb2NrKiwgVmVjdG9yPEJsb2Nr
SW5kZXg+JiBwb3NzaWJsZVRhcmdldHMpOwogICAgIHZvaWQgbGlua0Jsb2NrcyhWZWN0b3I8VW5s
aW5rZWRCbG9jaz4mIHVubGlua2VkQmxvY2tzLCBWZWN0b3I8QmxvY2tJbmRleD4mIHBvc3NpYmxl
VGFyZ2V0cyk7Ci0gICAgLy8gTGluayBHZXRMb2NhbCAmIFNldExvY2FsIG5vZGVzLCB0byBlbnN1
cmUgbGl2ZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZC4KLSAgICBlbnVtIFBoaVN0YWNrVHlwZSB7Ci0g
ICAgICAgIExvY2FsUGhpU3RhY2ssCi0gICAgICAgIEFyZ3VtZW50UGhpU3RhY2sKLSAgICB9Owot
ICAgIHRlbXBsYXRlPFBoaVN0YWNrVHlwZSBzdGFja1R5cGU+Ci0gICAgdm9pZCBwcm9jZXNzUGhp
U3RhY2soKTsKICAgICAvLyBBZGQgc3BpbGwgbG9jYXRpb25zIHRvIG5vZGVzLgogICAgIHZvaWQg
YWxsb2NhdGVWaXJ0dWFsUmVnaXN0ZXJzKCk7CiAgICAgCkBAIC0xODksNyArMTgyLDcgQEAgcHJp
dmF0ZToKICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZUFjY2Vzc0RhdGEgPSBu
ZXdWYXJpYWJsZUFjY2Vzc0RhdGEob3BlcmFuZCk7CiAgICAgICAgIAogICAgICAgICBOb2RlSW5k
ZXggcGhpID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyh2YXJpYWJsZUFjY2Vzc0RhdGEpKTsKLSAg
ICAgICAgbV9sb2NhbFBoaVN0YWNrLmFwcGVuZChQaGlTdGFja0VudHJ5KG1fY3VycmVudEJsb2Nr
LCBwaGksIG9wZXJhbmQpKTsKKyAgICAgICAgbV9ncmFwaC5tX2xvY2FsUGhpU3RhY2suYXBwZW5k
KFBoaVN0YWNrRW50cnkobV9jdXJyZW50QmxvY2ssIHBoaSwgb3BlcmFuZCkpOwogICAgICAgICBu
b2RlSW5kZXggPSBhZGRUb0dyYXBoKEdldExvY2FsLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRh
KSwgcGhpKTsKICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5sb2NhbChv
cGVyYW5kKSA9IG5vZGVJbmRleDsKICAgICAgICAgCkBAIC0yNDQsNyArMjM3LDcgQEAgcHJpdmF0
ZToKICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZUFjY2Vzc0RhdGEgPSBuZXdW
YXJpYWJsZUFjY2Vzc0RhdGEob3BlcmFuZCk7CiAKICAgICAgICAgTm9kZUluZGV4IHBoaSA9IGFk
ZFRvR3JhcGgoUGhpLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRhKSk7Ci0gICAgICAgIG1fYXJn
dW1lbnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBh
cmd1bWVudCkpOworICAgICAgICBtX2dyYXBoLm1fYXJndW1lbnRQaGlTdGFjay5hcHBlbmQoUGhp
U3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBhcmd1bWVudCkpOwogICAgICAgICBub2Rl
SW5kZXggPSBhZGRUb0dyYXBoKEdldExvY2FsLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRhKSwg
cGhpKTsKICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChh
cmd1bWVudCkgPSBub2RlSW5kZXg7CiAgICAgICAgIApAQCAtMjk4LDExICsyOTEsMTEgQEAgcHJp
dmF0ZToKICAgICAgICAgTm9kZUluZGV4IHBoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8odmFy
aWFibGVBY2Nlc3NEYXRhKSk7CiAgICAgICAgIG5vZGVJbmRleCA9IGFkZFRvR3JhcGgoRmx1c2gs
IE9wSW5mbyh2YXJpYWJsZUFjY2Vzc0RhdGEpLCBwaGkpOwogICAgICAgICBpZiAob3BlcmFuZElz
QXJndW1lbnQob3BlcmFuZCkpIHsKLSAgICAgICAgICAgIG1fYXJndW1lbnRQaGlTdGFjay5hcHBl
bmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBpbmRleCkpOworICAgICAgICAg
ICAgbV9ncmFwaC5tX2FyZ3VtZW50UGhpU3RhY2suYXBwZW5kKFBoaVN0YWNrRW50cnkobV9jdXJy
ZW50QmxvY2ssIHBoaSwgaW5kZXgpKTsKICAgICAgICAgICAgIG1fY3VycmVudEJsb2NrLT52YXJp
YWJsZXNBdFRhaWwuYXJndW1lbnQoaW5kZXgpID0gbm9kZUluZGV4OwogICAgICAgICAgICAgbV9j
dXJyZW50QmxvY2stPnZhcmlhYmxlc0F0SGVhZC5zZXRBcmd1bWVudEZpcnN0VGltZShpbmRleCwg
bm9kZUluZGV4KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fbG9jYWxQaGlTdGFj
ay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBpbmRleCkpOworICAg
ICAgICAgICAgbV9ncmFwaC5tX2xvY2FsUGhpU3RhY2suYXBwZW5kKFBoaVN0YWNrRW50cnkobV9j
dXJyZW50QmxvY2ssIHBoaSwgaW5kZXgpKTsKICAgICAgICAgICAgIG1fY3VycmVudEJsb2NrLT52
YXJpYWJsZXNBdFRhaWwubG9jYWwoaW5kZXgpID0gbm9kZUluZGV4OwogICAgICAgICAgICAgbV9j
dXJyZW50QmxvY2stPnZhcmlhYmxlc0F0SGVhZC5zZXRMb2NhbEZpcnN0VGltZShpbmRleCwgbm9k
ZUluZGV4KTsKICAgICAgICAgfQpAQCAtODExLDIxICs4MDQsNiBAQCBwcml2YXRlOgogICAgIC8v
IFRoZSBpbmRleCBpbiB0aGUgZ2xvYmFsIHJlc29sdmUgaW5mby4KICAgICB1bnNpZ25lZCBtX2ds
b2JhbFJlc29sdmVOdW1iZXI7CiAKLSAgICBzdHJ1Y3QgUGhpU3RhY2tFbnRyeSB7Ci0gICAgICAg
IFBoaVN0YWNrRW50cnkoQmFzaWNCbG9jayogYmxvY2ssIE5vZGVJbmRleCBwaGksIHVuc2lnbmVk
IHZhck5vKQotICAgICAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQotICAgICAgICAgICAgLCBtX3Bo
aShwaGkpCi0gICAgICAgICAgICAsIG1fdmFyTm8odmFyTm8pCi0gICAgICAgIHsKLSAgICAgICAg
fQotCi0gICAgICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Ci0gICAgICAgIE5vZGVJbmRleCBtX3Bo
aTsKLSAgICAgICAgdW5zaWduZWQgbV92YXJObzsKLSAgICB9OwotICAgIFZlY3RvcjxQaGlTdGFj
a0VudHJ5LCAxNj4gbV9hcmd1bWVudFBoaVN0YWNrOwotICAgIFZlY3RvcjxQaGlTdGFja0VudHJ5
LCAxNj4gbV9sb2NhbFBoaVN0YWNrOwotICAgIAogICAgIHN0cnVjdCBJbmxpbmVTdGFja0VudHJ5
IHsKICAgICAgICAgQnl0ZUNvZGVQYXJzZXIqIG1fYnl0ZUNvZGVQYXJzZXI7CiAgICAgICAgIApA
QCAtOTE0LDYgKzg5Miw5IEBAIHByaXZhdGU6CiAgICAgCiAgICAgLy8gQ2FjaGUgb2YgY29kZSBi
bG9ja3MgdGhhdCB3ZSd2ZSBnZW5lcmF0ZWQgYnl0ZWNvZGUgZm9yLgogICAgIEJ5dGVDb2RlQ2Fj
aGU8Y2FuSW5saW5lRnVuY3Rpb25Gb3I+IG1fY29kZUJsb2NrQ2FjaGU7CisKKyAgICAvLyBTdGFj
ayB0byB0cmFjayB0aGUgbG9vcHMgZW5jb3VudGVyZWQgaW4gdGhpcyBjb2RlIGJsb2NrCisgICAg
VmVjdG9yPEJsb2NrSW5kZXg+IG1fbG9vcFN0YWNrOwogfTsKIAogI2RlZmluZSBORVhUX09QQ09E
RShuYW1lKSBcCkBAIC0xOTIyLDYgKzE5MDMsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgIGNhc2Ugb3BfbG9vcDogewogICAgICAgICAgICAgdW5z
aWduZWQgcmVsYXRpdmVPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwog
ICAgICAgICAgICAgYWRkVG9HcmFwaChKdW1wLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyByZWxh
dGl2ZU9mZnNldCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0VtcHR5KCkp
OworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgTEFT
VF9PUENPREUob3BfbG9vcCk7CiAgICAgICAgIH0KIApAQCAtMTk0Myw2ICsxOTI2LDggQEAgYm9v
bCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgdW5zaWdu
ZWQgcmVsYXRpdmVPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwogICAg
ICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlvbiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kKTsKICAgICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJy
ZW50SW5kZXggKyByZWxhdGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIE9QQ09E
RV9MRU5HVEgob3BfbG9vcF9pZl90cnVlKSksIGNvbmRpdGlvbik7CisgICAgICAgICAgICBBU1NF
UlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBtX2xvb3BTdGFjay5yZW1v
dmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09QQ09ERShvcF9sb29wX2lmX3RydWUpOwogICAg
ICAgICB9CiAKQEAgLTE5NTAsNiArMTkzNSw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNl
QmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIHVuc2lnbmVkIHJlbGF0aXZlT2Zmc2V0ID0gY3Vy
cmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKICAgICAgICAgICAgIE5vZGVJbmRleCBjb25k
aXRpb24gPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZCk7CiAgICAgICAgICAg
ICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdU
SChvcF9sb29wX2lmX2ZhbHNlKSksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zm
c2V0KSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0
eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAg
IExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfZmFsc2UpOwogICAgICAgICB9CiAKQEAgLTIwNDcsNiAr
MjAzNCw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAg
ICAgICAgIE5vZGVJbmRleCBvcDIgPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFu
ZCk7CiAgICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gYWRkVG9HcmFwaChDb21wYXJl
TGVzcywgb3AxLCBvcDIpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChCcmFuY2gsIE9wSW5mbyht
X2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsg
T1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2xlc3MpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAg
IEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNr
LnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfbGVzcyk7
CiAgICAgICAgIH0KIApAQCAtMjA1Niw2ICsyMDQ1LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6
cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgTm9kZUluZGV4IG9wMiA9IGdldChjdXJy
ZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRleCBjb25k
aXRpb24gPSBhZGRUb0dyYXBoKENvbXBhcmVMZXNzRXEsIG9wMSwgb3AyKTsKICAgICAgICAgICAg
IGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyByZWxhdGl2ZU9mZnNl
dCksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfbG9vcF9pZl9sZXNz
ZXEpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0
eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAg
IExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfbGVzc2VxKTsKICAgICAgICAgfQogCkBAIC0yMDY1LDYg
KzIwNTYsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAg
ICAgICAgICBOb2RlSW5kZXggb3AyID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJh
bmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlvbiA9IGFkZFRvR3JhcGgoQ29tcGFy
ZUdyZWF0ZXIsIG9wMSwgb3AyKTsKICAgICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcElu
Zm8obV9jdXJyZW50SW5kZXggKyByZWxhdGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJlbnRJbmRl
eCArIE9QQ09ERV9MRU5HVEgob3BfbG9vcF9pZl9ncmVhdGVyKSksIGNvbmRpdGlvbik7CisgICAg
ICAgICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBtX2xv
b3BTdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09QQ09ERShvcF9sb29wX2lm
X2dyZWF0ZXIpOwogICAgICAgICB9CiAKQEAgLTIwNzQsNiArMjA2Nyw4IEBAIGJvb2wgQnl0ZUNv
ZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIE5vZGVJbmRleCBvcDIg
PSBnZXQoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZCk7CiAgICAgICAgICAgICBOb2Rl
SW5kZXggY29uZGl0aW9uID0gYWRkVG9HcmFwaChDb21wYXJlR3JlYXRlckVxLCBvcDEsIG9wMik7
CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsg
cmVsYXRpdmVPZmZzZXQpLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyBPUENPREVfTEVOR1RIKG9w
X2xvb3BfaWZfZ3JlYXRlcmVxKSksIGNvbmRpdGlvbik7CisgICAgICAgICAgICBBU1NFUlQoIW1f
bG9vcFN0YWNrLmlzRW1wdHkoKSk7CisgICAgICAgICAgICBtX2xvb3BTdGFjay5yZW1vdmVMYXN0
KCk7CiAgICAgICAgICAgICBMQVNUX09QQ09ERShvcF9sb29wX2lmX2dyZWF0ZXJlcSk7CiAgICAg
ICAgIH0KIApAQCAtMjE2NCw3ICsyMTU5LDE3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNl
QmxvY2sodW5zaWduZWQKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ugb3BfbG9vcF9oaW50OiB7
Ci0gICAgICAgICAgICAvLyBCYXNlbGluZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxvb3AgaGlu
dHMuIFRoZSBERkcgYXNzdW1lcyB0aGF0IEJhc2VsaW5lLT5ERkcKKyAgICAgICAgICAgIEFTU0VS
VF9VTlVTRUQoYmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdpbik7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIC8vIEVtaXQgYSBwaGFudG9tIG5vZGUgdG8gZW5zdXJlIHRo
YXQgdGhlcmUgaXMgYSBwbGFjZWhvbGRlciBub2RlIGZvciB0aGlzIGJ5dGVjb2RlCisgICAgICAg
ICAgICAvLyBvcC4KKyAgICAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2xvb3BfaGludCk7CisgICAgICAgIH0KKwor
ICAgICAgICBjYXNlIG9wX2xvb3BfcHJlaGVhZGVyOiB7CisgICAgICAgICAgICAvLyBCYXNlbGlu
ZS0+REZHIE9TUiBqdW1wcyBiZXR3ZWVuIGxvb3AgcHJlaGVhZGVycy4gVGhlIERGRyBhc3N1bWVz
IHRoYXQgQmFzZWxpbmUtPkRGRwogICAgICAgICAgICAgLy8gT1NSIGNhbiBvbmx5IGhhcHBlbiBh
dCBiYXNpYyBibG9jayBib3VuZGFyaWVzLiBBc3NlcnQgdGhhdCB0aGVzZSB0d28gc3RhdGVtZW50
cwogICAgICAgICAgICAgLy8gYXJlIGNvbXBhdGlibGUuCiAgICAgICAgICAgICBBU1NFUlRfVU5V
U0VEKGJsb2NrQmVnaW4sIG1fY3VycmVudEluZGV4ID09IGJsb2NrQmVnaW4pOwpAQCAtMjE3OSw3
ICsyMTg0LDEzIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAg
ICAgICAgICAgIC8vIG9wLgogICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tKTsKICAgICAg
ICAgICAgIAotICAgICAgICAgICAgTkVYVF9PUENPREUob3BfbG9vcF9oaW50KTsKKyAgICAgICAg
ICAgIEJsb2NrSW5kZXggY3VycmVudEJsb2NrID0gbV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCkgLSAx
OworICAgICAgICAgICAgQmxvY2tJbmRleCBvdXRlckxvb3AgPSBtX2xvb3BTdGFjay5pc0VtcHR5
KCkgPyBOb0Jsb2NrIDogbV9sb29wU3RhY2subGFzdCgpOworICAgICAgICAgICAgbV9sb29wU3Rh
Y2suYXBwZW5kKGN1cnJlbnRCbG9jayk7CisgICAgICAgICAgICBMb29wUHJlSGVhZGVyIHByZUhl
YWRlciA9IHtjdXJyZW50QmxvY2ssIG91dGVyTG9vcH07CisgICAgICAgICAgICBtX2dyYXBoLm1f
bG9vcFByZUhlYWRlcnMuYXBwZW5kKHByZUhlYWRlcik7CisKKyAgICAgICAgICAgIE5FWFRfT1BD
T0RFKG9wX2xvb3BfcHJlaGVhZGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBA
IC0yMTkzLDE1MCArMjIwNCw2IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5z
aWduZWQKICAgICB9CiB9CiAKLXRlbXBsYXRlPEJ5dGVDb2RlUGFyc2VyOjpQaGlTdGFja1R5cGUg
c3RhY2tUeXBlPgotdm9pZCBCeXRlQ29kZVBhcnNlcjo6cHJvY2Vzc1BoaVN0YWNrKCkKLXsKLSAg
ICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+JiBwaGlTdGFjayA9IChzdGFja1R5cGUgPT0gQXJn
dW1lbnRQaGlTdGFjaykgPyBtX2FyZ3VtZW50UGhpU3RhY2sgOiBtX2xvY2FsUGhpU3RhY2s7Ci0K
LSAgICB3aGlsZSAoIXBoaVN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICBQaGlTdGFja0VudHJ5
IGVudHJ5ID0gcGhpU3RhY2subGFzdCgpOwotICAgICAgICBwaGlTdGFjay5yZW1vdmVMYXN0KCk7
Ci0gICAgICAgIAotICAgICAgICBQcmVkZWNlc3Nvckxpc3QmIHByZWRlY2Vzc29ycyA9IGVudHJ5
Lm1fYmxvY2stPm1fcHJlZGVjZXNzb3JzOwotICAgICAgICB1bnNpZ25lZCB2YXJObyA9IGVudHJ5
Lm1fdmFyTm87Ci0gICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclBoaSA9IG1fZ3Jh
cGhbZW50cnkubV9waGldLnZhcmlhYmxlQWNjZXNzRGF0YSgpOwotCi0jaWYgREZHX0VOQUJMRShE
RUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICBwcmludGYoIiAgIEhhbmRsaW5nIHBo
aSBlbnRyeSBmb3IgdmFyICV1LCBwaGkgQCV1LlxuIiwgZW50cnkubV92YXJObywgZW50cnkubV9w
aGkpOwotI2VuZGlmCi0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVkZWNlc3Nv
cnMuc2l6ZSgpOyArK2kpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJP
U0UpCi0gICAgICAgICAgICBwcmludGYoIiAgICAgRGVhbGluZyB3aXRoIHByZWRlY2Vzc29yIGJs
b2NrICV1LlxuIiwgcHJlZGVjZXNzb3JzW2ldKTsKLSNlbmRpZgotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBCYXNpY0Jsb2NrKiBwcmVkZWNlc3NvckJsb2NrID0gbV9ncmFwaC5tX2Jsb2Nrc1tw
cmVkZWNlc3NvcnNbaV1dLmdldCgpOwotCi0gICAgICAgICAgICBOb2RlSW5kZXgmIHZhciA9IChz
dGFja1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykgPyBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJs
ZXNBdFRhaWwuYXJndW1lbnQodmFyTm8pIDogcHJlZGVjZXNzb3JCbG9jay0+dmFyaWFibGVzQXRU
YWlsLmxvY2FsKHZhck5vKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm9kZUluZGV4IHZh
bHVlSW5QcmVkZWNlc3NvciA9IHZhcjsKLSAgICAgICAgICAgIGlmICh2YWx1ZUluUHJlZGVjZXNz
b3IgPT0gTm9Ob2RlKSB7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NF
KQotICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgRGlkIG5vdCBmaW5kIG5vZGUsIGFkZGlu
ZyBwaGkuXG4iKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgdmFsdWVJblByZWRlY2Vzc29y
ID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyhuZXdWYXJpYWJsZUFjY2Vzc0RhdGEoc3RhY2tUeXBl
ID09IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVudFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNf
Y2FzdDxpbnQ+KHZhck5vKSkpKTsKLSAgICAgICAgICAgICAgICB2YXIgPSB2YWx1ZUluUHJlZGVj
ZXNzb3I7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNr
KQotICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdEhlYWQu
c2V0QXJndW1lbnRGaXJzdFRpbWUodmFyTm8sIHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvckJsb2NrLT52YXJp
YWJsZXNBdEhlYWQuc2V0TG9jYWxGaXJzdFRpbWUodmFyTm8sIHZhbHVlSW5QcmVkZWNlc3Nvcik7
Ci0gICAgICAgICAgICAgICAgcGhpU3RhY2suYXBwZW5kKFBoaVN0YWNrRW50cnkocHJlZGVjZXNz
b3JCbG9jaywgdmFsdWVJblByZWRlY2Vzc29yLCB2YXJObykpOwotICAgICAgICAgICAgfSBlbHNl
IGlmIChtX2dyYXBoW3ZhbHVlSW5QcmVkZWNlc3Nvcl0ub3AgPT0gR2V0TG9jYWwpIHsKLSNpZiBE
RkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICAgICAgcHJp
bnRmKCIgICAgICBGb3VuZCBHZXRMb2NhbCBAJXUuXG4iLCB2YWx1ZUluUHJlZGVjZXNzb3IpOwot
I2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBW
YXJpYWJsZUFjY2Vzc0RhdGFzIGFyZSBpZGVudGljYWwgYmV0d2VlbiB0aGUKLSAgICAgICAgICAg
ICAgICAvLyBHZXRMb2NhbCBhbmQgaXRzIGJsb2NrLWxvY2FsIFBoaS4gU3RyaWN0bHkgc3BlYWtp
bmcgd2Ugb25seSBuZWVkIHRoZSB0d28KLSAgICAgICAgICAgICAgICAvLyB0byBiZSB1bmlmaWVk
LiBCdXQgZm9yIGVmZmljaWVuY3ksIHdlIHdhbnQgdGhlIGNvZGUgdGhhdCBjcmVhdGVzIEdldExv
Y2FscwotICAgICAgICAgICAgICAgIC8vIGFuZCBQaGlzIHRvIHRyeSB0byByZXVzZSBWYXJpYWJs
ZUFjY2Vzc0RhdGFzIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgQVNTRVJU
KG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS52YXJpYWJsZUFjY2Vzc0RhdGEoKSA9PSBtX2dy
YXBoW21fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5jaGlsZDEoKV0udmFyaWFibGVBY2Nlc3NE
YXRhKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZhbHVlSW5QcmVkZWNl
c3NvciA9IG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5jaGlsZDEoKTsKLSAgICAgICAgICAg
IH0gZWxzZSB7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAg
ICAgICAgICAgICAgIHByaW50ZigiICAgICAgRm91bmQgQCV1LlxuIiwgdmFsdWVJblByZWRlY2Vz
c29yKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhb
dmFsdWVJblByZWRlY2Vzc29yXS5vcCA9PSBTZXRMb2NhbCB8fCBtX2dyYXBoW3ZhbHVlSW5QcmVk
ZWNlc3Nvcl0ub3AgPT0gUGhpIHx8IG1fZ3JhcGhbdmFsdWVJblByZWRlY2Vzc29yXS5vcCA9PSBG
bHVzaCB8fCAobV9ncmFwaFt2YWx1ZUluUHJlZGVjZXNzb3JdLm9wID09IFNldEFyZ3VtZW50ICYm
IHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclByZWRlY2Vzc29yID0gbV9ncmFwaFt2YWx1
ZUluUHJlZGVjZXNzb3JdLnZhcmlhYmxlQWNjZXNzRGF0YSgpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBkYXRhRm9yUHJlZGVjZXNzb3ItPnVuaWZ5KGRhdGFGb3JQaGkpOwotCi0gICAgICAg
ICAgICBOb2RlKiBwaGlOb2RlID0gJm1fZ3JhcGhbZW50cnkubV9waGldOwotI2lmIERGR19FTkFC
TEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAgIHByaW50ZigiICAgICAg
UmVmIGNvdW50IG9mIEAldSA9ICV1LlxuIiwgZW50cnkubV9waGksIHBoaU5vZGUtPnJlZkNvdW50
KCkpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAocGhpTm9kZS0+cmVmQ291bnQoKSkgewotI2lm
IERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAgICAgICBw
cmludGYoIiAgICAgIFJlZmZpbmcgQCV1LlxuIiwgdmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRp
ZgotICAgICAgICAgICAgICAgIG1fZ3JhcGgucmVmKHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwaGlOb2RlLT5jaGlsZDEoKSA9PSBOb05vZGUp
IHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAg
ICAgICAgcHJpbnRmKCIgICAgICBTZXR0aW5nIEAldS0+Y2hpbGQxID0gQCV1LlxuIiwgZW50cnku
bV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBwaGlO
b2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSB2YWx1ZUluUHJlZGVjZXNzb3I7Ci0jaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgICAgIHByaW50
ZigiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5tX3BoaSk7Ci0gICAgICAgICAgICAg
ICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRm
KCIuXG4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKHBoaU5vZGUtPmNoaWxkMigpID09IE5vTm9kZSkgewotI2lmIERG
R19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAgICAgICBwcmlu
dGYoIiAgICAgIFNldHRpbmcgQCV1LT5jaGlsZDIgPSBAJXUuXG4iLCBlbnRyeS5tX3BoaSwgdmFs
dWVJblByZWRlY2Vzc29yKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHBoaU5vZGUtPmNoaWxk
cmVuLmZpeGVkLmNoaWxkMiA9IHZhbHVlSW5QcmVkZWNlc3NvcjsKLSNpZiBERkdfRU5BQkxFKERF
QlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBD
aGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKLSAgICAgICAgICAgICAgICBwaGlOb2Rl
LT5kdW1wQ2hpbGRyZW4oc3Rkb3V0KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIi5cbiIpOwot
I2VuZGlmCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBpZiAocGhpTm9kZS0+Y2hpbGQzKCkgPT0gTm9Ob2RlKSB7Ci0jaWYgREZHX0VOQUJMRShE
RUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAg
U2V0dGluZyBAJXUtPmNoaWxkMyA9IEAldS5cbiIsIGVudHJ5Lm1fcGhpLCB2YWx1ZUluUHJlZGVj
ZXNzb3IpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgcGhpTm9kZS0+Y2hpbGRyZW4uZml4ZWQu
Y2hpbGQzID0gdmFsdWVJblByZWRlY2Vzc29yOwotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIENoaWxkcmVuIG9m
IEAldTogIiwgZW50cnkubV9waGkpOwotICAgICAgICAgICAgICAgIHBoaU5vZGUtPmR1bXBDaGls
ZHJlbihzdGRvdXQpOwotICAgICAgICAgICAgICAgIHByaW50ZigiLlxuIik7Ci0jZW5kaWYKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8oZGF0YUZv
clBoaSkpOwotICAgICAgICAgICAgCi0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9W
RVJCT1NFKQotICAgICAgICAgICAgcHJpbnRmKCIgICAgICBTcGxpdHRpbmcgQCV1LCBjcmVhdGVk
IEAldS5cbiIsIGVudHJ5Lm1fcGhpLCBuZXdQaGkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHBo
aU5vZGUgPSAmbV9ncmFwaFtlbnRyeS5tX3BoaV07IC8vIHJlbG9hZCBhZnRlciB2ZWN0b3IgcmVz
aXplCi0gICAgICAgICAgICBOb2RlJiBuZXdQaGlOb2RlID0gbV9ncmFwaFtuZXdQaGldOwotICAg
ICAgICAgICAgaWYgKHBoaU5vZGUtPnJlZkNvdW50KCkpCi0gICAgICAgICAgICAgICAgbV9ncmFw
aC5yZWYobmV3UGhpKTsKLQotICAgICAgICAgICAgbmV3UGhpTm9kZS5jaGlsZHJlbi5maXhlZC5j
aGlsZDEgPSBwaGlOb2RlLT5jaGlsZDEoKTsKLSAgICAgICAgICAgIG5ld1BoaU5vZGUuY2hpbGRy
ZW4uZml4ZWQuY2hpbGQyID0gcGhpTm9kZS0+Y2hpbGQyKCk7Ci0gICAgICAgICAgICBuZXdQaGlO
b2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IHBoaU5vZGUtPmNoaWxkMygpOwotCi0jaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgcHJpbnRmKCIg
ICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIG5ld1BoaSk7Ci0gICAgICAgICAgICBuZXdQaGlOb2Rl
LmR1bXBDaGlsZHJlbihzdGRvdXQpOwotICAgICAgICAgICAgcHJpbnRmKCIuXG4iKTsKLSNlbmRp
ZgotCi0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSBuZXdQaGk7
Ci0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDIgPSB2YWx1ZUluUHJl
ZGVjZXNzb3I7Ci0gICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDMgPSBO
b05vZGU7Ci0KLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAg
ICAgICAgICBwcmludGYoIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkpOwot
ICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7Ci0gICAgICAgICAgICBw
cmludGYoIi5cbiIpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHZvaWQgQnl0ZUNv
ZGVQYXJzZXI6OmxpbmtCbG9jayhCYXNpY0Jsb2NrKiBibG9jaywgVmVjdG9yPEJsb2NrSW5kZXg+
JiBwb3NzaWJsZVRhcmdldHMpCiB7CiAgICAgQVNTRVJUKGJsb2NrLT5lbmQgIT0gTm9Ob2RlKTsK
QEAgLTI2MDEsMTUgKzI0NjgsMTcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2UoKQogICAg
IAogICAgIG1fY3VycmVudFByb2ZpbGluZ0luZGV4ID0gbV9jdXJyZW50SW5kZXg7CiAgICAgCi0g
ICAgcHJvY2Vzc1BoaVN0YWNrPExvY2FsUGhpU3RhY2s+KCk7CisgICAgLy8gTGluayBHZXRMb2Nh
bCAmIFNldExvY2FsIG5vZGVzLCB0byBlbnN1cmUgbGl2ZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZC4K
KyAgICBtX2dyYXBoLnByb2Nlc3NQaGlTdGFjayhMb2NhbFBoaVN0YWNrKTsKICNpZiBERkdfRU5B
QkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgcHJpbnRmKCJQcm9jZXNzaW5nIGFy
Z3VtZW50IHBoaXMuXG4iKTsKICNlbmRpZgotICAgIHByb2Nlc3NQaGlTdGFjazxBcmd1bWVudFBo
aVN0YWNrPigpOworICAgIG1fZ3JhcGgucHJvY2Vzc1BoaVN0YWNrKEFyZ3VtZW50UGhpU3RhY2sp
OwogICAgIAogICAgIG1fZ3JhcGgubV9wcmVzZXJ2ZWRWYXJzID0gbV9wcmVzZXJ2ZWRWYXJzOwog
ICAgIG1fZ3JhcGgubV9sb2NhbFZhcnMgPSBtX251bUxvY2FsczsKICAgICBtX2dyYXBoLm1fcGFy
YW1ldGVyU2xvdHMgPSBtX3BhcmFtZXRlclNsb3RzOworICAgIG1fZ3JhcGgubV9vcmlnaW5hbFNp
emUgPSBtX2dyYXBoLnNpemUoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCShyZXZpc2lvbiAxMDY3NzEp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xMzAsNiArMTMwLDcgQEAgaW5saW5lIGJvb2wgY2FuQ29tcGlsZU9wY29kZShP
cGNvZGVJRCBvcAogICAgIGNhc2Ugb3Bfam5ncmVhdGVyOgogICAgIGNhc2Ugb3Bfam5ncmVhdGVy
ZXE6CiAgICAgY2FzZSBvcF9sb29wX2hpbnQ6CisgICAgY2FzZSBvcF9sb29wX3ByZWhlYWRlcjoK
ICAgICBjYXNlIG9wX2xvb3BfaWZfbGVzczoKICAgICBjYXNlIG9wX2xvb3BfaWZfbGVzc2VxOgog
ICAgIGNhc2Ugb3BfbG9vcF9pZl9ncmVhdGVyOgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdHcmFwaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdHcmFwaC5jcHAJKHJldmlzaW9uIDEwNjc3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHR3JhcGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjQsNyArMTI0LDcgQEAgdm9p
ZCBHcmFwaDo6ZHVtcChOb2RlSW5kZXggbm9kZUluZGV4LCBDbwogCiAgICAgdW5zaWduZWQgcmVm
Q291bnQgPSBub2RlLnJlZkNvdW50KCk7CiAgICAgYm9vbCBza2lwcGVkID0gIXJlZkNvdW50Owot
ICAgIGJvb2wgbXVzdEdlbmVyYXRlID0gbm9kZS5tdXN0R2VuZXJhdGUoKTsKKyAgICBib29sIG11
c3RHZW5lcmF0ZSA9IHJlZkNvdW50ICYmIG5vZGUubXVzdEdlbmVyYXRlKCk7CiAgICAgaWYgKG11
c3RHZW5lcmF0ZSkgewogICAgICAgICBBU1NFUlQocmVmQ291bnQpOwogICAgICAgICAtLXJlZkNv
dW50OwpAQCAtMjkyLDcgKzI5Miw3IEBAIHZvaWQgR3JhcGg6OmR1bXAoQ29kZUJsb2NrKiBjb2Rl
QmxvY2spCiAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICB9CiAgICAgcHJpbnRmKCJQaGkgTm9k
ZXM6XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBz
aXplKCk7ICsraSkKKyAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkg
PCBtX29yaWdpbmFsU2l6ZTsgKytpKQogICAgICAgICBkdW1wKGksIGNvZGVCbG9jayk7CiB9CiAK
QEAgLTM1NCw2ICszNTQsMTU5IEBAIHZvaWQgR3JhcGg6OnByZWRpY3RBcmd1bWVudFR5cGVzKENv
ZGVCbG8KICAgICB9CiB9CiAKK3ZvaWQgR3JhcGg6OnByb2Nlc3NQaGlTdGFjayhQaGlTdGFja1R5
cGUgc3RhY2tUeXBlLCBCbG9ja0luZGV4IGRlZmluaXRpb25CbG9jaykKK3sKKyAgICBWZWN0b3I8
UGhpU3RhY2tFbnRyeSwgMTY+JiBwaGlTdGFjayA9IChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlT
dGFjaykgPyBtX2FyZ3VtZW50UGhpU3RhY2sgOiBtX2xvY2FsUGhpU3RhY2s7CisKKyAgICB3aGls
ZSAoIXBoaVN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICBQaGlTdGFja0VudHJ5IGVudHJ5ID0g
cGhpU3RhY2subGFzdCgpOworICAgICAgICBwaGlTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgICAg
IAorICAgICAgICBQcmVkZWNlc3Nvckxpc3QmIHByZWRlY2Vzc29ycyA9IGVudHJ5Lm1fYmxvY2st
Pm1fcHJlZGVjZXNzb3JzOworICAgICAgICB1bnNpZ25lZCB2YXJObyA9IGVudHJ5Lm1fdmFyTm87
CisgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclBoaSA9IGF0KGVudHJ5Lm1fcGhp
KS52YXJpYWJsZUFjY2Vzc0RhdGEoKTsKKworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJ
T05fVkVSQk9TRSkKKyAgICAgICAgcHJpbnRmKCIgICBIYW5kbGluZyBwaGkgZW50cnkgZm9yIHZh
ciAldSwgcGhpIEAldS5cbiIsIGVudHJ5Lm1fdmFyTm8sIGVudHJ5Lm1fcGhpKTsKKyNlbmRpZgor
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZGVjZXNzb3JzLnNpemUoKTsgKytp
KSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAg
ICAgcHJpbnRmKCIgICAgIERlYWxpbmcgd2l0aCBwcmVkZWNlc3NvciBibG9jayAldS5cbiIsIHBy
ZWRlY2Vzc29yc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQmFzaWNC
bG9jayogcHJlZGVjZXNzb3JCbG9jayA9IG1fYmxvY2tzW3ByZWRlY2Vzc29yc1tpXV0uZ2V0KCk7
CisKKyAgICAgICAgICAgIE5vZGVJbmRleCYgdmFyID0gKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBo
aVN0YWNrKSA/IHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudCh2YXJO
bykgOiBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdFRhaWwubG9jYWwodmFyTm8pOworICAg
ICAgICAgICAgCisgICAgICAgICAgICBOb2RlSW5kZXggdmFsdWVJblByZWRlY2Vzc29yID0gdmFy
OworICAgICAgICAgICAgLy8gV2Ugb25seSB0YWtlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc3Bl
Y2lmaWVkIGRlZmluaXRpb24gYmxvY2suCisgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkJsb2Nr
ICE9IE5vQmxvY2sgJiYgZGVmaW5pdGlvbkJsb2NrICE9IHByZWRlY2Vzc29yc1tpXQorICAgICAg
ICAgICAgICAgICYmIHZhciAhPSBOb05vZGUgJiYgYXQodmFyKS5vcCA9PSBTZXRMb2NhbCkKKyAg
ICAgICAgICAgICAgICB2YWx1ZUluUHJlZGVjZXNzb3IgPSBOb05vZGU7CisKKyAgICAgICAgICAg
IGlmICh2YWx1ZUluUHJlZGVjZXNzb3IgPT0gTm9Ob2RlKSB7CisjaWYgREZHX0VOQUJMRShERUJV
R19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgRGlk
IG5vdCBmaW5kIG5vZGUsIGFkZGluZyBwaGkuXG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICAg
ICAgaW50IG9wZXJhbmQgPSAoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVu
dFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNfY2FzdDxpbnQ+KHZhck5vKSk7CisgICAgICAgICAg
ICAgICAgbV92YXJpYWJsZUFjY2Vzc0RhdGEuYXBwZW5kKFZhcmlhYmxlQWNjZXNzRGF0YShzdGF0
aWNfY2FzdDxWaXJ0dWFsUmVnaXN0ZXI+KG9wZXJhbmQpKSk7CisgICAgICAgICAgICAgICAgdmFs
dWVJblByZWRlY2Vzc29yID0gKE5vZGVJbmRleClzaXplKCk7CisgICAgICAgICAgICAgICAgYXBw
ZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbygmbV92YXJpYWJsZUFjY2Vzc0RhdGEu
bGFzdCgpKSkpOworICAgICAgICAgICAgICAgIGlmIChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlT
dGFjaykKKyAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JCbG9jay0+dmFyaWFibGVzQXRI
ZWFkLmFyZ3VtZW50KHZhck5vKSA9IHZhbHVlSW5QcmVkZWNlc3NvcjsKKyAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0
SGVhZC5zZXRMb2NhbCh2YXJObywgdmFsdWVJblByZWRlY2Vzc29yKTsKKyAgICAgICAgICAgICAg
ICB2YXIgPSB2YWx1ZUluUHJlZGVjZXNzb3I7CisgICAgICAgICAgICAgICAgcGhpU3RhY2suYXBw
ZW5kKFBoaVN0YWNrRW50cnkocHJlZGVjZXNzb3JCbG9jaywgdmFsdWVJblByZWRlY2Vzc29yLCB2
YXJObykpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLm9w
ID09IEdldExvY2FsKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NF
KQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgRm91bmQgR2V0TG9jYWwgQCV1LlxuIiwg
dmFsdWVJblByZWRlY2Vzc29yKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgLy8gV2Ugd2Fu
dCB0byBlbnN1cmUgdGhhdCB0aGUgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcmUgaWRlbnRpY2FsIGJl
dHdlZW4gdGhlCisgICAgICAgICAgICAgICAgLy8gR2V0TG9jYWwgYW5kIGl0cyBibG9jay1sb2Nh
bCBQaGkuIFN0cmljdGx5IHNwZWFraW5nIHdlIG9ubHkgbmVlZCB0aGUgdHdvCisgICAgICAgICAg
ICAgICAgLy8gdG8gYmUgdW5pZmllZC4gQnV0IGZvciBlZmZpY2llbmN5LCB3ZSB3YW50IHRoZSBj
b2RlIHRoYXQgY3JlYXRlcyBHZXRMb2NhbHMKKyAgICAgICAgICAgICAgICAvLyBhbmQgUGhpcyB0
byB0cnkgdG8gcmV1c2UgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgor
ICAgICAgICAgICAgICAgIEFTU0VSVChhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLnZhcmlhYmxlQWNj
ZXNzRGF0YSgpID09IGF0KGF0KHZhbHVlSW5QcmVkZWNlc3NvcikuY2hpbGQxKCkpLnZhcmlhYmxl
QWNjZXNzRGF0YSgpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YWx1ZUlu
UHJlZGVjZXNzb3IgPSBhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLmNoaWxkMSgpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisg
ICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBGb3VuZCBAJXUuXG4iLCB2YWx1ZUluUHJlZGVj
ZXNzb3IpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlQoYXQodmFs
dWVJblByZWRlY2Vzc29yKS5vcCA9PSBTZXRMb2NhbCB8fCBhdCh2YWx1ZUluUHJlZGVjZXNzb3Ip
Lm9wID09IFBoaSB8fCBhdCh2YWx1ZUluUHJlZGVjZXNzb3IpLm9wID09IEZsdXNoIHx8IChhdCh2
YWx1ZUluUHJlZGVjZXNzb3IpLm9wID09IFNldEFyZ3VtZW50ICYmIHN0YWNrVHlwZSA9PSBBcmd1
bWVudFBoaVN0YWNrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNz
RGF0YSogZGF0YUZvclByZWRlY2Vzc29yID0gYXQodmFsdWVJblByZWRlY2Vzc29yKS52YXJpYWJs
ZUFjY2Vzc0RhdGEoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGF0YUZvclByZWRlY2Vz
c29yLT51bmlmeShkYXRhRm9yUGhpKTsKKworICAgICAgICAgICAgTm9kZSogcGhpTm9kZSA9ICZh
dChlbnRyeS5tX3BoaSk7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NF
KQorICAgICAgICAgICAgcHJpbnRmKCIgICAgICBSZWYgY291bnQgb2YgQCV1ID0gJXUuXG4iLCBl
bnRyeS5tX3BoaSwgcGhpTm9kZS0+cmVmQ291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlm
IChwaGlOb2RlLT5yZWZDb3VudCgpKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElP
Tl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgUmVmZmluZyBAJXUuXG4i
LCB2YWx1ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmVmKHZhbHVl
SW5QcmVkZWNlc3Nvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwaGlOb2Rl
LT5jaGlsZDEoKSA9PSBOb05vZGUpIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9O
X1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBTZXR0aW5nIEAldS0+Y2hp
bGQxID0gQCV1LlxuIiwgZW50cnkubV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7CisjZW5kaWYK
KyAgICAgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEgPSB2YWx1ZUlu
UHJlZGVjZXNzb3I7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQor
ICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5t
X3BoaSk7CisgICAgICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7Cisg
ICAgICAgICAgICAgICAgcHJpbnRmKCIuXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBoaU5vZGUtPmNoaWxkMigp
ID09IE5vTm9kZSkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkK
KyAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIFNldHRpbmcgQCV1LT5jaGlsZDIgPSBAJXUu
XG4iLCBlbnRyeS5tX3BoaSwgdmFsdWVJblByZWRlY2Vzc29yKTsKKyNlbmRpZgorICAgICAgICAg
ICAgICAgIHBoaU5vZGUtPmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IHZhbHVlSW5QcmVkZWNlc3Nv
cjsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAg
ICAgICAgcHJpbnRmKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKKyAg
ICAgICAgICAgICAgICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4oc3Rkb3V0KTsKKyAgICAgICAgICAg
ICAgICBwcmludGYoIi5cbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGhpTm9kZS0+Y2hpbGQzKCkgPT0gTm9Ob2Rl
KSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAg
ICAgICAgIHByaW50ZigiICAgICAgU2V0dGluZyBAJXUtPmNoaWxkMyA9IEAldS5cbiIsIGVudHJ5
Lm1fcGhpLCB2YWx1ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcGhp
Tm9kZS0+Y2hpbGRyZW4uZml4ZWQuY2hpbGQzID0gdmFsdWVJblByZWRlY2Vzc29yOworI2lmIERG
R19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBwcmlu
dGYoIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkpOworICAgICAgICAgICAg
ICAgIHBoaU5vZGUtPmR1bXBDaGlsZHJlbihzdGRvdXQpOworICAgICAgICAgICAgICAgIHByaW50
ZigiLlxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IChOb2RlSW5k
ZXgpc2l6ZSgpOworICAgICAgICAgICAgYXBwZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9w
SW5mbyhkYXRhRm9yUGhpKSkpOworICAgICAgICAgICAgLy8gTm9kZUluZGV4IG5ld1BoaSA9IGFk
ZFRvR3JhcGgoUGhpLCBPcEluZm8oZGF0YUZvclBoaSkpOworICAgICAgICAgICAgCisjaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRmKCIg
ICAgICBTcGxpdHRpbmcgQCV1LCBjcmVhdGVkIEAldS5cbiIsIGVudHJ5Lm1fcGhpLCBuZXdQaGkp
OworI2VuZGlmCisKKyAgICAgICAgICAgIHBoaU5vZGUgPSAmYXQoZW50cnkubV9waGkpOyAvLyBy
ZWxvYWQgYWZ0ZXIgdmVjdG9yIHJlc2l6ZQorICAgICAgICAgICAgTm9kZSYgbmV3UGhpTm9kZSA9
IGF0KG5ld1BoaSk7CisgICAgICAgICAgICBpZiAocGhpTm9kZS0+cmVmQ291bnQoKSkKKyAgICAg
ICAgICAgICAgICByZWYobmV3UGhpKTsKKworICAgICAgICAgICAgbmV3UGhpTm9kZS5jaGlsZHJl
bi5maXhlZC5jaGlsZDEgPSBwaGlOb2RlLT5jaGlsZDEoKTsKKyAgICAgICAgICAgIG5ld1BoaU5v
ZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQyID0gcGhpTm9kZS0+Y2hpbGQyKCk7CisgICAgICAgICAg
ICBuZXdQaGlOb2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMyA9IHBoaU5vZGUtPmNoaWxkMygpOwor
CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAg
cHJpbnRmKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIG5ld1BoaSk7CisgICAgICAgICAgICBu
ZXdQaGlOb2RlLmR1bXBDaGlsZHJlbihzdGRvdXQpOworICAgICAgICAgICAgcHJpbnRmKCIuXG4i
KTsKKyNlbmRpZgorCisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDEg
PSBuZXdQaGk7CisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5jaGlsZDIgPSB2
YWx1ZUluUHJlZGVjZXNzb3I7CisgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5maXhlZC5j
aGlsZDMgPSBOb05vZGU7CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJP
U0UpCisgICAgICAgICAgICBwcmludGYoIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnku
bV9waGkpOworICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKHN0ZG91dCk7CisgICAg
ICAgICAgICBwcmludGYoIi5cbiIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKIH0g
fSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKIAogI2VuZGlmCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdHcmFwaC5oCShyZXZpc2lvbiAxMDY3NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDYgKzYzLDI5IEBAIHN0cnVj
dCBSZXNvbHZlR2xvYmFsRGF0YSB7CiAgICAgdW5zaWduZWQgcmVzb2x2ZUluZm9JbmRleDsKIH07
CiAKK3N0cnVjdCBMb29wUHJlSGVhZGVyIHsKKyAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXg7Cisg
ICAgQmxvY2tJbmRleCBvdXRlckxvb3A7Cit9OworCitlbnVtIFBoaVN0YWNrVHlwZSB7CisgICAg
TG9jYWxQaGlTdGFjaywKKyAgICBBcmd1bWVudFBoaVN0YWNrCit9OworCitzdHJ1Y3QgUGhpU3Rh
Y2tFbnRyeSB7CisgICAgUGhpU3RhY2tFbnRyeShCYXNpY0Jsb2NrKiBibG9jaywgTm9kZUluZGV4
IHBoaSwgdW5zaWduZWQgdmFyTm8pCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICAgICAg
LCBtX3BoaShwaGkpCisgICAgICAgICwgbV92YXJObyh2YXJObykKKyAgICB7CisgICAgfQorCisg
ICAgQmFzaWNCbG9jayogbV9ibG9jazsKKyAgICBOb2RlSW5kZXggbV9waGk7CisgICAgdW5zaWdu
ZWQgbV92YXJObzsKK307CisKIC8vIAogLy8gPT09IEdyYXBoID09PQogLy8KQEAgLTI1NCw3ICsy
NzcsMTAgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICB2b2lkIHBy
b2Nlc3NQaGlTdGFjayhQaGlTdGFja1R5cGUsIEJsb2NrSW5kZXggZGVmaW5pdGlvbkJsb2NrID0g
Tm9CbG9jayk7CisKICAgICBWZWN0b3I8IE93blB0cjxCYXNpY0Jsb2NrPiAsIDg+IG1fYmxvY2tz
OworICAgIFZlY3RvcjxMb29wUHJlSGVhZGVyLCA4PiBtX2xvb3BQcmVIZWFkZXJzOwogICAgIFZl
Y3RvcjxOb2RlSW5kZXgsIDE2PiBtX3ZhckFyZ0NoaWxkcmVuOwogICAgIFZlY3RvcjxTdG9yYWdl
QWNjZXNzRGF0YT4gbV9zdG9yYWdlQWNjZXNzRGF0YTsKICAgICBWZWN0b3I8UmVzb2x2ZUdsb2Jh
bERhdGE+IG1fcmVzb2x2ZUdsb2JhbERhdGE7CkBAIC0yNjIsOSArMjg4LDEyIEBAIHB1YmxpYzoK
ICAgICBTZWdtZW50ZWRWZWN0b3I8VmFyaWFibGVBY2Nlc3NEYXRhLCAxNj4gbV92YXJpYWJsZUFj
Y2Vzc0RhdGE7CiAgICAgU2VnbWVudGVkVmVjdG9yPFN0cnVjdHVyZVNldCwgMTY+IG1fc3RydWN0
dXJlU2V0OwogICAgIFNlZ21lbnRlZFZlY3RvcjxTdHJ1Y3R1cmVUcmFuc2l0aW9uRGF0YSwgOD4g
bV9zdHJ1Y3R1cmVUcmFuc2l0aW9uRGF0YTsKKyAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+
IG1fYXJndW1lbnRQaGlTdGFjazsKKyAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+IG1fbG9j
YWxQaGlTdGFjazsKICAgICBCaXRWZWN0b3IgbV9wcmVzZXJ2ZWRWYXJzOwogICAgIHVuc2lnbmVk
IG1fbG9jYWxWYXJzOwogICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyU2xvdHM7CisgICAgdW5zaWdu
ZWQgbV9vcmlnaW5hbFNpemU7IC8vIFRoZSBncmFwaCBzaXplIGJlZm9yZSB3ZSBkbyBvcHRpbWl6
YXRpb25zIHdoaWNoIHdpbGwgZXhwYW5kIHRoZSBncmFwaC4KIHByaXZhdGU6CiAgICAgCiAgICAg
Ym9vbCBhZGRJbW1lZGlhdGVTaG91bGRTcGVjdWxhdGVJbnRlZ2VyKENvZGVCbG9jayogY29kZUJs
b2NrLCBOb2RlJiBhZGQsIE5vZGUmIHZhcmlhYmxlLCBOb2RlJiBpbW1lZGlhdGUpCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiAxMDY3
NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTMyMSwxNCArMzIxLDE0IEBAIHB1YmxpYzoKICAgICAgICAgLy8gdmFsdWUg
b2YgKE5vbmUsIFtdKS4gQnV0IHRoZSBvbGQgSklUIG1heSBzdGFzaCBzb21lIHZhbHVlcyB0aGVy
ZS4gU28gd2UgcmVhbGx5CiAgICAgICAgIC8vIG5lZWQgKFRvcCwgVE9QKS4KICAgICAgICAgZm9y
IChzaXplX3QgYXJndW1lbnQgPSAwOyBhcmd1bWVudCA8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRI
ZWFkLm51bWJlck9mQXJndW1lbnRzKCk7ICsrYXJndW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChi
YXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5hcmd1bWVudChhcmd1bWVudCkgPT0gTm9Ob2RlKQor
ICAgICAgICAgICAgaWYgKCFiYXNpY0Jsb2NrLmNmYUhhc1Zpc2l0ZWQgfHwgYmFzaWNCbG9jay52
YXJpYWJsZXNBdEhlYWQuYXJndW1lbnQoYXJndW1lbnQpID09IE5vTm9kZSkKICAgICAgICAgICAg
ICAgICBlbnRyeS0+bV9leHBlY3RlZFZhbHVlcy5hcmd1bWVudChhcmd1bWVudCkubWFrZVRvcCgp
OwogICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGxvY2FsID0gMDsgbG9jYWwgPCBiYXNp
Y0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5udW1iZXJPZkxvY2FscygpOyArK2xvY2FsKSB7CiAgICAg
ICAgICAgICBOb2RlSW5kZXggbm9kZUluZGV4ID0gYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQu
bG9jYWwobG9jYWwpOwotICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSBOb05vZGUpCisgICAg
ICAgICAgICBpZiAoIWJhc2ljQmxvY2suY2ZhSGFzVmlzaXRlZCB8fCBub2RlSW5kZXggPT0gTm9O
b2RlKQogICAgICAgICAgICAgICAgIGVudHJ5LT5tX2V4cGVjdGVkVmFsdWVzLmxvY2FsKGxvY2Fs
KS5tYWtlVG9wKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChtX2dyYXBoW25vZGVJbmRleF0udmFy
aWFibGVBY2Nlc3NEYXRhKCktPnNob3VsZFVzZURvdWJsZUZvcm1hdCgpKQorICAgICAgICAgICAg
aWYgKG5vZGVJbmRleCAhPSBOb05vZGUgJiYgbV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNj
ZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkKICAgICAgICAgICAgICAgICBlbnRy
eS0+bV9sb2NhbHNGb3JjZWREb3VibGUuc2V0KGxvY2FsKTsKICAgICAgICAgfQogI2Vsc2UKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCShyZXZpc2lvbiAxMDY3NzEpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDk3
LDYgKzQ5NywxMiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIHJldHVybiB2YXJpYWJsZUFjY2Vz
c0RhdGEoKS0+bG9jYWwoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldFZhcmlhYmxlQWNjZXNzRGF0
YSh2b2lkKiBkYXRhKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGhhc1ZhcmlhYmxlQWNjZXNzRGF0
YSgpKTsKKyAgICAgICAgbV9vcEluZm8gPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZGF0
YSk7CisgICAgfQorCiAgICAgYm9vbCBoYXNJZGVudGlmaWVyKCkKICAgICB7CiAgICAgICAgIHN3
aXRjaCAob3ApIHsKQEAgLTEwMzEsNyArMTAzNyw3IEBAIHN0cnVjdCBOb2RlIHsKICAgICB7CiAg
ICAgICAgIHJldHVybiBub2RlQ2FuU3BlY3VsYXRlSW50ZWdlcihhcml0aE5vZGVGbGFncygpKTsK
ICAgICB9Ci0gICAgCisKICAgICB2b2lkIGR1bXBDaGlsZHJlbihGSUxFKiBvdXQpCiAgICAgewog
ICAgICAgICBpZiAoY2hpbGQxKCkgPT0gTm9Ob2RlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdQcm9wYWdhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCShyZXZpc2lvbiAxMDY3NzEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03
NSw2ICs3NSwxMyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZ3JhcGguZHVtcChtX2NvZGVCbG9jayk7
CiAjZW5kaWYKIAorICAgICAgICBsb29wSW52YXJpYW50Q29kZU1vdGlvbigpOworCisjaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICBwcmludGYoIkdyYXBo
IGFmdGVyIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uOlxuIik7CisgICAgICAgIG1fZ3JhcGgu
ZHVtcChtX2NvZGVCbG9jayk7CisjZW5kaWYKKwogICAgICAgICBhbGxvY2F0ZVZpcnR1YWxSZWdp
c3RlcnMoKTsKIAogI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKQEAg
LTI4OSw3ICsyOTYsNyBAQCBwcml2YXRlOgogICAgIAogICAgIHZvaWQgcHJvcGFnYXRlTm9kZVBy
ZWRpY3Rpb25zKE5vZGUmIG5vZGUpCiAgICAgewotICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2Vu
ZXJhdGUoKSkKKyAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkgJiYgbm9kZS5vcCAh
PSBTZXRMb2NhbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAgICAgIE5vZGVU
eXBlIG9wID0gbm9kZS5vcDsKQEAgLTExMjMsNiArMTEzMCwxMyBAQCBwcml2YXRlOgogICAgICAg
ICByZXR1cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihy
aWdodCk7CiAgICAgfQogICAgIAorICAgIGJvb2wgY29tcGFyZUVxSXNQdXJlKE5vZGUmIG5vZGUp
CisgICAgeworICAgICAgICByZXR1cm4gaXNQcmVkaWN0ZWROdW1lcmljYWwobm9kZSkKKyAgICAg
ICAgICAgIHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KG1fZ3JhcGhbbm9kZS5j
aGlsZDEoKV0sIG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0pCisgICAgICAgICAgICB8fCBOb2RlOjpz
aG91bGRTcGVjdWxhdGVBcnJheShtX2dyYXBoW25vZGUuY2hpbGQxKCldLCBtX2dyYXBoW25vZGUu
Y2hpbGQyKCldKTsKKyAgICB9CisKICAgICBib29sIGxvZ2ljYWxOb3RJc1B1cmUoTm9kZSYgbm9k
ZSkKICAgICB7CiAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1fZ3JhcGhbbm9k
ZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpOwpAQCAtMTE1MCw4ICsxMTY0LDkgQEAgcHJpdmF0ZToK
ICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVy
OgogICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6Ci0gICAgICAgIGNhc2UgQ29tcGFyZUVx
OgogICAgICAgICAgICAgcmV0dXJuICFpc1ByZWRpY3RlZE51bWVyaWNhbChub2RlKTsKKyAgICAg
ICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICByZXR1cm4gIWNvbXBhcmVFcUlzUHVyZShu
b2RlKTsKICAgICAgICAgY2FzZSBMb2dpY2FsTm90OgogICAgICAgICAgICAgcmV0dXJuICFsb2dp
Y2FsTm90SXNQdXJlKG5vZGUpOwogICAgICAgICBjYXNlIEdldEJ5VmFsOgpAQCAtMTQ0NSw3ICsx
NDYwLDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBlcmZvcm1TdWJzdGl0dXRpb24oTm9kZUluZGV4
JiBjaGlsZCwgYm9vbCBhZGRSZWYgPSB0cnVlKQogICAgIHsKICAgICAgICAgLy8gQ2hlY2sgaWYg
dGhpcyBvcGVyYW5kIGlzIGFjdHVhbGx5IHVudXNlZC4KLSAgICAgICAgaWYgKGNoaWxkID09IE5v
Tm9kZSkKKyAgICAgICAgaWYgKGNoaWxkID09IE5vTm9kZSB8fCBjaGlsZCA+PSBtX3JlcGxhY2Vt
ZW50cy5zaXplKCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIAogICAgICAgICAvLyBD
aGVjayBpZiB0aGVyZSBpcyBhbnkgcmVwbGFjZW1lbnQuCkBAIC0xNDU3LDEwICsxNDcyLDEwIEBA
IHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICAvLyBUaGVyZSBpcyBkZWZpbml0ZWx5IGEgcmVw
bGFjZW1lbnQuIEFzc2VydCB0aGF0IHRoZSByZXBsYWNlbWVudCBkb2VzIG5vdAogICAgICAgICAv
LyBoYXZlIGEgcmVwbGFjZW1lbnQuCi0gICAgICAgIEFTU0VSVChtX3JlcGxhY2VtZW50c1tjaGls
ZF0gPT0gTm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkID49IG1fcmVwbGFjZW1lbnRzLnNp
emUoKSB8fCBtX3JlcGxhY2VtZW50c1tjaGlsZF0gPT0gTm9Ob2RlKTsKICAgICAgICAgCiAgICAg
ICAgIGlmIChhZGRSZWYpCi0gICAgICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAg
ICAgICAgIG1fZ3JhcGgucmVmKGNoaWxkKTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBzZXRSZXBs
YWNlbWVudChOb2RlSW5kZXggcmVwbGFjZW1lbnQpCkBAIC0xNjYxLDYgKzE2NzYsNjg4IEBAIHBy
aXZhdGU6CiAjZW5kaWYKICAgICAgICAgZm9yICh1bnNpZ25lZCBibG9jayA9IDA7IGJsb2NrIDwg
bV9ncmFwaC5tX2Jsb2Nrcy5zaXplKCk7ICsrYmxvY2spCiAgICAgICAgICAgICBwZXJmb3JtQmxv
Y2tDU0UoKm1fZ3JhcGgubV9ibG9ja3NbYmxvY2tdKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbV9yZXBsYWNlbWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX3Jl
cGxhY2VtZW50c1tpXSA9IE5vTm9kZTsKKyAgICB9CisgICAgCisjZGVmaW5lIE1BWF9IT0lTVEVE
X0xPT1BfSU5WQVJJQU5UUyAyNTYKKworICAgIHN0cnVjdCBMb29wU2lkZUVmZmVjdHMgeworICAg
ICAgICBlbnVtIENsb2JiZXJLaW5kIHsKKyAgICAgICAgICAgIENsb2JiZXJHZXRHbG9iYWxWYXIs
CisgICAgICAgICAgICBDbG9iYmVyR2V0QnlWYWwsCisgICAgICAgICAgICBDbG9iYmVyQ2hlY2tT
dHJ1Y3R1cmUsCisgICAgICAgICAgICBDbG9iYmVyR2V0QnlPZmZzZXQsCisgICAgICAgICAgICBD
bG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlLAorICAgICAgICAgICAgQ2xvYmJlckdldEluZGV4ZWRQ
cm9wZXJ0eVN0b3JhZ2UsCisgICAgICAgICAgICBDbG9iYmVyR2V0QXJyYXlMZW5ndGgsCisgICAg
ICAgICAgICBDbG9iYmVyR2V0U3RyaW5nTGVuZ3RoCisgICAgICAgIH07CisKKyAgICAgICAgTG9v
cFNpZGVFZmZlY3RzKEJsb2NrSW5kZXggcHJlSGVhZGVyKQorICAgICAgICAgICAgOiBwcmVIZWFk
ZXJJbmRleChwcmVIZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wg
Y2FuSG9pc3RHZXRHbG9iYWxWYXIoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRH
bG9iYWxWYXIpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRCeVZhbCgpIHsgcmV0dXJuICFj
bG9iYmVycy5nZXQoQ2xvYmJlckdldEJ5VmFsKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0Q2hl
Y2tTdHJ1Y3R1cmUoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJDaGVja1N0cnVjdHVy
ZSk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEJ5T2Zmc2V0KCkgeyByZXR1cm4gIWNsb2Ji
ZXJzLmdldChDbG9iYmVyR2V0QnlPZmZzZXQpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRQ
cm9wZXJ0eVN0b3JhZ2UoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRQcm9wZXJ0
eVN0b3JhZ2UpOyB9CisgICAgICAgIGJvb2wgY2FuSG9pc3RHZXRJbmRleGVkUHJvcGVydHlTdG9y
YWdlKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3Rv
cmFnZSk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdEdldEFycmF5TGVuZ3RoKCkgeyByZXR1cm4g
IWNsb2JiZXJzLmdldChDbG9iYmVyR2V0QXJyYXlMZW5ndGgpOyB9CisgICAgICAgIGJvb2wgY2Fu
SG9pc3RHZXRTdHJpbmdMZW5ndGgoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0KENsb2JiZXJHZXRT
dHJpbmdMZW5ndGgpOyB9CisKKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0R2xvYmFsVmFyKCkgeyBj
bG9iYmVycy5zZXQoQ2xvYmJlckdldEdsb2JhbFZhcik7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVy
R2V0QnlWYWwoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0QnlWYWwpOyB9CisgICAgICAgIHZv
aWQgY2xvYmJlckNoZWNrU3RydWN0dXJlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckNoZWNrU3Ry
dWN0dXJlKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJHZXRCeU9mZnNldCgpIHsgY2xvYmJlcnMu
c2V0KENsb2JiZXJHZXRCeU9mZnNldCk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0UHJvcGVy
dHlTdG9yYWdlKCkgeyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSk7IH0K
KyAgICAgICAgdm9pZCBjbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpIHsgY2xvYmJl
cnMuc2V0KENsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKTsgfQorICAgICAgICB2b2lk
IGNsb2JiZXJHZXRBcnJheUxlbmd0aCgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJHZXRBcnJheUxl
bmd0aCk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0U3RyaW5nTGVuZ3RoKCkgeyBjbG9iYmVy
cy5zZXQoQ2xvYmJlckdldFN0cmluZ0xlbmd0aCk7IH0KKworICAgICAgICBWZWN0b3I8aW50LCA4
PiBhY2Nlc3NlZExvY2FsczsKKyAgICAgICAgVmVjdG9yPGludCwgOD4gcG9sbHV0ZWRMb2NhbHM7
CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9sbHV0ZWRHbG9iYWxzOworICAgICAgICBW
ZWN0b3I8Tm9kZUluZGV4LCA0PiBub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXM7CisgICAgICAg
IFZlY3Rvcjx1bnNpZ25lZCwgND4gcG9sbHV0ZWRJZGVudGlmaWVyczsKKyAgICAgICAgQml0VmVj
dG9yIGNsb2JiZXJzOworICAgICAgICBCbG9ja0luZGV4IHByZUhlYWRlckluZGV4OworICAgIH07
CisKKyAgICB2b2lkIGFuYWx5emVMb29wU2lkZUVmZmVjdHMoTm9kZUluZGV4IGxvb3BCZWdpbiwg
Tm9kZUluZGV4IGxvb3BFbmQsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAg
ICAgICBmb3IgKE5vZGVJbmRleCBpbmRleCA9IGxvb3BCZWdpbjsgaW5kZXggPCBsb29wRW5kOyBp
bmRleCsrKSB7CisgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CisKKyAg
ICAgICAgICAgIGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKKyAgICAgICAgICAgIGNh
c2UgUHV0QnlWYWw6CisgICAgICAgICAgICBjYXNlIFB1dEJ5VmFsQWxpYXM6CisgICAgICAgICAg
ICAgICAgLy8gSWYgUHV0QnlWYWwgc3BlY3VsYXRlcyB0aGF0IGl0J3MgYWNjZXNzaW5nIGFuIGFy
cmF5IHdpdGggYW4KKyAgICAgICAgICAgICAgICAvLyBpbnRlZ2VyIGluZGV4LCB0aGVuIGl0J3Mg
aW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1c2UgYSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAv
LyBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKCFieVZhbElzUHVyZShub2RlKSkgeworICAg
ICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5T2Zmc2V0KCk7CisgICAgICAgICAg
ICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gUHV0QnlWYWxBbGlhcyBjYW4ndCBjaGFuZ2UgdGhlIGluZGV4ZWQgc3Rv
cmFnZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IFB1dEJ5VmFs
KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEluZGV4ZWRQcm9w
ZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUub3AgPT0gUHV0
QnlWYWwgJiYgIWlzRml4ZWRJbmRleGVkU3RvcmFnZU9iamVjdFByZWRpY3Rpb24obV9ncmFwaFtu
b2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCkpKQorICAgICAgICAgICAgICAgICAgICBsb29wSW5m
by5jbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgIC8v
IFdlIG11c3QgYXNzdW1lIHRoYXQgdGhlIFB1dEJ5VmFsIHdpbGwgY2xvYmJlciB0aGUgbG9jYXRp
b24gd2UncmUgZ2V0dGluZyBmcm9tLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4g
ZG8gYmV0dGVyOyBpZiB3ZSBrbm93IHRoYXQgdGhlIFB1dEJ5VmFsIGlzIGFjY2Vzc2luZyBhbiBh
cnJheSBvZiBhCisgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgR2V0
QnlWYWwsIHRoZW4gd2Uga25vdyB0aGF0IHRoZXkgd29uJ3QgY2xvYmJlciBlYWNoIG90aGVyLgor
ICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRTdHJ1Y3R1cmU6CisgICAgICAgICAgICAg
ICAgLy8gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBvciBwdXR0aW5nIHRvIHRoZSBzdG9yYWdlIGNh
bm5vdAorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgcHJvcGVydHkgc3RvcmFnZSBwb2lu
dGVyLgorICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIHRoZSBzdHJ1Y3R1cmUgY2Fubm90IGNo
YW5nZSB0aGUgb3V0Y29tZSBvZiBhIHByb3BlcnR5IGdldC4KKyAgICAgICAgICAgICAgICBsb29w
SW5mby5ub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXMuYXBwZW5kKG5vZGUuY2hpbGQxKCkpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRCeU9mZnNldDoKKyAg
ICAgICAgICAgICAgICAvLyBTZXR0aW5nIGEgcHJvcGVydHkgY2Fubm90IGNoYW5nZSB0aGUgc3Ry
dWN0dXJlLgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLnBvbGx1dGVkSWRlbnRpZmllcnMuYXBw
ZW5kKG1fZ3JhcGgubV9zdG9yYWdlQWNjZXNzRGF0YVtub2RlLnN0b3JhZ2VBY2Nlc3NEYXRhSW5k
ZXgoKV0uaWRlbnRpZmllck51bWJlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIEFycmF5UG9wOgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRC
eVZhbCgpOworICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaC4KKyAgICAgICAgICAgIGNh
c2UgQXJyYXlQdXNoOgorICAgICAgICAgICAgICAgIC8vIEEgcHVzaCBjYW5ub3QgYWZmZWN0IHBy
ZXZpb3VzbHkgZXhpc3RpbmcgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAgICAgICAgICAg
IGxvb3BJbmZvLmNsb2JiZXJHZXRBcnJheUxlbmd0aCgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBQdXRHbG9iYWxWYXI6CisgICAgICAgICAgICAgICAgbG9vcElu
Zm8ucG9sbHV0ZWRHbG9iYWxzLmFwcGVuZChub2RlLnZhck51bWJlcigpKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2V0TG9jYWw6CisgICAgICAgICAgICBjYXNl
IEZsdXNoOgorICAgICAgICAgICAgICAgIGxvb3BJbmZvLnBvbGx1dGVkTG9jYWxzLmFwcGVuZChu
b2RlLmxvY2FsKCkpOworICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaC4KKyAgICAgICAg
ICAgIGNhc2UgR2V0TG9jYWw6CisgICAgICAgICAgICAgICAgbG9vcEluZm8uYWNjZXNzZWRMb2Nh
bHMuYXBwZW5kKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChjbG9iYmVyc1dvcmxkKGluZGV4KSkg
eworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUoKTsK
KyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5T2Zmc2V0KCk7CisgICAg
ICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAg
ICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3Jh
Z2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5VmFsKCk7Cisg
ICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRBcnJheUxlbmd0aCgpOworICAg
ICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0U3RyaW5nTGVuZ3RoKCk7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IENhbGwgfHwgbm9kZS5vcCA9PSBDb25zdHJ1
Y3QpCisgICAgICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0R2xvYmFsVmFy
KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0hvaXN0Q2FuZGlkYXRlKE5vZGUm
IG5vZGUsIExvb3BTaWRlRWZmZWN0cyYgbG9vcEluZm8pCisgICAgeworICAgICAgICBib29sIGlz
Q2FuZGlkYXRlID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CisKKyAgICAg
ICAgY2FzZSBHZXRDYWxsZWU6CisgICAgICAgIGNhc2UgQ2hlY2tGdW5jdGlvbjoKKyAgICAgICAg
Y2FzZSBTdHJpbmdDaGFyQ29kZUF0OgorICAgICAgICBjYXNlIFN0cmluZ0NoYXJBdDoKKyAgICAg
ICAgY2FzZSBDaGVja0hhc0luc3RhbmNlOgorICAgICAgICBjYXNlIEluc3RhbmNlT2Y6CisgICAg
ICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgorICAgICAgICBjYXNlIEJpdEFuZDoKKyAgICAgICAg
Y2FzZSBCaXRPcjoKKyAgICAgICAgY2FzZSBCaXRYb3I6CisgICAgICAgIGNhc2UgQml0TFNoaWZ0
OgorICAgICAgICBjYXNlIEJpdFJTaGlmdDoKKyAgICAgICAgY2FzZSBCaXRVUlNoaWZ0OgorICAg
ICAgICBjYXNlIFZhbHVlVG9JbnQzMjoKKyAgICAgICAgY2FzZSBVSW50MzJUb051bWJlcjoKKyAg
ICAgICAgY2FzZSBBcml0aEFkZDoKKyAgICAgICAgY2FzZSBBcml0aFN1YjoKKyAgICAgICAgY2Fz
ZSBBcml0aE11bDoKKyAgICAgICAgY2FzZSBBcml0aE1vZDoKKyAgICAgICAgY2FzZSBBcml0aERp
djoKKyAgICAgICAgY2FzZSBBcml0aEFiczoKKyAgICAgICAgY2FzZSBBcml0aE1pbjoKKyAgICAg
ICAgY2FzZSBBcml0aE1heDoKKyAgICAgICAgY2FzZSBBcml0aFNxcnQ6CisgICAgICAgIGNhc2Ug
VmFsdWVUb051bWJlcjoKKyAgICAgICAgY2FzZSBWYWx1ZVRvRG91YmxlOgorICAgICAgICBjYXNl
IEpTQ29uc3RhbnQ6CisgICAgICAgIGNhc2UgV2Vha0pTQ29uc3RhbnQ6CisgICAgICAgICAgICBp
c0NhbmRpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1
ZUFkZDoKKyAgICAgICAgY2FzZSBDb21wYXJlTGVzczoKKyAgICAgICAgY2FzZSBDb21wYXJlTGVz
c0VxOgorICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICBjYXNlIENvbXBhcmVH
cmVhdGVyRXE6CisgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgaXNDYW5kaWRh
dGUgPSBpc1ByZWRpY3RlZE51bWVyaWNhbChub2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIExvZ2ljYWxOb3Q6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvZ2ljYWxO
b3RJc1B1cmUobm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDaGVja1N0
cnVjdHVyZToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9pc3RDaGVj
a1N0cnVjdHVyZSgpICYmICFsb29wSW5mby5ub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXMuY29u
dGFpbnMobm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBH
ZXRCeVZhbDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gYnlWYWxJc1B1cmUobm9kZSkgJiYg
bG9vcEluZm8uY2FuSG9pc3RHZXRCeVZhbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgR2V0UHJvcGVydHlTdG9yYWdlOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29w
SW5mby5jYW5Ib2lzdEdldFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZToKKyAgICAgICAgICAgIGlzQ2Fu
ZGlkYXRlID0gbG9vcEluZm8uY2FuSG9pc3RHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRCeU9mZnNldDoKKyAgICAgICAgICAg
IGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2FuSG9pc3RHZXRCeU9mZnNldCgpICYmICFsb29wSW5m
by5wb2xsdXRlZElkZW50aWZpZXJzLmNvbnRhaW5zKG1fZ3JhcGgubV9zdG9yYWdlQWNjZXNzRGF0
YVtub2RlLnN0b3JhZ2VBY2Nlc3NEYXRhSW5kZXgoKV0uaWRlbnRpZmllck51bWJlcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHZXRBcnJheUxlbmd0aDoKKyAgICAgICAgY2Fz
ZSBHZXRCeXRlQXJyYXlMZW5ndGg6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZv
LmNhbkhvaXN0R2V0QXJyYXlMZW5ndGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEdldFN0cmluZ0xlbmd0aDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8u
Y2FuSG9pc3RHZXRTdHJpbmdMZW5ndGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEdldEdsb2JhbFZhcjoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcEluZm8uY2Fu
SG9pc3RHZXRHbG9iYWxWYXIoKSAmJiAhbG9vcEluZm8ucG9sbHV0ZWRHbG9iYWxzLmNvbnRhaW5z
KG5vZGUudmFyTnVtYmVyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0
TG9jYWw6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9ICFsb29wSW5mby5wb2xsdXRlZExvY2Fs
cy5jb250YWlucyhub2RlLmxvY2FsKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8v
IERhbmdlcm91cyEgUGF5IG1vcmUgYXR0ZW50aW9uIHBsZWFzZS4KKyAgICAgICAgY2FzZSBTZXRM
b2NhbDoKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gIWxvb3BJbmZvLmFjY2Vzc2VkTG9jYWxz
LmNvbnRhaW5zKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlz
Q2FuZGlkYXRlOworICAgIH0KKworICAgIGJvb2wgbm9kZUNhbkJlSG9pc3RlZChOb2RlJiBub2Rl
LCBCYXNpY0Jsb2NrJiB0YXJnZXRCbG9jaywgVmVjdG9yPE5vZGVJbmRleCwgMz4mIGhvaXN0ZWRD
aGlsZHJlbikKKyAgICB7CisgICAgICAgIGJvb2wgY2FuSG9pc3QgPSB0cnVlOworCisgICAgICAg
IGlmIChub2RlLm9wICYgTm9kZUhhc1ZhckFyZ3MpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWdu
ZWQgY2hpbGRJZHggPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGRJZHggPCBub2RlLmZpcnN0Q2hp
bGQoKSArIG5vZGUubnVtQ2hpbGRyZW4oKTsgY2hpbGRJZHgrKykgeworICAgICAgICAgICAgICAg
IE5vZGVJbmRleCBjaGlsZCA9IG1fZ3JhcGgubV92YXJBcmdDaGlsZHJlbltjaGlsZElkeF07Cisg
ICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgICAg
ICBOb2RlSW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZF07CisgICAgICAg
ICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBs
YWNlbWVudCA8IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvaXN0
ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5vZGVJbmRleCBj
aGlsZDEgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMTsKKyAgICAgICAgICAgIE5vZGVJbmRl
eCBjaGlsZDIgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMjsKKyAgICAgICAgICAgIE5vZGVJ
bmRleCBjaGlsZDMgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxkMzsKKworICAgICAgICAgICAg
aWYgKGNoaWxkMSAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFj
ZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDFdOworICAgICAgICAgICAgICAgIGlmIChyZXBs
YWNlbWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2Nr
LmVuZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZDEp
OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBm
YWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlKSB7
CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNb
Y2hpbGQyXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFyZ2V0QmxvY2su
YmVnaW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAgICAgICAgICAg
ICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQyKTsKKyAgICAgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGVJ
bmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkM107CisgICAgICAgICAgICAg
ICAgaWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwg
dGFyZ2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW4uYXBw
ZW5kKGNoaWxkMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBj
YW5Ib2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIGNhbkhvaXN0OworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUhvaXN0KE5vZGVJbmRleCBp
bmRleCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVuc2lnbmVkJiBob2lzdGVkKQorICAgIHsK
KyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOworCisgICAgICAgIGlmICghaG9p
c3RlZCkKKyAgICAgICAgICAgIHRhcmdldEJsb2NrLmJlZ2luID0gbV9ncmFwaC5zaXplKCk7CisK
KyAgICAgICAgbV9ncmFwaC5hcHBlbmQobm9kZSk7CisgICAgICAgIE5vZGUmIHJlcGxhY2VtZW50
ID0gbV9ncmFwaC5sYXN0KCk7CisgICAgICAgIHJlcGxhY2VtZW50LnNldFJlZkNvdW50KCFub2Rl
Lmhhc1Jlc3VsdCgpICYmIChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkgPyAxIDogMCk7Cisg
ICAgICAgIC8vIE9ubHkgcGVyZm9ybSBjaGlsZHJlbiBzdWJzdGl0dXRpb24gZm9yIHRoZSByZXBs
YWNlbWVudCBub2RlLgorICAgICAgICBpZiAocmVwbGFjZW1lbnQub3AgJiBOb2RlSGFzVmFyQXJn
cykgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IHJlcGxhY2VtZW50LmZp
cnN0Q2hpbGQoKTsgY2hpbGRJZHggPCByZXBsYWNlbWVudC5maXJzdENoaWxkKCkgKyByZXBsYWNl
bWVudC5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAgICAgICAgICAgICAgIHBlcmZvcm1T
dWJzdGl0dXRpb24obV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XSwgcmVwbGFjZW1l
bnQucmVmQ291bnQoKSk7IC8vIERvbid0IHJlZmVyZW5jZSB0aGUgbmV3IGNoaWxkIGhlcmUuCisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2Vt
ZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMSwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAg
ICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNo
aWxkMiwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3Rp
dHV0aW9uKHJlcGxhY2VtZW50LmNoaWxkcmVuLmZpeGVkLmNoaWxkMywgcmVwbGFjZW1lbnQucmVm
Q291bnQoKSk7CisgICAgICAgIH0KKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZF
UkJPU0UpCisgICAgICAgIHByaW50ZigiICAgUmVwbGFjaW5nIEAldSAtPiBAJXp1IiwgaW5kZXgs
IG1fZ3JhcGguc2l6ZSgpIC0gMSk7CisjZW5kaWYKKyAgICAgICAgbV9yZXBsYWNlbWVudHNbaW5k
ZXhdID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICBOb2RlJiBuZXdOb2RlID0gbV9ncmFw
aFtpbmRleF07IC8vIFRoaXMgY2FuIGRpZmZlciBmcm9tICJub2RlIiBiZWNhdXNlIG1fZ3JhcGgg
aXMgZXhwYW5kZWQKKyAgICAgICAgbmV3Tm9kZS5zZXRSZWZDb3VudCgwKTsKKyAgICAgICAgKyto
b2lzdGVkOworICAgICAgICB0YXJnZXRCbG9jay5lbmQgPSBtX2dyYXBoLnNpemUoKTsKKyAgICB9
CisKKyAgICB2b2lkIGhvaXN0R2V0TG9jYWwoTm9kZUluZGV4IGluZGV4LCBCYXNpY0Jsb2NrJiB0
YXJnZXRCbG9jaywgdW5zaWduZWQmIGhvaXN0ZWQpCisgICAgeworICAgICAgICBOb2RlJiBub2Rl
ID0gbV9ncmFwaFtpbmRleF07CisgICAgICAgIEFTU0VSVChub2RlLm9wID09IEdldExvY2FsKTsK
KworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgcHJp
bnRmKCIgICAlcyBAJXU6ICIsIEdyYXBoOjpvcE5hbWUobV9ncmFwaFtpbmRleF0ub3ApLCBpbmRl
eCk7CisjZW5kaWYKKworICAgICAgICBpbnQgb3BlcmFuZCA9IG5vZGUubG9jYWwoKTsKKyAgICAg
ICAgTm9kZUluZGV4IGxhc3REZWZpbmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgaWYgKG9wZXJh
bmRJc0FyZ3VtZW50KG9wZXJhbmQpKQorICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gdGFy
Z2V0QmxvY2sudmFyaWFibGVzQXRUYWlsLmFyZ3VtZW50KG9wZXJhbmRUb0FyZ3VtZW50KG9wZXJh
bmQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFzdERlZmluZUluZGV4ID0gdGFyZ2V0
QmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQpOworCisgICAgICAgIEFTU0VSVChs
YXN0RGVmaW5lSW5kZXggIT0gTm9Ob2RlKTsKKyAgICAgICAgTm9kZSYgbGFzdERlZmluZSA9IG1f
Z3JhcGhbbGFzdERlZmluZUluZGV4XTsKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gR2V0
TG9jYWwpIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAg
ICAgICAgICBwcmludGYoIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV1XG4iLCBpbmRleCwgbGFzdERl
ZmluZUluZGV4KTsKKyNlbmRpZgorICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbaW5kZXhdID0g
bGFzdERlZmluZUluZGV4OworICAgICAgICAgICAgbm9kZS5zZXRSZWZDb3VudCgwKTsKKyAgICAg
ICAgICAgIHJldHVybjsgLy8gV2UncmUgZG9uZS4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChs
YXN0RGVmaW5lLm9wID09IFNldExvY2FsKSB7CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90
IHJlYWNoIGhlcmUgYmVjYXVzZSBhIFNldExvY2FsIHdpdGggdGhpcyBvcGVyYW5kCisgICAgICAg
ICAgICAvLyBzaG91bGQgbm90IGJlIGhvaXN0ZWQgdG8gdGhpcyBibG9jayAKKyAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZp
bmUub3AgPT0gUGhpKSB7CisgICAgICAgICAgICBpZiAoIWhvaXN0ZWQpCisgICAgICAgICAgICAg
ICAgdGFyZ2V0QmxvY2suYmVnaW4gPSBtX2dyYXBoLnNpemUoKTsKKyAgICAgICAgICAgIG1fZ3Jh
cGguYXBwZW5kKG1fZ3JhcGhbaW5kZXhdKTsKKyAgICAgICAgICAgIE5vZGUmIGdldExvY2FsTm9k
ZSA9IG1fZ3JhcGhbaW5kZXhdOworICAgICAgICAgICAgTm9kZSYgZ2V0TG9jYWxSZXBsYWNlbWVu
dCA9IG1fZ3JhcGgubGFzdCgpOworICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNlbWVudC5jaGls
ZHJlbi5maXhlZC5jaGlsZDEgPSBsYXN0RGVmaW5lSW5kZXg7CisgICAgICAgICAgICBtX3JlcGxh
Y2VtZW50c1tpbmRleF0gPSBtX2dyYXBoLnNpemUoKSAtIDE7CisjaWYgREZHX0VOQUJMRShERUJV
R19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgcHJpbnRmKCIgICBSZXBsYWNpbmcg
QCV1IC0+IEAlenVcbiIsIGluZGV4LCBtX2dyYXBoLnNpemUoKSAtIDEpOworI2VuZGlmCisgICAg
ICAgICAgICBnZXRMb2NhbFJlcGxhY2VtZW50LnNldFJlZkNvdW50KDApOworICAgICAgICAgICAg
Z2V0TG9jYWxOb2RlLnNldFJlZkNvdW50KDApOworICAgICAgICAgICAgKytob2lzdGVkOworICAg
ICAgICAgICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAgICAgICAg
IGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkKKyAgICAgICAgICAgICAgICB0YXJnZXRC
bG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkp
ID0gbV9ncmFwaC5zaXplKCkgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IHRhcmdldEJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG1fZ3JhcGguc2l6
ZSgpIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZml4SG9pc3RlZENoaWxkV2l0
aFNldExvY2FsKEJsb2NrSW5kZXggYmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBMb29wU2lk
ZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50
ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1lbnQgIT0g
Tm9Ob2RlKTsKKyAgICAgICAgQVNTRVJUKG1fZ3JhcGhbY2hpbGRdLm9wICE9IEdldExvY2FsICYm
IG1fZ3JhcGhbY2hpbGRdLm9wICE9IFBoaSAmJiBtX2dyYXBoW2NoaWxkXS5vcCAhPSBTZXRMb2Nh
bCk7CisgICAgICAgIE5vZGUmIHNldExvY2FsTm9kZSA9IG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAx
XTsKKyAgICAgICAgQVNTRVJUKHNldExvY2FsTm9kZS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAg
IEFTU0VSVChzZXRMb2NhbE5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQxID09IHJlcGxhY2VtZW50
KTsKKworICAgICAgICBtX2dyYXBoW2NoaWxkXS5vcCA9IEdldExvY2FsOworICAgICAgICBtX2dy
YXBoW2NoaWxkXS5zZXRWYXJpYWJsZUFjY2Vzc0RhdGEoc2V0TG9jYWxOb2RlLnZhcmlhYmxlQWNj
ZXNzRGF0YSgpKTsKKyAgICAgICAgaW50IG9wZXJhbmQgPSBtX2dyYXBoW2NoaWxkXS5sb2NhbCgp
OworICAgICAgICBCYXNpY0Jsb2NrJiBwcmVIZWFkZXJCbG9jayA9ICptX2dyYXBoLm1fYmxvY2tz
W2xvb3BJbmZvLnByZUhlYWRlckluZGV4XTsKKyAgICAgICAgQmFzaWNCbG9jayYgY3VycmVudEJs
b2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF07CisgICAgICAgIE5vZGVJbmRleCBm
aXJzdERlZmluZUluZGV4ID0gTm9Ob2RlOworICAgICAgICBsb29wSW5mby5wb2xsdXRlZExvY2Fs
cy5hcHBlbmQob3BlcmFuZCk7CisgICAgICAgIGxvb3BJbmZvLmFjY2Vzc2VkTG9jYWxzLmFwcGVu
ZChvcGVyYW5kKTsKKyAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKSB7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBhcmcgPSBvcGVyYW5kVG9Bcmd1bWVudChvcGVyYW5kKTsKKyAg
ICAgICAgICAgIHByZUhlYWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudChhcmcpID0g
cmVwbGFjZW1lbnQgKyAxOworICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJlbnRC
bG9jay52YXJpYWJsZXNBdEhlYWQuYXJndW1lbnQoYXJnKTsKKyAgICAgICAgICAgIGN1cnJlbnRC
bG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQoYXJnKSA9IGNoaWxkOworICAgICAgICAgICAg
aWYgKGZpcnN0RGVmaW5lSW5kZXggPT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgY3VycmVu
dEJsb2NrLnZhcmlhYmxlc0F0SGVhZC5zZXRBcmd1bWVudEZpcnN0VGltZShhcmcsIGNoaWxkKTsK
KyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBvZGQhIFRoZSBuZXcgUGhpIG5vZGUg
d2lsbCBiZSBwbGFjZWQgaW4gdGhlIAorICAgICAgICAgICAgICAgIC8vIHByZSBoZWFkZXIgYmxv
Y2sgdGhhdCBpdCBzaG91bGQgbm90IGJlbG9uZyB0by4KKyAgICAgICAgICAgICAgICBmaXJzdERl
ZmluZUluZGV4ID0gbV9ncmFwaC5zaXplKCk7CisgICAgICAgICAgICAgICAgbV9ncmFwaC5hcHBl
bmQoTm9kZShQaGksIENvZGVPcmlnaW4oKSwgT3BJbmZvKG1fZ3JhcGhbY2hpbGRdLnZhcmlhYmxl
QWNjZXNzRGF0YSgpKSkpOworICAgICAgICAgICAgICAgIG1fZ3JhcGgubV9hcmd1bWVudFBoaVN0
YWNrLmFwcGVuZChQaGlTdGFja0VudHJ5KCZjdXJyZW50QmxvY2ssIGZpcnN0RGVmaW5lSW5kZXgs
IGFyZykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJl
SGVhZGVyQmxvY2sudmFyaWFibGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQpID0gcmVwbGFjZW1lbnQg
KyAxOworICAgICAgICAgICAgZmlyc3REZWZpbmVJbmRleCA9IGN1cnJlbnRCbG9jay52YXJpYWJs
ZXNBdEhlYWQubG9jYWwob3BlcmFuZCk7CisgICAgICAgICAgICBjdXJyZW50QmxvY2sudmFyaWFi
bGVzQXRUYWlsLmxvY2FsKG9wZXJhbmQpID0gY2hpbGQ7CisgICAgICAgICAgICBpZiAoZmlyc3RE
ZWZpbmVJbmRleCA9PSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2sudmFy
aWFibGVzQXRIZWFkLnNldExvY2FsRmlyc3RUaW1lKG9wZXJhbmQsIGNoaWxkKTsKKyAgICAgICAg
ICAgICAgICBmaXJzdERlZmluZUluZGV4ID0gbV9ncmFwaC5zaXplKCk7CisgICAgICAgICAgICAg
ICAgbV9ncmFwaC5hcHBlbmQoTm9kZShQaGksIENvZGVPcmlnaW4oKSwgT3BJbmZvKG1fZ3JhcGhb
Y2hpbGRdLnZhcmlhYmxlQWNjZXNzRGF0YSgpKSkpOworICAgICAgICAgICAgICAgIG1fZ3JhcGgu
bV9sb2NhbFBoaVN0YWNrLmFwcGVuZChQaGlTdGFja0VudHJ5KCZjdXJyZW50QmxvY2ssIGZpcnN0
RGVmaW5lSW5kZXgsIG9wZXJhbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENo
ZWNrIGZvciByZWFkcyBvZiB0ZW1wb3JhcmllcyBmcm9tIHByaW9yIGJsb2NrcywKKyAgICAgICAg
ICAgIC8vIGV4cGFuZCBtX3ByZXNlcnZlZFZhcnMgdG8gY292ZXIgdGhlc2UuCisgICAgICAgICAg
ICBtX2dyYXBoLm1fcHJlc2VydmVkVmFycy5zZXQob3BlcmFuZCk7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAobV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5vcCA9PSBHZXRMb2NhbCkKKyAgICAg
ICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBtX2dyYXBoW2ZpcnN0RGVmaW5lSW5kZXhdLmNoaWxk
MSgpOworCisgICAgICAgIG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0ucmVmKCk7CisgICAgICAg
IG1fZ3JhcGhbY2hpbGRdLmNoaWxkcmVuLmZpeGVkLmNoaWxkMSA9IGZpcnN0RGVmaW5lSW5kZXg7
CisgICAgICAgIG1fZ3JhcGhbY2hpbGRdLmNoaWxkcmVuLmZpeGVkLmNoaWxkMiA9IE5vTm9kZTsK
KyAgICAgICAgbV9ncmFwaFtjaGlsZF0uY2hpbGRyZW4uZml4ZWQuY2hpbGQzID0gTm9Ob2RlOwor
ICAgIH0KKworICAgIGJvb2wgZml4SG9pc3RlZENoaWxkKEJsb2NrSW5kZXggYmxvY2tJbmRleCwg
Tm9kZUluZGV4IGNoaWxkLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAg
ICAgYm9vbCBzdWNjZXNzZnVsID0gdHJ1ZTsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50
ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1lbnQgIT0g
Tm9Ob2RlKTsgLy8gQ2hpbGRyZW4gb2YgYSBob2lzdGVkIG5vZGUgbXVzdCBoYXZlIGJlZW4gaG9p
c3RlZCBhcyB3ZWxsLgorCisgICAgICAgIG1fZ3JhcGhbY2hpbGRdLnJlZigpOworICAgICAgICBp
ZiAobV9ncmFwaFtjaGlsZF0ucmVmQ291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICAvLyBPbmx5
IGZpeCB0aGlzIGNoaWxkIG9uY2UuCisgICAgICAgICAgICBpZiAobV9ncmFwaFtjaGlsZF0ub3Ag
IT0gR2V0TG9jYWwgJiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0gSlNDb25zdGFudCAmJiBtX2dyYXBo
W2NoaWxkXS5vcCAhPSBXZWFrSlNDb25zdGFudCkgeworICAgICAgICAgICAgICAgIEFTU0VSVCht
X2dyYXBoW2NoaWxkXS5vcCAhPSBQaGkgJiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0gU2V0TG9jYWwp
OworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA8IG1fZ3JhcGguc2l6ZSgpIC0gMSAm
JiBtX2dyYXBoW3JlcGxhY2VtZW50ICsgMV0ub3AgPT0gU2V0TG9jYWwpCisgICAgICAgICAgICAg
ICAgICAgIGZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbChibG9ja0luZGV4LCBjaGlsZCwgbG9v
cEluZm8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3VjY2Vz
c2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY2hp
bGRdLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkKKyAgICAgICAgICAgICAgICBtX2dyYXBoW2NoaWxk
XS5yZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKKyAgICB9CisK
KyAgICB2b2lkIGhhbmRsZUhvaXN0ZWRDaGlsZChCbG9ja0luZGV4IGJsb2NrSW5kZXgsIE5vZGVJ
bmRleCBjaGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5mbykKKyAgICB7CisgICAgICAgIGlm
IChmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQsIGxvb3BJbmZvKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZml4IHRoaXMgY2hpbGQsIHdl
IG5lZWQgdG8gYmFjayB0cmFjay4KKyAgICAgICAgVmVjdG9yPE5vZGVJbmRleCwgMz4gaG9pc3Rl
ZENoaWxkcmVuV2l0aG91dFNldExvY2FsOworICAgICAgICBob2lzdGVkQ2hpbGRyZW5XaXRob3V0
U2V0TG9jYWwuYXBwZW5kKGNoaWxkKTsKKyAgICAgICAgd2hpbGUgKCFob2lzdGVkQ2hpbGRyZW5X
aXRob3V0U2V0TG9jYWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9n
cmFwaFtob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwubGFzdCgpXTsKKyAgICAgICAgICAg
IGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5yZW1vdmVMYXN0KCk7CisgICAgICAgICAg
ICBpZiAobm9kZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAgICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBjaGlsZElkeCA8IG5vZGUuZmly
c3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKSB7CisgICAgICAgICAg
ICAgICAgICAgIE5vZGVJbmRleCYgY2hpbGR4ID0gbV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2No
aWxkSWR4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkeCAhPSBOb05vZGUgJiYgIWZp
eEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZHgsIGxvb3BJbmZvKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGR4
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIE5vZGVJbmRleCYgY2hpbGQxID0gbm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDE7CisgICAg
ICAgICAgICAgICAgTm9kZUluZGV4JiBjaGlsZDIgPSBub2RlLmNoaWxkcmVuLmZpeGVkLmNoaWxk
MjsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXgmIGNoaWxkMyA9IG5vZGUuY2hpbGRyZW4uZml4
ZWQuY2hpbGQzOworCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMSAhPSBOb05vZGUgJiYgIWZp
eEhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBjaGlsZDEsIGxvb3BJbmZvKSkKKyAgICAgICAgICAg
ICAgICAgICAgaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZDEpOwor
CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkMiAhPSBOb05vZGUgJiYgIWZpeEhvaXN0ZWRDaGls
ZChibG9ja0luZGV4LCBjaGlsZDIsIGxvb3BJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgaG9p
c3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZDIpOworCisgICAgICAgICAg
ICAgICAgaWYgKGNoaWxkMyAhPSBOb05vZGUgJiYgIWZpeEhvaXN0ZWRDaGlsZChibG9ja0luZGV4
LCBjaGlsZDMsIGxvb3BJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVu
V2l0aG91dFNldExvY2FsLmFwcGVuZChjaGlsZDMpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorCisgICAgYm9vbCBpc0xvb3BQcmVIZWFkZXJCbG9jayhCbG9ja0luZGV4IGluZGV4
KQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fZ3JhcGgubV9sb29w
UHJlSGVhZGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1fZ3JhcGgubV9sb29w
UHJlSGVhZGVyc1tpXS5ibG9ja0luZGV4ID09IGluZGV4KQorICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAv
LyBBZG9wdCB0aGUgZG9taW5hbmNlIGFsZ29yaXRobSBieSBDb29wZXIsIEtlaXRoIEQuOyBIYXJ2
ZXksIFRpbW90aHkgSjsgYW5kIEtlbm5lZHksIEtlbiAoMjAwMSkuIAorICAgIC8vICJBIFNpbXBs
ZSwgRmFzdCBEb21pbmFuY2UgQWxnb3JpdGhtIgorICAgIC8vIGh0dHA6Ly93d3cuaGlwZXJzb2Z0
LnJpY2UuZWR1L2dyYWRzL3B1YmxpY2F0aW9ucy9kb20xNC5wZGYKKyAgICB1bnNpZ25lZCBpbnRl
cnNlY3QodW5zaWduZWQgYjEsIHVuc2lnbmVkIGIyLCBWZWN0b3I8dW5zaWduZWQ+JiBkb21UcmVl
KQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgZmluZ2VyMSA9IGIxOworICAgICAgICB1bnNpZ25l
ZCBmaW5nZXIyID0gYjI7CisKKyAgICAgICAgd2hpbGUgKGZpbmdlcjEgIT0gZmluZ2VyMikgewor
ICAgICAgICAgICAgd2hpbGUgKGZpbmdlcjEgPiBmaW5nZXIyKQorICAgICAgICAgICAgICAgZmlu
Z2VyMSA9IGRvbVRyZWVbZmluZ2VyMV07CisgICAgICAgICAgICB3aGlsZSAoZmluZ2VyMiA+IGZp
bmdlcjEpCisgICAgICAgICAgICAgICBmaW5nZXIyID0gZG9tVHJlZVtmaW5nZXIyXTsKKyAgICAg
ICAgfQorCisgICAgICAgIHJldHVybiBmaW5nZXIxOworICAgIH0KKworICAgIHZvaWQgY29tcHV0
ZURvbWluYXRvcnMoQmxvY2tJbmRleCBiZWdpbiwgQmxvY2tJbmRleCBlbmQsIFZlY3RvcjxCbG9j
a0luZGV4LCA4PiYgZG9taW5hdG9ycykKKyAgICB7CisgICAgICAgIC8vIEZpcnN0bHkgY29tcHV0
ZSB0aGUgZG9taW5hdG9yIHRyZWUuCisgICAgICAgIC8vIFRoZSB0cmVlIG5vZGUgaW5kZXggaXMg
dGhlIGJsb2NrIGluZGV4IG9mZnNldGVkIGJ5IHRoZSBiZWdpbiBibG9jayBpbmRleC4KKyAgICAg
ICAgVmVjdG9yPHVuc2lnbmVkPiBkb21UcmVlOworICAgICAgICB1bnNpZ25lZCBzaXplID0gZW5k
IC0gYmVnaW4gKyAxOworCisgICAgICAgIGRvbVRyZWUucmVzaXplKHNpemUpOworICAgICAgICBk
b21UcmVlWzBdID0gMDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHNpemU7IGkr
KykKKyAgICAgICAgICAgIGRvbVRyZWVbaV0gPSBzaXplOworCisgICAgICAgIGJvb2wgY2hhbmdl
ZCA9IHRydWU7CisKKyAgICAgICAgd2hpbGUgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGNoYW5n
ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHNpemU7
IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghbV9ncmFwaC5tX2Jsb2Nrc1tiZWdpbiArIGld
LT5pc1JlYWNoYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgICAgICAvLyBGSVhNRTogVmVyaWZ5IGFuZCBlbnN1cmUgdGhhdCB0aGUgcHJlY2Vzc29ycyBh
cmUgb3JkZXJlZCBieSBpbmRleC4KKyAgICAgICAgICAgICAgICBQcmVkZWNlc3Nvckxpc3QmIHBy
ZWRlY2Vzc29ycyA9IG1fZ3JhcGgubV9ibG9ja3NbYmVnaW4gKyBpXS0+bV9wcmVkZWNlc3NvcnM7
CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaiA9IDA7CisgICAgICAgICAgICAgICAgLy8gRmlu
ZCB0aGUgZmlyc3QgcHJlZGVjZXNzb3IgaW4gdGhpcyBzdWJncmFwaAorICAgICAgICAgICAgICAg
IHdoaWxlIChwcmVkZWNlc3NvcnNbal0gPCBiZWdpbikKKyAgICAgICAgICAgICAgICAgICAgaisr
OworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbmV3SURvbSA9IHByZWRlY2Vzc29yc1tqXSAt
IGJlZ2luOworICAgICAgICAgICAgICAgIEFTU0VSVChkb21UcmVlW25ld0lEb21dICE9IHNpemUp
OyAvLyBNdXN0IGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgICAgICAgICAgICAgaisrOworICAg
ICAgICAgICAgICAgIGZvciAoOyBqIDwgcHJlZGVjZXNzb3JzLnNpemUoKTsgaisrKSB7CisgICAg
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHByZWQgPSBwcmVkZWNlc3NvcnNbal0gLSBiZWdpbjsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGRvbVRyZWVbcHJlZF0gIT0gc2l6ZSkgLy8gTWVhbnMg
aXQncyBhbHJlYWR5IGNhbGN1bGF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdJRG9t
ID0gaW50ZXJzZWN0KHByZWQsIG5ld0lEb20sIGRvbVRyZWUpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBpZiAoZG9tVHJlZVtpXSAhPSBuZXdJRG9tKSB7CisgICAgICAgICAg
ICAgICAgICAgIGRvbVRyZWVbaV0gPSBuZXdJRG9tOworICAgICAgICAgICAgICAgICAgICBjaGFu
Z2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNM
b29wUHJlSGVhZGVyQmxvY2soYmVnaW4gKyBpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBT
a2lwIHRoZSBjb25kaXRpb25hbCBpbm5lciBsb29wcyBpZiBwb3NzaWJsZS4KKyAgICAgICAgICAg
ICAgICAgICAgTm9kZSYganVtcCA9IG1fZ3JhcGhbbV9ncmFwaC5tX2Jsb2Nrc1tiZWdpbiArIGld
LT5lbmQgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGp1bXAub3AgPT0gSnVtcCk7
CisgICAgICAgICAgICAgICAgICAgIGkgPSBqdW1wLnRha2VuQmxvY2tJbmRleCgpIC0gYmVnaW4g
LSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIC8vIFRoZW4gdHJhdmVyc2UgdGhlIGRvbWluYXRvciB0cmVlIHRvIGdldCB0aGUgZG9taW5h
dG9ycyBvZiB0aGUgbGFzdCBibG9jay4KKyAgICAgICAgdW5zaWduZWQgaWRvbSA9IGRvbVRyZWUu
bGFzdCgpOworICAgICAgICB3aGlsZSAoaWRvbSkgeworICAgICAgICAgICAgZG9taW5hdG9ycy5h
cHBlbmQoaWRvbSArIGJlZ2luKTsKKyAgICAgICAgICAgIGlkb20gPSBkb21UcmVlW2lkb21dOwor
ICAgICAgICB9CisgICAgICAgIGRvbWluYXRvcnMuYXBwZW5kKGJlZ2luKTsKKyAgICB9CisKKyAg
ICB2b2lkIHBlcmZvcm1MSUNNKExvb3BQcmVIZWFkZXImIHByZUhlYWRlcikKKyAgICB7CisgICAg
ICAgIEJsb2NrSW5kZXggcHJlSGVhZGVySW5kZXggPSBwcmVIZWFkZXIuYmxvY2tJbmRleDsKKyAg
ICAgICAgQmFzaWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1twcmVI
ZWFkZXJJbmRleF07CisgICAgICAgIEJsb2NrSW5kZXggbG9vcEhlYWRlckluZGV4ID0gbV9ncmFw
aFtwcmVIZWFkZXJCbG9jay5lbmQgLSAxXS50YWtlbkJsb2NrSW5kZXgoKTsKKyAgICAgICAgQmFz
aWNCbG9jayYgYmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1tsb29wSGVhZGVySW5kZXhdOworICAg
ICAgICB1bnNpZ25lZCBwcmVIZWFkZXJFbmRCZWZvcmVMSUNNID0gcHJlSGVhZGVyQmxvY2suZW5k
OworICAgICAgICBMb29wU2lkZUVmZmVjdHMgbG9vcEluZm8ocHJlSGVhZGVySW5kZXgpOworICAg
ICAgICB1bnNpZ25lZCBob2lzdGVkID0gMDsKKyAgICAgICAgQmxvY2tJbmRleCBsYXN0TG9vcEJs
b2NrSW5kZXggPSBsb29wSGVhZGVySW5kZXg7CisgICAgICAgIHVuc2lnbmVkIGkgPSAwOworICAg
ICAgICAvLyBib29sIG1ldElubGluZSA9IGZhbHNlOworCisgICAgICAgIGZvciAoaSA9IDE7IGkg
PCBibG9jay5tX3ByZWRlY2Vzc29ycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKGJs
b2NrLm1fcHJlZGVjZXNzb3JzW2ldID4gbGFzdExvb3BCbG9ja0luZGV4KQorICAgICAgICAgICAg
ICAgIGxhc3RMb29wQmxvY2tJbmRleCA9IGJsb2NrLm1fcHJlZGVjZXNzb3JzW2ldOyAvLyBUaGUg
ZnJvbSBibG9jayBvZiB0aGUgYmFjayBlZGdlLgorICAgICAgICB9CisKKyAgICAgICAgQmxvY2tJ
bmRleCBmaXJzdExvb3BCbG9ja0luZGV4ID0gcHJlSGVhZGVySW5kZXggKyAxOworICAgICAgICBW
ZWN0b3I8QmxvY2tJbmRleCwgOD4gbXVzdFJlYWNoQmxvY2tzSW5Mb29wOworICAgICAgICBtdXN0
UmVhY2hCbG9ja3NJbkxvb3AuYXBwZW5kKGxhc3RMb29wQmxvY2tJbmRleCk7CisgICAgICAgIGNv
bXB1dGVEb21pbmF0b3JzKGZpcnN0TG9vcEJsb2NrSW5kZXgsIGxhc3RMb29wQmxvY2tJbmRleCwg
bXVzdFJlYWNoQmxvY2tzSW5Mb29wKTsKKyAgICAgICAgYW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyht
X2dyYXBoLm1fYmxvY2tzW2ZpcnN0TG9vcEJsb2NrSW5kZXhdLT5iZWdpbiwgbV9ncmFwaC5tX2Js
b2Nrc1tsYXN0TG9vcEJsb2NrSW5kZXhdLT5lbmQsIGxvb3BJbmZvKTsKKworICAgICAgICB3aGls
ZSAoIW11c3RSZWFjaEJsb2Nrc0luTG9vcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEJsb2Nr
SW5kZXggYmxvY2tJbmRleCA9IG11c3RSZWFjaEJsb2Nrc0luTG9vcC5sYXN0KCk7CisgICAgICAg
ICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AucmVtb3ZlTGFzdCgpOworCisjaWYgMAorICAgICAg
ICAgICAgLy8gRklYTUU6IHJlY29uc2lkZXIgdGhpcyBsYXRlciB0byBiYWxhbmNlIHRoZSBleGVj
dXRpb24gcGVyZm9ybWFuY2UgYW5kIGNvbXBpbGUgdGltZS4KKyAgICAgICAgICAgIGlmIChtZXRJ
bmxpbmUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgZm9y
IChtX2NvbXBpbGVJbmRleCA9IG1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmJlZ2luOyBt
X2NvbXBpbGVJbmRleCA8IG1fZ3JhcGgubV9ibG9ja3NbYmxvY2tJbmRleF0tPmVuZDsgKyttX2Nv
bXBpbGVJbmRleCkgeworICAgICAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW21fY29t
cGlsZUluZGV4XTsKKworI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiB3ZSBt
ZWV0IGlubGluZWQgYm9kaWVzIGluIHRoZSBsb29wLgorICAgICAgICAgICAgICAgIGlmIChub2Rl
Lm9wID09IElubGluZVN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIG1ldElubGluZSA9IHRy
dWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRp
ZgorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gUGhpIHx8IG5vZGUub3AgPT0gRmx1
c2gpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihub2RlLmNoaWxk
cmVuLmZpeGVkLmNoaWxkMSk7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRp
b24obm9kZS5jaGlsZHJlbi5maXhlZC5jaGlsZDIpOworICAgICAgICAgICAgICAgICAgICBwZXJm
b3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4uZml4ZWQuY2hpbGQzKTsKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
Ym9vbCBzaG91bGRHZW5lcmF0ZSA9IG5vZGUuc2hvdWxkR2VuZXJhdGUoKTsKKyAgICAgICAgICAg
ICAgICBib29sIGNhbkhvaXN0ID0gaG9pc3RlZCA8IE1BWF9IT0lTVEVEX0xPT1BfSU5WQVJJQU5U
UyAtIDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaXNIb2lzdENhbmRpZGF0ZShub2RlLCBsb29w
SW5mbyk7CisKKyAgICAgICAgICAgICAgICAvLyBMb29rIG9uZSBzdGVwIGFoZWFkLgorICAgICAg
ICAgICAgICAgIGlmIChtX2dyYXBoW21fY29tcGlsZUluZGV4ICsgMV0ub3AgPT0gU2V0TG9jYWwg
JiYgbG9vcEluZm8uYWNjZXNzZWRMb2NhbHMuY29udGFpbnMobV9ncmFwaFttX2NvbXBpbGVJbmRl
eCArIDFdLmxvY2FsKCkpKQorICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOwor
CisgICAgICAgICAgICAgICAgaWYgKG5vZGUub3AgPT0gR2V0TG9jYWwgJiYgY2FuSG9pc3QgJiYg
c2hvdWxkR2VuZXJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RHZXRMb2NhbChtX2Nv
bXBpbGVJbmRleCwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWQpOworICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBWZWN0b3I8
Tm9kZUluZGV4LCAzPiBob2lzdGVkQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgY2FuSG9pc3Qg
Jj0gbm9kZUNhbkJlSG9pc3RlZChub2RlLCBwcmVIZWFkZXJCbG9jaywgaG9pc3RlZENoaWxkcmVu
KTsKKworICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gaG9pc3QgdGhlIFNldExvY2FsIG5v
ZGUgd2hhdGV2ZXIuCisgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRHZW5lcmF0ZSAmJiBub2Rl
Lm9wICE9IFNldExvY2FsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAg
ICAgIHByaW50ZigiICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhbbV9jb21waWxl
SW5kZXhdLm9wKSwgbV9jb21waWxlSW5kZXgpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBp
ZiAoY2FuSG9pc3QpCisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Ib2lzdChtX2NvbXBpbGVJ
bmRleCwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYg
KHNob3VsZEdlbmVyYXRlICYmICFob2lzdGVkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBjYW5ub3QgYmUgaG9pc3RlZCBidXQgaXQgY29udGFp
bnMgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBob2lzdGVkIG5vZGVzLgorICAgICAgICAgICAgICAg
ICAgICAvLyBBZGp1c3Qgc3VjaCByZWZlcmVuY2VzIGJ5IHV0aWxpemluZyBTZXRMb2NhbC9HZXRM
b2NhbCBmb3IgY3Jvc3MgYmxvY2sgcmVmZXJlbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGhvaXN0ZWRDaGlsZHJlbi5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGhhbmRsZUhvaXN0ZWRDaGlsZChibG9ja0luZGV4LCBob2lzdGVk
Q2hpbGRyZW5baV0sIGxvb3BJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZiBERkdfRU5B
QkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJc
biIpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9p
c3RlZCkgeworICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbcHJlSGVhZGVyRW5kQmVmb3JlTElD
TSAtIDFdLm9wID09IEp1bXApOworICAgICAgICAgICAgbV9ncmFwaC5hcHBlbmQobV9ncmFwaFtw
cmVIZWFkZXJFbmRCZWZvcmVMSUNNIC0gMV0pOworICAgICAgICAgICAgcHJlSGVhZGVyQmxvY2su
ZW5kID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIG5ld2x5
IGNyZWF0ZWQgUGhpIG5vZGVzIGR1cmluZyBMSUNNLgorICAgICAgICAgICAgbV9ncmFwaC5wcm9j
ZXNzUGhpU3RhY2soTG9jYWxQaGlTdGFjaywgcHJlSGVhZGVySW5kZXgpOworICAgICAgICAgICAg
bV9ncmFwaC5wcm9jZXNzUGhpU3RhY2soQXJndW1lbnRQaGlTdGFjaywgcHJlSGVhZGVySW5kZXgp
OworCisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHJlZmVyZW5jZSBjb3VudHMgb2YgdGhlIE11
c3RHZW5lcmF0ZSBub2Rlcy4KKyAgICAgICAgICAgIC8vIEZvciBlZmZpY2llbmN5IHdlIGluaXRp
YWxseSBzZXQgdGhlIGNvdW50IHRvIGJlIHplcm8gd2hlbiBob2lzdGluZyB0aGVtCisgICAgICAg
ICAgICAvLyBhcyB0aGV5IG1heSBiZSBmaW5hbGx5IG5vdCBuZWVkZWQgdG8gYmUgaG9pc3RlZCwg
c28gdGhhdCB0aGV5IHdvbid0IGJlCisgICAgICAgICAgICAvLyAod2FzdGVmdWxseSkgZXZhbHVh
dGVkLgorICAgICAgICAgICAgLy8gQnV0IGluIGNhc2UgaWYgdGhleSdyZSBpbmRlZWQgaG9pc3Rl
ZCBhbmQgbmVlZGVkIHRvIGJlIGV2YWx1YXRlZAorICAgICAgICAgICAgLy8gYWZ0ZXIgd2UgZmlu
aXNoIExJQ00gZm9yIGEgbG9vcCwgd2UgbmVlZCB0byBhZGQgcmVmZXJlbmNlIGNvdW50IHRvIHRo
ZW0uCisgICAgICAgICAgICBmb3IgKE5vZGVJbmRleCBpbmRleCA9IHByZUhlYWRlckJsb2NrLmJl
Z2luOyBpbmRleCA8IHByZUhlYWRlckJsb2NrLmVuZDsgaW5kZXgrKykgeworICAgICAgICAgICAg
ICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAobm9k
ZS5oYXNSZXN1bHQoKSAmJiBub2RlLnNob3VsZEdlbmVyYXRlKCkgJiYgKG5vZGUub3AgJiBOb2Rl
TXVzdEdlbmVyYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWYoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9vcEludmFyaWFudENvZGVNb3Rp
b24oKQorICAgIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisg
ICAgICAgIHByaW50ZigiUGVyZm9ybWluZyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbjoiKTsK
KyNlbmRpZgorICAgICAgICBCaXRWZWN0b3Igbm9uTGVhZkxvb3BzOyAvLyBUbyBtYXJrIHVwIHRo
b3NlIGxvb3BzIHdoaWNoIGhhdmUgaW5uZXIgbG9vcHMuCisgICAgICAgIHVuc2lnbmVkIGkgPSAw
OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9ncmFwaC5tX2xvb3BQcmVIZWFkZXJzLnNpemUo
KTsgKytpKSB7CisgICAgICAgICAgICBCbG9ja0luZGV4IG91dGVyTG9vcCA9IG1fZ3JhcGgubV9s
b29wUHJlSGVhZGVyc1tpXS5vdXRlckxvb3A7CisgICAgICAgICAgICBpZiAob3V0ZXJMb29wICE9
IE5vQmxvY2spCisgICAgICAgICAgICAgICAgbm9uTGVhZkxvb3BzLnNldChvdXRlckxvb3ApOwor
ICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fZ3JhcGgubV9sb29wUHJlSGVh
ZGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgTG9vcFByZUhlYWRlciBwcmVIZWFkZXIg
PSBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnNbaV07CisgICAgICAgICAgICAvLyBXZSBvbmx5IHBl
cmZvcm0gTElDTSBmb3IgdGhlIGxlYWYgKGlubmVybW9zdCkgbG9vcHMgZm9yIG5vdyEKKyAgICAg
ICAgICAgIC8vIEFzIE9TUiBpbiB0aGUgaW5uZXIgbG9vcHMgd2lsbCBtYWtlIExJQ00gZm9yIHRo
ZSBvdXRlciBsb29wcworICAgICAgICAgICAgLy8gbWVhbmluZ2xlc3MgYnV0IHdhc3RlZnVsLCB1
bmxlc3Mgd2UgZmlndXJlIG91dCBhIGdvb2Qgc29sdXRpb24uCisgICAgICAgICAgICBpZiAoIW5v
bkxlYWZMb29wcy5nZXQocHJlSGVhZGVyLmJsb2NrSW5kZXgpKQorICAgICAgICAgICAgICAgIHBl
cmZvcm1MSUNNKHByZUhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTb21lIFBoaSBu
b2RlcyBtYXkgbm90IGdldCB1cGRhdGVkIGNoaWxkcmVuIGZvciBub3cuCisgICAgICAgIGZvciAo
aSA9IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxT
aXplOyBpKyspIHsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRpb24obV9ncmFwaFtpXS5j
aGlsZHJlbi5maXhlZC5jaGlsZDEpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbiht
X2dyYXBoW2ldLmNoaWxkcmVuLmZpeGVkLmNoaWxkMik7CisgICAgICAgICAgICBwZXJmb3JtU3Vi
c3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uZml4ZWQuY2hpbGQzKTsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIENsZWFuLXVwLgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9yZXBsYWNl
bWVudHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX3JlcGxhY2VtZW50c1tpXSA9IE5vTm9k
ZTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBhbGxvY2F0ZVZpcnR1YWxSZWdpc3RlcnMoKQpAQCAt
MTY3MSw4ICsyMzY4LDExIEBAIHByaXZhdGU6CiAgICAgICAgIHByaW50ZigiXG4iKTsKICNlbmRp
ZgogICAgICAgICBTY29yZUJvYXJkIHNjb3JlQm9hcmQobV9ncmFwaCwgbV9ncmFwaC5tX3ByZXNl
cnZlZFZhcnMpOwotICAgICAgICB1bnNpZ25lZCBzaXplRXhjbHVkaW5nUGhpTm9kZXMgPSBtX2dy
YXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5kOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHNpemVFeGNsdWRpbmdQaGlOb2RlczsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGhp
IG5vZGVzCisgICAgICAgICAgICBpZiAoaSA+PSBtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKS0+ZW5k
ICYmIGkgPCBtX2dyYXBoLm1fb3JpZ2luYWxTaXplKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworCiAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpXTsKICAgICAgICAgCiAgICAg
ICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKQEAgLTE3MjUsNiArMjQyNSw4IEBA
IHByaXZhdGU6CiAgICAgICAgIHByaW50ZigiICAgQmxvY2sgIyV1IChiYyMldSk6XG4iLCBibG9j
a0luZGV4LCBibG9jay0+Ynl0ZWNvZGVCZWdpbik7CiAjZW5kaWYKICAgICAgICAgc3RhdGUuYmVn
aW5CYXNpY0Jsb2NrKGJsb2NrKTsKKyAgICAgICAgYmxvY2stPmNmYVNob3VsZFJldmlzaXQgPSBm
YWxzZTsKKyAgICAgICAgYmxvY2stPmNmYUhhc1Zpc2l0ZWQgPSB0cnVlOwogI2lmIERGR19FTkFC
TEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKICAgICAgICAgcHJpbnRmKCIgICAgICBoZWFk
IHZhcnM6ICIpOwogICAgICAgICBkdW1wT3BlcmFuZHMoYmxvY2stPnZhbHVlc0F0SGVhZCwgc3Rk
b3V0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVj
dWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTcyNSwyMSArMTcyNSwyNSBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5v
ZGUpCiAgICAgfQogCiAgICAgY2FzZSBTZXRMb2NhbDogewotICAgICAgICAvLyBTZXRMb2NhbCBk
b3VibGVzIGFzIGEgaGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBiZSBzdG9yZWQgYW5kCi0g
ICAgICAgIC8vIGFzIGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3ZSBzcGVjdWxhdGUg
bWFrZSBzdXJlIHRoYXQgd2UKLSAgICAgICAgLy8ga25vdyB3aGVyZSB0aGUgY2hpbGQgb2YgdGhp
cyBub2RlIG5lZWRzIHRvIGdvIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgIC8vIHJlZ2lzdGVyIGZp
bGUuCi0gICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOwotICAgICAgICAKLSAgICAgICAgLy8g
QXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3JlIG9uIHRoZSBieXRlY29kZSBpbmRleCBj
b3JyZXNwb25kaW5nCi0gICAgICAgIC8vIHRvIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24sIHNpbmNl
IHdlJ3ZlIGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKLSAgICAgICAgLy8gU2V0TG9jYWwgYW5kIHdo
YXRldmVyIG90aGVyIERGRyBOb2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lCi0gICAg
ICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFzIHRoZSBTZXRMb2NhbC4KLSAgICAgICAgQVNTRVJUKG1f
Y29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNvZGVPcmlnaW4pOwotICAgICAgICBOb2RlJiBuZXh0
Tm9kZSA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7CisgICAgICAgIGJvb2wgaXNIb2lzdGVkTm9k
ZSA9IChtX2NvbXBpbGVJbmRleCA+PSBtX2ppdC5ncmFwaCgpLm1fb3JpZ2luYWxTaXplKTsKKwor
ICAgICAgICBpZiAoIWlzSG9pc3RlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIFNldExvY2FsIGRv
dWJsZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3JlZCBhbmQKKyAg
ICAgICAgICAgIC8vIGFzIGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3ZSBzcGVjdWxh
dGUgbWFrZSBzdXJlIHRoYXQgd2UKKyAgICAgICAgICAgIC8vIGtub3cgd2hlcmUgdGhlIGNoaWxk
IG9mIHRoaXMgbm9kZSBuZWVkcyB0byBnbyBpbiB0aGUgdmlydHVhbAorICAgICAgICAgICAgLy8g
cmVnaXN0ZXIgZmlsZS4KKyAgICAgICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOwogICAgICAg
ICAKLSAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbmV4dE5vZGUuY29kZU9yaWdpbjsKKyAg
ICAgICAgICAgIC8vIEFzIGZhciBhcyBPU1IgaXMgY29uY2VybmVkLCB3ZSdyZSBvbiB0aGUgYnl0
ZWNvZGUgaW5kZXggY29ycmVzcG9uZGluZworICAgICAgICAgICAgLy8gdG8gdGhlICpuZXh0KiBp
bnN0cnVjdGlvbiwgc2luY2Ugd2UndmUgYWxyZWFkeSAiZXhlY3V0ZWQiIHRoZQorICAgICAgICAg
ICAgLy8gU2V0TG9jYWwgYW5kIHdoYXRldmVyIG90aGVyIERGRyBOb2RlcyBhcmUgYXNzb2NpYXRl
ZCB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBieXRlY29kZSBpbmRleCBhcyB0aGUgU2V0
TG9jYWwuCisgICAgICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luRm9yT1NSID09IG5vZGUuY29k
ZU9yaWdpbik7CisgICAgICAgICAgICBOb2RlJiBuZXh0Tm9kZSA9IGF0KG1fY29tcGlsZUluZGV4
ICsgMSk7CiAgICAgICAgIAorICAgICAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbmV4dE5v
ZGUuY29kZU9yaWdpbjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChub2RlLnZhcmlhYmxlQWNj
ZXNzRGF0YSgpLT5zaG91bGRVc2VEb3VibGVGb3JtYXQoKSkgewogICAgICAgICAgICAgU3BlY3Vs
YXRlRG91YmxlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKICAgICAgICAgICAg
IG1faml0LnN0b3JlRG91YmxlKHZhbHVlLmZwcigpLCBKSVRDb21waWxlcjo6YWRkcmVzc0Zvcihu
b2RlLmxvY2FsKCkpKTsKQEAgLTE3NDcsNyArMTc1MSw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6
OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgaXQncyBu
byBsb25nZXIgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZgogICAgICAgICAgICAg
Ly8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBmcm9tIHJlZ2lzdGVycyBvciBvdGhlciBsb2NhdGlv
bnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUsCiAgICAgICAgICAgICAvLyBidXQgdGhhdCBpdCBpcyBz
dG9yZWQgYXMgYSBkb3VibGUuCi0gICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9w
ZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERvdWJsZUluUmVnaXN0ZXJGaWxlKTsK
KyAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgICAgICB2YWx1ZVNv
dXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERvdWJs
ZUluUmVnaXN0ZXJGaWxlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFByZWRpY3Rl
ZFR5cGUgcHJlZGljdGVkVHlwZSA9IG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPnByZWRpY3Rp
b24oKTsKICAgICAgICAgICAgIGlmIChtX2dlbmVyYXRpb25JbmZvW2F0KG5vZGUuY2hpbGQxKCkp
LnZpcnR1YWxSZWdpc3RlcigpXS5yZWdpc3RlckZvcm1hdCgpID09IERhdGFGb3JtYXREb3VibGUp
IHsKQEAgLTE3ODUsNyArMTc5MCw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9k
ZSYgbm9kZSkKIAogICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBpdCdzIG5vIGxvbmdlciBu
ZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCiAgICAgICAgICAgICAvLyB0aGlzIGJ5
dGVjb2RlIHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUg
cmVnaXN0ZXIgZmlsZS4KLSAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFu
ZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rpb24ocHJlZGljdGVkVHlw
ZSk7CisgICAgICAgICAgICBpZiAoIWlzSG9pc3RlZE5vZGUpCisgICAgICAgICAgICAgICAgdmFs
dWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6
Zm9yUHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsK
ICAgICB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
NjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3Vs
YXRpdmVKSVQ2NC5jcHAJKHJldmlzaW9uIDEwNjc3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3OTksMzAg
KzE3OTksMzQgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAg
IH0KIAogICAgIGNhc2UgU2V0TG9jYWw6IHsKLSAgICAgICAgLy8gU2V0TG9jYWwgZG91YmxlcyBh
cyBhIGhpbnQgYXMgdG8gd2hlcmUgYSBub2RlIHdpbGwgYmUgc3RvcmVkIGFuZAotICAgICAgICAv
LyBhcyBhIHNwZWN1bGF0aW9uIHBvaW50LiBTbyBiZWZvcmUgd2Ugc3BlY3VsYXRlIG1ha2Ugc3Vy
ZSB0aGF0IHdlCi0gICAgICAgIC8vIGtub3cgd2hlcmUgdGhlIGNoaWxkIG9mIHRoaXMgbm9kZSBu
ZWVkcyB0byBnbyBpbiB0aGUgdmlydHVhbAotICAgICAgICAvLyByZWdpc3RlciBmaWxlLgotICAg
ICAgICBjb21waWxlTW92SGludChub2RlKTsKKyAgICAgICAgYm9vbCBpc0hvaXN0ZWROb2RlID0g
KG1fY29tcGlsZUluZGV4ID49IG1faml0LmdyYXBoKCkubV9vcmlnaW5hbFNpemUpOworCisgICAg
ICAgIGlmICghaXNIb2lzdGVkTm9kZSkgeworICAgICAgICAgICAgLy8gU2V0TG9jYWwgZG91Ymxl
cyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgYSBub2RlIHdpbGwgYmUgc3RvcmVkIGFuZAorICAgICAg
ICAgICAgLy8gYXMgYSBzcGVjdWxhdGlvbiBwb2ludC4gU28gYmVmb3JlIHdlIHNwZWN1bGF0ZSBt
YWtlIHN1cmUgdGhhdCB3ZQorICAgICAgICAgICAgLy8ga25vdyB3aGVyZSB0aGUgY2hpbGQgb2Yg
dGhpcyBub2RlIG5lZWRzIHRvIGdvIGluIHRoZSB2aXJ0dWFsCisgICAgICAgICAgICAvLyByZWdp
c3RlciBmaWxlLgorICAgICAgICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7CiAgICAgICAgIAot
ICAgICAgICAvLyBBcyBmYXIgYXMgT1NSIGlzIGNvbmNlcm5lZCwgd2UncmUgb24gdGhlIGJ5dGVj
b2RlIGluZGV4IGNvcnJlc3BvbmRpbmcKLSAgICAgICAgLy8gdG8gdGhlICpuZXh0KiBpbnN0cnVj
dGlvbiwgc2luY2Ugd2UndmUgYWxyZWFkeSAiZXhlY3V0ZWQiIHRoZQotICAgICAgICAvLyBTZXRM
b2NhbCBhbmQgd2hhdGV2ZXIgb3RoZXIgREZHIE5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhl
IHNhbWUKLSAgICAgICAgLy8gYnl0ZWNvZGUgaW5kZXggYXMgdGhlIFNldExvY2FsLgotICAgICAg
ICBBU1NFUlQobV9jb2RlT3JpZ2luRm9yT1NSID09IG5vZGUuY29kZU9yaWdpbik7Ci0gICAgICAg
IE5vZGUmIG5leHROb2RlID0gYXQobV9jb21waWxlSW5kZXggKyAxKTsKKyAgICAgICAgICAgIC8v
IEFzIGZhciBhcyBPU1IgaXMgY29uY2VybmVkLCB3ZSdyZSBvbiB0aGUgYnl0ZWNvZGUgaW5kZXgg
Y29ycmVzcG9uZGluZworICAgICAgICAgICAgLy8gdG8gdGhlICpuZXh0KiBpbnN0cnVjdGlvbiwg
c2luY2Ugd2UndmUgYWxyZWFkeSAiZXhlY3V0ZWQiIHRoZQorICAgICAgICAgICAgLy8gU2V0TG9j
YWwgYW5kIHdoYXRldmVyIG90aGVyIERGRyBOb2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBz
YW1lCisgICAgICAgICAgICAvLyBieXRlY29kZSBpbmRleCBhcyB0aGUgU2V0TG9jYWwuCisgICAg
ICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luRm9yT1NSID09IG5vZGUuY29kZU9yaWdpbik7Cisg
ICAgICAgICAgICBOb2RlJiBuZXh0Tm9kZSA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7CiAgICAg
ICAgIAotICAgICAgICAvLyBPZGRseSwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIGJ5dGVjb2RlIGlu
ZGV4IGZvciB0aGUgbmV4dCBub2RlIHRvIGJlCi0gICAgICAgIC8vIGVxdWFsIHRvIG91cnMuIFRo
aXMgd2lsbCBoYXBwZW4gZm9yIG9wX3Bvc3RfaW5jLiBBbmQsIGV2ZW4gbW9yZSBvZGRseSwKLSAg
ICAgICAgLy8gdGhpcyBpcyBqdXN0IGZpbmUuIE9yZGluYXJpbHksIHRoaXMgd291bGRuJ3QgYmUg
ZmluZSwgc2luY2UgaWYgdGhlCi0gICAgICAgIC8vIG5leHQgbm9kZSBmYWlsZWQgT1NSIHRoZW4g
d2UnZCBiZSBPU1ItaW5nIHdpdGggdGhpcyBTZXRMb2NhbCdzIGxvY2FsCi0gICAgICAgIC8vIHZh
cmlhYmxlIGFscmVhZHkgc2V0IGV2ZW4gdGhvdWdoIGZyb20gdGhlIHN0YW5kcG9pbnQgb2YgdGhl
IG9sZCBKSVQsCi0gICAgICAgIC8vIHRoaXMgU2V0TG9jYWwgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1
dGVkLiBCdXQgZm9yIG9wX3Bvc3RfaW5jLCBpdCdzIGp1c3QKLSAgICAgICAgLy8gZmluZSwgYmVj
YXVzZSB0aGlzIFNldExvY2FsJ3MgbG9jYWwgKGkuZS4gdGhlIExIUyBpbiBhIHggPSB5KysKLSAg
ICAgICAgLy8gc3RhdGVtZW50KSB3b3VsZCBiZSBkZWFkIGFueXdheSAtIHNvIHRoZSBmYWN0IHRo
YXQgREZHIHdvdWxkIGhhdmUKLSAgICAgICAgLy8gYWxyZWFkeSBtYWRlIHRoZSBhc3NpZ25tZW50
LCBhbmQgYmFrZWQgaXQgaW50byB0aGUgcmVnaXN0ZXIgZmlsZSBkdXJpbmcKLSAgICAgICAgLy8g
T1NSIGV4aXQsIHdvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBvbGQgSklUIGluIGFueSB3YXku
Ci0gICAgICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IG5leHROb2RlLmNvZGVPcmlnaW47CisgICAg
ICAgICAgICAvLyBPZGRseSwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIGJ5dGVjb2RlIGluZGV4IGZv
ciB0aGUgbmV4dCBub2RlIHRvIGJlCisgICAgICAgICAgICAvLyBlcXVhbCB0byBvdXJzLiBUaGlz
IHdpbGwgaGFwcGVuIGZvciBvcF9wb3N0X2luYy4gQW5kLCBldmVuIG1vcmUgb2RkbHksCisgICAg
ICAgICAgICAvLyB0aGlzIGlzIGp1c3QgZmluZS4gT3JkaW5hcmlseSwgdGhpcyB3b3VsZG4ndCBi
ZSBmaW5lLCBzaW5jZSBpZiB0aGUKKyAgICAgICAgICAgIC8vIG5leHQgbm9kZSBmYWlsZWQgT1NS
IHRoZW4gd2UnZCBiZSBPU1ItaW5nIHdpdGggdGhpcyBTZXRMb2NhbCdzIGxvY2FsCisgICAgICAg
ICAgICAvLyB2YXJpYWJsZSBhbHJlYWR5IHNldCBldmVuIHRob3VnaCBmcm9tIHRoZSBzdGFuZHBv
aW50IG9mIHRoZSBvbGQgSklULAorICAgICAgICAgICAgLy8gdGhpcyBTZXRMb2NhbCBzaG91bGQg
bm90IGhhdmUgZXhlY3V0ZWQuIEJ1dCBmb3Igb3BfcG9zdF9pbmMsIGl0J3MganVzdAorICAgICAg
ICAgICAgLy8gZmluZSwgYmVjYXVzZSB0aGlzIFNldExvY2FsJ3MgbG9jYWwgKGkuZS4gdGhlIExI
UyBpbiBhIHggPSB5KysKKyAgICAgICAgICAgIC8vIHN0YXRlbWVudCkgd291bGQgYmUgZGVhZCBh
bnl3YXkgLSBzbyB0aGUgZmFjdCB0aGF0IERGRyB3b3VsZCBoYXZlCisgICAgICAgICAgICAvLyBh
bHJlYWR5IG1hZGUgdGhlIGFzc2lnbm1lbnQsIGFuZCBiYWtlZCBpdCBpbnRvIHRoZSByZWdpc3Rl
ciBmaWxlIGR1cmluZworICAgICAgICAgICAgLy8gT1NSIGV4aXQsIHdvdWxkIG5vdCBiZSB2aXNp
YmxlIHRvIHRoZSBvbGQgSklUIGluIGFueSB3YXkuCisgICAgICAgICAgICBtX2NvZGVPcmlnaW5G
b3JPU1IgPSBuZXh0Tm9kZS5jb2RlT3JpZ2luOworICAgICAgICB9CiAgICAgICAgIAogICAgICAg
ICBpZiAobm9kZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkp
IHsKICAgICAgICAgICAgIFNwZWN1bGF0ZURvdWJsZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5j
aGlsZDEoKSk7CkBAIC0xODMxLDcgKzE4MzUsOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21w
aWxlKE5vZGUmIG5vZGUpCiAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9u
Z2VyIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgIC8vIHRo
aXMgYnl0ZWNvZGUgdmFyaWFibGUgZnJvbSByZWdpc3RlcnMgb3Igb3RoZXIgbG9jYXRpb25zIGlu
IHRoZSByZWdpc3RlciBmaWxlLAogICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXQgaXMgc3RvcmVk
IGFzIGEgZG91YmxlLgotICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5k
KG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CisgICAg
ICAgICAgICBpZiAoIWlzSG9pc3RlZE5vZGUpCisgICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VS
ZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJl
Z2lzdGVyRmlsZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQcmVkaWN0ZWRUeXBl
IHByZWRpY3RlZFR5cGUgPSBub2RlLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5wcmVkaWN0aW9uKCk7
CiAgICAgICAgICAgICBpZiAoaXNJbnQzMlByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKQEAg
LTE4NjQsNyArMTg2OSw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9k
ZSkKIAogICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBpdCdzIG5vIGxvbmdlciBuZWNlc3Nh
cnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCiAgICAgICAgICAgICAvLyB0aGlzIGJ5dGVjb2Rl
IHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0
ZXIgZmlsZS4KLSAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2Rl
LmxvY2FsKCkpID0gVmFsdWVTb3VyY2U6OmZvclByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSk7Cisg
ICAgICAgICAgICBpZiAoIWlzSG9pc3RlZE5vZGUpCisgICAgICAgICAgICAgICAgdmFsdWVTb3Vy
Y2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZTo6Zm9yUHJl
ZGljdGlvbihwcmVkaWN0ZWRUeXBlKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
LmNwcAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdT
cGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkyMCw3ICs5MjAsOCBAQCB2b2lk
IFNwZWN1bGF0aXZlSklUOjpjb21waWxlTW92SGludChOb2RlCiB2b2lkIFNwZWN1bGF0aXZlSklU
Ojpjb21waWxlKEJhc2ljQmxvY2smIGJsb2NrKQogewogICAgIEFTU0VSVChtX2NvbXBpbGVPa2F5
KTsKLSAgICBBU1NFUlQobV9jb21waWxlSW5kZXggPT0gYmxvY2suYmVnaW4pOworICAgIC8vIEFT
U0VSVChtX2NvbXBpbGVJbmRleCA9PSBibG9jay5iZWdpbik7CisgICAgbV9jb21waWxlSW5kZXgg
PSBibG9jay5iZWdpbjsKICAgICAKICAgICBpZiAoIWJsb2NrLmlzUmVhY2hhYmxlKSB7CiAgICAg
ICAgIG1fY29tcGlsZUluZGV4ID0gYmxvY2suZW5kOwpAQCAtOTU2LDM2ICs5NTcsNDEgQEAgdm9p
ZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShCYXNpY0Jsb2NrJgogICAgIH0KICAgICAKICAgICBt
X2xhc3RTZXRPcGVyYW5kID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLSAgICBt
X2NvZGVPcmlnaW5Gb3JPU1IgPSBDb2RlT3JpZ2luKCk7CisgICAgbV9jb2RlT3JpZ2luRm9yT1NS
ID0gYXQoYmxvY2suZW5kIC0gMSkuY29kZU9yaWdpbjsgLy8gSW5pdGlhbGl6ZSBpdCB3aXRoIHRo
ZSBsYXN0IG5vZGUncyBvcmlnaW4gaW4gdGhpcyBibG9jay4KKyAgICBib29sIGJsb2NrQ29udGFp
bnNIb2lzdGVkTm9kZXMgPSAobV9jb21waWxlSW5kZXggPj0gbV9qaXQuZ3JhcGgoKS5tX29yaWdp
bmFsU2l6ZSk7CiAKICAgICBmb3IgKDsgbV9jb21waWxlSW5kZXggPCBibG9jay5lbmQ7ICsrbV9j
b21waWxlSW5kZXgpIHsKICAgICAgICAgTm9kZSYgbm9kZSA9IGF0KG1fY29tcGlsZUluZGV4KTsK
LSAgICAgICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gbm9kZS5jb2RlT3JpZ2luOworICAgICAgICBp
ZiAoIWJsb2NrQ29udGFpbnNIb2lzdGVkTm9kZXMpCisgICAgICAgICAgICBtX2NvZGVPcmlnaW5G
b3JPU1IgPSBub2RlLmNvZGVPcmlnaW47CisKICAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVy
YXRlKCkpIHsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCiAgICAgICAgICAgICBmcHJp
bnRmKHN0ZGVyciwgIlNwZWN1bGF0aXZlSklUIHNraXBwaW5nIE5vZGUgQCVkIChiYyMldSkgYXQg
SklUIG9mZnNldCAweCV4ICAgICAiLCAoaW50KW1fY29tcGlsZUluZGV4LCBub2RlLmNvZGVPcmln
aW4uYnl0ZWNvZGVJbmRleCwgbV9qaXQuZGVidWdPZmZzZXQoKSk7CiAjZW5kaWYKLSAgICAgICAg
ICAgIHN3aXRjaCAobm9kZS5vcCkgewotICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKLSAgICAg
ICAgICAgICAgICBjb21waWxlTW92SGludChub2RlKTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LQotICAgICAgICAgICAgY2FzZSBJbmxpbmVTdGFydDogewotICAgICAgICAgICAgICAgIElubGlu
ZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gbm9kZS5jb2RlT3JpZ2luLmlubGluZUNhbGxG
cmFtZTsKLSAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMgPSBp
bmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpczsgKytpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIFZhbHVlUmVjb3ZlcnkgcmVjb3ZlcnkgPSBjb21wdXRlVmFsdWVSZWNvdmVy
eUZvcihtX3ZhcmlhYmxlc1tpbmxpbmVDYWxsRnJhbWUtPnN0YWNrT2Zmc2V0ICsgQ2FsbEZyYW1l
Ojphcmd1bWVudE9mZnNldEluY2x1ZGluZ1RoaXMoaSldKTsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gVGhlIHJlY292ZXJ5IGNhbm5vdCBwb2ludCB0byByZWdpc3RlcnMsIHNpbmNlIHRoZSBjYWxs
IGZyYW1lIHJlaWZpY2F0aW9uIGlzbid0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFzIHNtYXJ0
IGFzIE9TUiwgc28gaXQgY2FuJ3QgaGFuZGxlIHRoYXQuIFRoZSBleGNlcHRpb24gaXMgdGhlIHRo
aXMgYXJndW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdlIGRvbid0IHJlYWxs
eSBuZWVkIHRvIGJlIGFibGUgdG8gcmVjb3Zlci4KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJU
KCFpIHx8ICFyZWNvdmVyeS5pc0luUmVnaXN0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBp
bmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50c1tpXSA9IHJlY292ZXJ5OworICAgICAgICAgICAgaWYg
KCFibG9ja0NvbnRhaW5zSG9pc3RlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChu
b2RlLm9wKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKKyAgICAgICAgICAgICAg
ICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVTdGFydDogeworICAgICAgICAgICAgICAgICAg
ICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9IG5vZGUuY29kZU9yaWdpbi5pbmxp
bmVDYWxsRnJhbWU7CisgICAgICAgICAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcyA9IGlubGluZUNhbGxGcmFtZS0+YXJndW1lbnRzLnNpemUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpczsg
KytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlY292ZXJ5IHJlY292ZXJ5ID0g
Y29tcHV0ZVZhbHVlUmVjb3ZlcnlGb3IobV92YXJpYWJsZXNbaW5saW5lQ2FsbEZyYW1lLT5zdGFj
a09mZnNldCArIENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXRJbmNsdWRpbmdUaGlzKGkpXSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjb3ZlcnkgY2Fubm90IHBvaW50IHRvIHJl
Z2lzdGVycywgc2luY2UgdGhlIGNhbGwgZnJhbWUgcmVpZmljYXRpb24gaXNuJ3QKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGFzIHNtYXJ0IGFzIE9TUiwgc28gaXQgY2FuJ3QgaGFuZGxlIHRo
YXQuIFRoZSBleGNlcHRpb24gaXMgdGhlIHRoaXMgYXJndW1lbnQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAvLyB3aGljaCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBiZSBhYmxlIHRvIHJlY292
ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIWkgfHwgIXJlY292ZXJ5LmlzSW5S
ZWdpc3RlcnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDYWxsRnJhbWUtPmFy
Z3VtZW50c1tpXSA9IHJlY292ZXJ5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQog
ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgCkBAIC0xNTIxLDIwICsxNTI3LDIyIEBAIHZv
aWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVVSW50MzJUb051bWIKICAgICAvLyB0byBkbyB0aGlz
IGJlY2F1c2UgYnkgdGhpcyBwb2ludCwgdGhlIG9yaWdpbmFsIHZhbHVlcyBuZWNlc3NhcnkgdG8g
Y29tcGlsZSB3aGF0ZXZlcgogICAgIC8vIG9wZXJhdGlvbiB0aGUgVUludDMyVG9OdW1iZXIgb3Jp
Z2luYXRlZCBmcm9tIG1pZ2h0IGJlIGRlYWQuCiAgICAgc3BlY3VsYXRpb25DaGVjayhPdmVyZmxv
dywgSlNWYWx1ZVJlZ3MoKSwgTm9Ob2RlLCBtX2ppdC5icmFuY2gzMihNYWNyb0Fzc2VtYmxlcjo6
TGVzc1RoYW4sIG9wMS5ncHIoKSwgVHJ1c3RlZEltbTMyKDApKSk7CisgCisgICAgaWYgKG1fY29t
cGlsZUluZGV4IDwgbV9qaXQuZ3JhcGgoKS5tX29yaWdpbmFsU2l6ZSkgeworICAgICAgICAvLyBW
ZXJpZnkgdGhhdCB3ZSBjYW4gZG8gcm9sbCBmb3J3YXJkLgorICAgICAgICBBU1NFUlQoYXQobV9j
b21waWxlSW5kZXggKyAxKS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFTU0VSVChhdChtX2Nv
bXBpbGVJbmRleCArIDEpLmNvZGVPcmlnaW4gPT0gbm9kZS5jb2RlT3JpZ2luKTsKKyAgICAgICAg
QVNTRVJUKGF0KG1fY29tcGlsZUluZGV4ICsgMikuY29kZU9yaWdpbiAhPSBub2RlLmNvZGVPcmln
aW4pOworICAgICAgICAKKyAgICAgICAgLy8gTm93IGRvIHRoZSBtYWdpYy4KKyAgICAgICAgT1NS
RXhpdCYgZXhpdCA9IG1faml0LmNvZGVCbG9jaygpLT5sYXN0T1NSRXhpdCgpOworICAgICAgICBO
b2RlJiBzZXRMb2NhbCA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7CisgICAgICAgIGV4aXQubV9j
b2RlT3JpZ2luID0gYXQobV9jb21waWxlSW5kZXggKyAyKS5jb2RlT3JpZ2luOworICAgICAgICBl
eGl0Lm1fbGFzdFNldE9wZXJhbmQgPSBzZXRMb2NhbC5sb2NhbCgpOwogICAgICAgICAKLSAgICAv
LyBWZXJpZnkgdGhhdCB3ZSBjYW4gZG8gcm9sbCBmb3J3YXJkLgotICAgIEFTU0VSVChhdChtX2Nv
bXBpbGVJbmRleCArIDEpLm9wID09IFNldExvY2FsKTsKLSAgICBBU1NFUlQoYXQobV9jb21waWxl
SW5kZXggKyAxKS5jb2RlT3JpZ2luID09IG5vZGUuY29kZU9yaWdpbik7Ci0gICAgQVNTRVJUKGF0
KG1fY29tcGlsZUluZGV4ICsgMikuY29kZU9yaWdpbiAhPSBub2RlLmNvZGVPcmlnaW4pOwotICAg
ICAgICAKLSAgICAvLyBOb3cgZG8gdGhlIG1hZ2ljLgotICAgIE9TUkV4aXQmIGV4aXQgPSBtX2pp
dC5jb2RlQmxvY2soKS0+bGFzdE9TUkV4aXQoKTsKLSAgICBOb2RlJiBzZXRMb2NhbCA9IGF0KG1f
Y29tcGlsZUluZGV4ICsgMSk7Ci0gICAgZXhpdC5tX2NvZGVPcmlnaW4gPSBhdChtX2NvbXBpbGVJ
bmRleCArIDIpLmNvZGVPcmlnaW47Ci0gICAgZXhpdC5tX2xhc3RTZXRPcGVyYW5kID0gc2V0TG9j
YWwubG9jYWwoKTsKLSAgICAgICAgCi0gICAgLy8gQ3JlYXRlIHRoZSB2YWx1ZSByZWNvdmVyeSwg
YW5kIHN0dWZmIGl0IGludG8gdGhlIHJpZ2h0IHBsYWNlLgotICAgIGV4aXQudmFsdWVSZWNvdmVy
eUZvck9wZXJhbmQoc2V0TG9jYWwubG9jYWwoKSkgPSBWYWx1ZVJlY292ZXJ5Ojp1aW50MzJJbkdQ
UihvcDEuZ3ByKCkpOworICAgICAgICAvLyBDcmVhdGUgdGhlIHZhbHVlIHJlY292ZXJ5LCBhbmQg
c3R1ZmYgaXQgaW50byB0aGUgcmlnaHQgcGxhY2UuCisgICAgICAgIGV4aXQudmFsdWVSZWNvdmVy
eUZvck9wZXJhbmQoc2V0TG9jYWwubG9jYWwoKSkgPSBWYWx1ZVJlY292ZXJ5Ojp1aW50MzJJbkdQ
UihvcDEuZ3ByKCkpOworICAgIH0KIAogICAgIG1faml0Lm1vdmUob3AxLmdwcigpLCByZXN1bHQu
Z3ByKCkpOwogICAgIGludGVnZXJSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBpbGVJbmRleCwg
b3AxLmZvcm1hdCgpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9J
bnRlcnByZXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ludGVy
cHJldGVyL0ludGVycHJldGVyLmNwcAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzcxMCw2ICszNzEwLDExIEBAIHNraXBfaWRfY3VzdG9tX3NlbGY6CiAgICAgICAgIHZQQyArPSBP
UENPREVfTEVOR1RIKG9wX2xvb3BfaGludCk7CiAgICAgICAgIE5FWFRfSU5TVFJVQ1RJT04oKTsK
ICAgICB9CisgICAgREVGSU5FX09QQ09ERShvcF9sb29wX3ByZWhlYWRlcikgeworICAgICAgICAv
LyBUaGlzIGlzIGEgbm8tb3AgdW5sZXNzIHdlIGludGVuZCBvbiBkb2luZyBPU1IgZnJvbSB0aGUg
aW50ZXJwcmV0ZXIuCisgICAgICAgIHZQQyArPSBPUENPREVfTEVOR1RIKG9wX2xvb3BfcHJlaGVh
ZGVyKTsKKyAgICAgICAgTkVYVF9JTlNUUlVDVElPTigpOworICAgIH0KICAgICBERUZJTkVfT1BD
T0RFKG9wX2xvb3BfaWZfdHJ1ZSkgewogICAgICAgICAvKiBsb29wX2lmX3RydWUgY29uZChyKSB0
YXJnZXQob2Zmc2V0KQogICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0
L0pJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3Bw
CShyZXZpc2lvbiAxMDY3NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEwMSw4ICsxMDEsMTAgQEAgdm9pZCBKSVQ6OmVtaXRPcHRpbWl6
YXRpb25DaGVjayhPcHRpbWl6YQogICAgIAogICAgIEp1bXAgc2tpcE9wdGltaXplID0gYnJhbmNo
QWRkMzIoU2lnbmVkLCBUcnVzdGVkSW1tMzIoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sg
PyBPcHRpb25zOjpleGVjdXRpb25Db3VudGVySW5jcmVtZW50Rm9yTG9vcCA6IE9wdGlvbnM6OmV4
ZWN1dGlvbkNvdW50ZXJJbmNyZW1lbnRGb3JSZXR1cm4pLCBBYnNvbHV0ZUFkZHJlc3MobV9jb2Rl
QmxvY2stPmFkZHJlc3NPZkpJVEV4ZWN1dGVDb3VudGVyKCkpKTsKICAgICBKSVRTdHViQ2FsbCBz
dHViQ2FsbCh0aGlzLCBraW5kID09IExvb3BPcHRpbWl6YXRpb25DaGVjayA/IGN0aV9vcHRpbWl6
ZV9mcm9tX2xvb3AgOiBjdGlfb3B0aW1pemVfZnJvbV9yZXQpOwotICAgIGlmIChraW5kID09IExv
b3BPcHRpbWl6YXRpb25DaGVjaykKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIo
bV9ieXRlY29kZU9mZnNldCkpOworICAgIGlmIChraW5kID09IExvb3BPcHRpbWl6YXRpb25DaGVj
aykgeworICAgICAgICBJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uID0gbV9jb2RlQmxv
Y2stPmluc3RydWN0aW9ucygpLmJlZ2luKCkgKyBtX2J5dGVjb2RlT2Zmc2V0OworICAgICAgICBz
dHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMihtX2J5dGVjb2RlT2Zmc2V0ICsgY3VycmVudEluc3Ry
dWN0aW9uWzFdLnUub3BlcmFuZCkpOworICAgIH0KICAgICBzdHViQ2FsbC5jYWxsKCk7CiAgICAg
c2tpcE9wdGltaXplLmxpbmsodGhpcyk7CiB9CkBAIC0yOTEsNiArMjkzLDcgQEAgdm9pZCBKSVQ6
OnByaXZhdGVDb21waWxlTWFpblBhc3MoKQogICAgICAgICBERUZJTkVfT1Aob3BfanRydWUpCiAg
ICAgICAgIERFRklORV9PUChvcF9sb29wKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9oaW50
KQorICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9wcmVoZWFkZXIpCiAgICAgICAgIERFRklORV9P
UChvcF9sb29wX2lmX2xlc3MpCiAgICAgICAgIERFRklORV9PUChvcF9sb29wX2lmX2xlc3NlcSkK
ICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaWZfZ3JlYXRlcikKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9qaXQvSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2ppdC9KSVQuaAkocmV2aXNpb24gMTA2NzcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2pp
dC9KSVQuaAkod29ya2luZyBjb3B5KQpAQCAtODIxLDYgKzgyMSw3IEBAIG5hbWVzcGFjZSBKU0Mg
ewogICAgICAgICB2b2lkIGVtaXRfb3BfanRydWUoSW5zdHJ1Y3Rpb24qKTsKICAgICAgICAgdm9p
ZCBlbWl0X29wX2xvb3AoSW5zdHJ1Y3Rpb24qKTsKICAgICAgICAgdm9pZCBlbWl0X29wX2xvb3Bf
aGludChJbnN0cnVjdGlvbiopOworICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9wcmVoZWFkZXIo
SW5zdHJ1Y3Rpb24qKTsKICAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfbGVzcyhJbnN0cnVj
dGlvbiopOwogICAgICAgICB2b2lkIGVtaXRfb3BfbG9vcF9pZl9sZXNzZXEoSW5zdHJ1Y3Rpb24q
KTsKICAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfZ3JlYXRlcihJbnN0cnVjdGlvbiopOwpA
QCAtMTEwMiw2ICsxMTAzLDEwIEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBlbWl0T3B0aW1p
emF0aW9uQ2hlY2soTG9vcE9wdGltaXphdGlvbkNoZWNrKTsKICAgICB9CiAKKyAgICBpbmxpbmUg
dm9pZCBKSVQ6OmVtaXRfb3BfbG9vcF9wcmVoZWFkZXIoSW5zdHJ1Y3Rpb24qKQorICAgIHsKKyAg
ICB9CisKICAgICBpbmxpbmUgdm9pZCBKSVQ6OmVtaXRfb3BfbG9vcF9pZl90cnVlKEluc3RydWN0
aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiAgICAgewogICAgICAgICBlbWl0VGltZW91dENoZWNr
KCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129185</attachid>
            <date>2012-02-27 21:41:00 -0800</date>
            <delta_ts>2012-02-27 21:41:00 -0800</delta_ts>
            <desc>Rebase</desc>
            <filename>76770.16.patch</filename>
            <type>text/plain</type>
            <size>119300</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTA5MDcyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2NCBA
QAorMjAxMi0wMi0yNyAgWXVxaWFuZyBYaWFuICA8eXVxaWFuZy54aWFuQGludGVsLmNvbT4KKwor
ICAgICAgICBMb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBpbiBKU0MgREZHCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3MuCisK
KyAgICAgICAgVGhlIGZyYW1ld29yayB0byBzdXBwb3J0IG1vdmluZyBhIERGRyBub2RlIChhbmQg
dGhlIG5vZGVzIGNoYWluZWQgd2l0aAorICAgICAgICByZWZlcmVuY2VzKSB0byBhIGRpZmZlcmVu
dCBiYXNpYyBibG9jayBpcyBzdXBwb3NlZCB0byB3b3JrLCBhcyB3ZWxsIGFzCisgICAgICAgIHRo
ZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBjcm9zcy1ibG9jayByZWZlcmVuY2VzLgorICAgICAgICBB
IGJhc2ljIGJsb2NrIGRvbWluYW5jZSBhbmFseXNpcyBhbGdvcml0aG0gaXMgaW50cm9kdWNlZCB0
byBkZXRlcm1pbmUKKyAgICAgICAgd2hpY2ggbG9vcCBibG9ja3Mgc2hvdWxkIGJlIGNvbnNpZGVy
ZWQgZm9yIGNvZGUgbW90aW9uOiB0aGUgYmxvY2tzCisgICAgICAgIHRoYXQgZG9taW5hdGUgdGhl
IGxvb3AgZXhpdC4KKyAgICAgICAgU2lkZSBlZmZlY3RzIGFuYWx5c2lzIG9mIGEgbG9vcCBpcyBw
ZXJmb3JtZWQgdG8gZmluZCBvdXQgaWYgdGhlcmUncmUKKyAgICAgICAgcG9zc2libGUgbW9kaWZp
Y2F0aW9ucyB0byB0aGUgcHJvcGVydGllcyBvciB0aGUgc3RydWN0dXJlcywgYW5kIGlmCisgICAg
ICAgIHRoZXJlJ3JlIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGxvY2FsIG9yIHRoZSBn
bG9iYWwgdmFyaWFibGVzLAorICAgICAgICB0byBoZWxwIHVzIG1vcmUgYWNjdXJhdGVseSBkZXRl
cm1pbmUgd2hldGhlciBhIERGRyBub2RlIGlzIGluZGVlZCBsb29wCisgICAgICAgIGludmFyaWFu
dCBvciBub3QuCisgICAgICAgIFRoZSBQaGkgc3RhY2sgcHJvY2Vzc2luZyBsb2dpYyBpcyBtb3Zl
ZCBmcm9tIERGR0J5dGVDb2RlUGFyc2VyIHRvCisgICAgICAgIERGR0dyYXBoLCBhcyB0aGVyZSds
bCBiZSBuZXcgUGhpIG5vZGVzIHRvIGJlIHByb2Nlc3NlZCBhZnRlciBMSUNNLgorICAgICAgICBT
b21lIENGQSBhbmFseXNpcyBpc3N1ZXMgYWZ0ZXIgTElDTSBpcyBleHBvc2VkIGFuZCBmaXhlZC4K
KyAgICAgICAgVGhlIE9TUiBlbnRyeSBpcyBtb2RpZmllZC4gVGhlcmUncyBhIGRlZGljYXRlZCBs
b29wIHByZWhlYWRlciBibG9jayBhcworICAgICAgICB0aGUgT1NSIGVudHJ5LiBBbHNvIHNvbWUg
Q0ZBIGFuYWx5c2lzIHByb2JsZW1zIHRoYXQgY2F1c2UgT1NSIGZhaWx1cmVzCisgICAgICAgIGFy
ZSBmaXhlZC4gQW5kIGR1ZSB0byB0aGUgZmFjdCB0aGF0IE9TUiBlbnRyeSBjYW4gYmUgaW4gYSBu
ZXN0ZWQgbG9vcCwKKyAgICAgICAgY3VycmVudGx5IExJQ00gaXMgb25seSBwZXJmb3JtZWQgZm9y
IGlubmVybW9zdCBsb29wcy4KKyAgICAgICAgU29tZSB0d2Vha3MgYXJlIG1hZGUgd2hlbiByZWNv
cmRpbmcgdGhlIGxvY2FsIHZhcmlhYmxlcycgc3RhdGVzIGluCisgICAgICAgIGNvZGUgZ2VuZXJh
dGlvbiwgdG8gZW5zdXJlIHRoZSBzdGF0ZXMgYXJlIGNvcnJlY3QgYXQgT1NSIGV4aXQsCisgICAg
ICAgIGVzcGVjaWFsbHkgaWYgdGhlIE9TUiBleGl0IGhhcHBlbnMgaW5zaWRlIGEgbG9vcCB3aGlj
aCBoYXMgaG9pc3RlZAorICAgICAgICBsb29wIGludmFyaWFudHMuCisKKyAgICAgICAgKiBDTWFr
ZUxpc3RzLnR4dDoKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgorICAgICAgICAqIEph
dmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogVGFyZ2V0
LnByaToKKyAgICAgICAgKiBieXRlY29kZS9Db2RlQmxvY2suY3BwOgorICAgICAgICAoSlNDOjpD
b2RlQmxvY2s6OmR1bXApOgorICAgICAgICAqIGJ5dGVjb2RlL09wY29kZS5oOgorICAgICAgICAo
SlNDKToKKyAgICAgICAgKEpTQzo6cGFkT3Bjb2RlTmFtZSk6CisgICAgICAgICogYnl0ZWNvbXBp
bGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHZW5lcmF0
b3I6OmVtaXRMb29wSGludCk6CisgICAgICAgIChKU0MpOgorICAgICAgICAoSlNDOjpCeXRlY29k
ZUdlbmVyYXRvcjo6ZW1pdExvb3BQcmVIZWFkZXIpOgorICAgICAgICAqIGJ5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5oOgorICAgICAgICAoQnl0ZWNvZGVHZW5lcmF0b3IpOgorICAgICAg
ICAqIGJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwOgorICAgICAgICAoSlNDOjpEb1doaWxl
Tm9kZTo6ZW1pdEJ5dGVjb2RlKToKKyAgICAgICAgKEpTQzo6V2hpbGVOb2RlOjplbWl0Qnl0ZWNv
ZGUpOgorICAgICAgICAoSlNDOjpGb3JOb2RlOjplbWl0Qnl0ZWNvZGUpOgorICAgICAgICAoSlND
OjpGb3JJbk5vZGU6OmVtaXRCeXRlY29kZSk6CisgICAgICAgICogZGZnL0RGR0Fic3RyYWN0U3Rh
dGUuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkFic3RyYWN0U3RhdGU6OmJlZ2luQmFzaWNCbG9j
ayk6CisgICAgICAgIChKU0M6OkRGRzo6QWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VGFpbCk6
CisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcDoKKyAgICAgICAgKEJ5dGVDb2Rl
UGFyc2VyKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6Z2V0TG9jYWwpOgor
ICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpnZXRBcmd1bWVudCk6CisgICAgICAg
IChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmZsdXNoQXJndW1lbnQpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAgKERGRyk6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlKToKKyAgICAgICAgKiBkZmcvREZH
Q0ZBUGhhc2UuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkNGQVBoYXNlOjpwZXJmb3JtQmxvY2tD
RkEpOgorICAgICAgICAqIGRmZy9ERkdDU0VQaGFzZS5jcHA6CisgICAgICAgIChDU0VQaGFzZSk6
CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OmltcHVyZUNTRSk6CisgICAgICAgIChKU0M6
OkRGRzo6Q1NFUGhhc2U6Omdsb2JhbFZhckxvYWRFbGltaW5hdGlvbik6CisgICAgICAgIChKU0M6
OkRGRzo6Q1NFUGhhc2U6OmdldEJ5VmFsTG9hZEVsaW1pbmF0aW9uKToKKyAgICAgICAgKEpTQzo6
REZHOjpDU0VQaGFzZTo6Y2hlY2tTdHJ1Y3R1cmVMb2FkRWxpbWluYXRpb24pOgorICAgICAgICAo
SlNDOjpERkc6OkNTRVBoYXNlOjpnZXRCeU9mZnNldExvYWRFbGltaW5hdGlvbik6CisgICAgICAg
IChKU0M6OkRGRzo6Q1NFUGhhc2U6OmdldFByb3BlcnR5U3RvcmFnZUxvYWRFbGltaW5hdGlvbik6
CisgICAgICAgIChKU0M6OkRGRzo6Q1NFUGhhc2U6OmdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2VM
b2FkRWxpbWluYXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OkNTRVBoYXNlOjpwZXJmb3JtTm9k
ZUNTRSk6CisgICAgICAgICogZGZnL0RGR0NhcGFiaWxpdGllcy5oOgorICAgICAgICAoSlNDOjpE
Rkc6OmNhbkNvbXBpbGVPcGNvZGUpOgorICAgICAgICAqIGRmZy9ERkdEcml2ZXIuY3BwOgorICAg
ICAgICAoSlNDOjpERkc6OmNvbXBpbGUpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmR1bXApOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBo
OjpwcmVkaWN0QXJndW1lbnRUeXBlcyk6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OkdyYXBoOjpwcm9jZXNzUGhpU3RhY2spOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5oOgor
ICAgICAgICAoTG9vcFByZUhlYWRlcik6CisgICAgICAgIChERkcpOgorICAgICAgICAoSlNDOjpE
Rkc6OlBoaVN0YWNrRW50cnk6OlBoaVN0YWNrRW50cnkpOgorICAgICAgICAoUGhpU3RhY2tFbnRy
eSk6CisgICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmlzUHJlZGljdGVkTnVtZXJpY2FsKToKKyAg
ICAgICAgKEdyYXBoKToKKyAgICAgICAgKEpTQzo6REZHOjpHcmFwaDo6Y29tcGFyZUVxSXNQdXJl
KToKKyAgICAgICAgKEpTQzo6REZHOjpHcmFwaDo6bG9naWNhbE5vdElzUHVyZSk6CisgICAgICAg
IChKU0M6OkRGRzo6R3JhcGg6OmJ5VmFsSXNQdXJlKToKKyAgICAgICAgKEpTQzo6REZHOjpHcmFw
aDo6Y2xvYmJlcnNXb3JsZCk6CisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6CisgICAg
ICAgIChKU0M6OkRGRzo6SklUQ29tcGlsZXI6Om5vdGljZU9TUkVudHJ5KToKKyAgICAgICAgKiBk
ZmcvREZHTElDTVBoYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChERkcpOgorICAgICAgICAoTElD
TVBoYXNlKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6OkxJQ01QaGFzZSk6CisgICAg
ICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpydW4pOgorICAgICAgICAoSlNDOjpERkc6OkxJQ01Q
aGFzZTo6cGVyZm9ybVN1YnN0aXR1dGlvbik6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNl
OjpMb29wU2lkZUVmZmVjdHM6Okxvb3BTaWRlRWZmZWN0cyk6CisgICAgICAgIChMb29wU2lkZUVm
ZmVjdHMpOgorICAgICAgICAoSlNDOjpERkc6OkxJQ01QaGFzZTo6TG9vcFNpZGVFZmZlY3RzOjpj
YW5Ib2lzdEdldEdsb2JhbFZhcik6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29w
U2lkZUVmZmVjdHM6OmNhbkhvaXN0R2V0QnlWYWwpOgorICAgICAgICAoSlNDOjpERkc6OkxJQ01Q
aGFzZTo6TG9vcFNpZGVFZmZlY3RzOjpjYW5Ib2lzdENoZWNrU3RydWN0dXJlKToKKyAgICAgICAg
KEpTQzo6REZHOjpMSUNNUGhhc2U6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRCeU9mZnNl
dCk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6OmNhbkhv
aXN0R2V0UHJvcGVydHlTdG9yYWdlKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6Okxv
b3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRJbmRleGVkUHJvcGVydHlTdG9yYWdlKToKKyAgICAg
ICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6Okxvb3BTaWRlRWZmZWN0czo6Y2FuSG9pc3RHZXRBcnJh
eUxlbmd0aCk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6
OmNhbkhvaXN0R2V0U3RyaW5nTGVuZ3RoKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6
Okxvb3BTaWRlRWZmZWN0czo6Y2xvYmJlckdldEdsb2JhbFZhcik6CisgICAgICAgIChKU0M6OkRG
Rzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRCeVZhbCk6CisgICAgICAg
IChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6OmNsb2JiZXJDaGVja1N0cnVj
dHVyZSk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6OmNs
b2JiZXJHZXRCeU9mZnNldCk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lk
ZUVmZmVjdHM6OmNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UpOgorICAgICAgICAoSlNDOjpERkc6
OkxJQ01QaGFzZTo6TG9vcFNpZGVFZmZlY3RzOjpjbG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3Rv
cmFnZSk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29wU2lkZUVmZmVjdHM6OmNs
b2JiZXJHZXRBcnJheUxlbmd0aCk6CisgICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpMb29w
U2lkZUVmZmVjdHM6OmNsb2JiZXJHZXRTdHJpbmdMZW5ndGgpOgorICAgICAgICAoSlNDOjpERkc6
OkxJQ01QaGFzZTo6YW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyk6CisgICAgICAgIChKU0M6OkRGRzo6
TElDTVBoYXNlOjppc0hvaXN0Q2FuZGlkYXRlKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhh
c2U6Om5vZGVDYW5CZUhvaXN0ZWQpOgorICAgICAgICAoSlNDOjpERkc6OkxJQ01QaGFzZTo6cGVy
Zm9ybUhvaXN0KToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6OmhvaXN0R2V0TG9jYWwp
OgorICAgICAgICAoSlNDOjpERkc6OkxJQ01QaGFzZTo6Zml4SG9pc3RlZENoaWxkV2l0aFNldExv
Y2FsKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6OmZpeEhvaXN0ZWRDaGlsZCk6Cisg
ICAgICAgIChKU0M6OkRGRzo6TElDTVBoYXNlOjpoYW5kbGVIb2lzdGVkQ2hpbGQpOgorICAgICAg
ICAoSlNDOjpERkc6OkxJQ01QaGFzZTo6aXNMb29wUHJlSGVhZGVyQmxvY2spOgorICAgICAgICAo
SlNDOjpERkc6OkxJQ01QaGFzZTo6aW50ZXJzZWN0KToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNN
UGhhc2U6OmNvbXB1dGVEb21pbmF0b3JzKToKKyAgICAgICAgKEpTQzo6REZHOjpMSUNNUGhhc2U6
OnBlcmZvcm1MSUNNRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpwZXJmb3JtTElDTSk6CisgICAg
ICAgICogZGZnL0RGR0xJQ01QaGFzZS5oOiBBZGRlZC4KKyAgICAgICAgKERGRyk6CisgICAgICAg
ICogZGZnL0RGR05vZGUuaDoKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlOjpzZXRWYXJpYWJsZUFj
Y2Vzc0RhdGEpOgorICAgICAgICAoTm9kZSk6CisgICAgICAgICogZGZnL0RGR1ByZWRpY3Rpb25Q
cm9wYWdhdGlvblBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQcmVkaWN0aW9uUHJvcGFn
YXRpb25QaGFzZTo6cHJvcGFnYXRlKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQu
Y3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpjb21waWxlKToKKyAgICAg
ICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVVJbnQzMlRvTnVtYmVyKToKKyAg
ICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHA6CisgICAgICAgIChKU0M6OkRG
Rzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2
ZUpJVDY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZSk6
CisgICAgICAgICogZGZnL0RGR1ZpcnR1YWxSZWdpc3RlckFsbG9jYXRpb25QaGFzZS5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6VmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlOjpydW4pOgor
ICAgICAgICAqIGludGVycHJldGVyL0ludGVycHJldGVyLmNwcDoKKyAgICAgICAgKEpTQzo6SW50
ZXJwcmV0ZXI6OnByaXZhdGVFeGVjdXRlKToKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAg
ICAgKEpTQzo6SklUOjplbWl0T3B0aW1pemF0aW9uQ2hlY2spOgorICAgICAgICAoSlNDOjpKSVQ6
OnByaXZhdGVDb21waWxlTWFpblBhc3MpOgorICAgICAgICAqIGppdC9KSVQuaDoKKyAgICAgICAg
KEpJVCk6CisgICAgICAgIChKU0M6OkpJVDo6ZW1pdF9vcF9sb29wX2hpbnQpOgorICAgICAgICAo
SlNDKToKKyAgICAgICAgKEpTQzo6SklUOjplbWl0X29wX2xvb3BfcHJlaGVhZGVyKToKKwogMjAx
Mi0wMi0yNyAgT2xpdmVyIEh1bnQgIDxvbGl2ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIHNwdXRu
aWsvVW5pY29kZS9Vbmljb2RlXzUwMC9TNy4yX0ExLjZfVDEuaHRtbCBjcmFzaGVzIGluIHRoZSBp
bnRlcnByZXRlcgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNp
b24gMTA5MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3Jr
aW5nIGNvcHkpCkBAIC02Nyw2ICs2Nyw3IEBAIFNFVChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAg
ICAgZGZnL0RGR0RyaXZlci5jcHAKICAgICBkZmcvREZHR3JhcGguY3BwCiAgICAgZGZnL0RGR0pJ
VENvbXBpbGVyLmNwcAorICAgIGRmZy9ERkdMSUNNUGhhc2UuY3BwCiAgICAgZGZnL0RGR09TUkVu
dHJ5LmNwcAogICAgIGRmZy9ERkdPU1JFeGl0LmNwcAogICAgIGRmZy9ERkdPU1JFeGl0Q29tcGls
ZXIuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUubGlzdC5hbQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUubGlzdC5hbQko
cmV2aXNpb24gMTA5MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0JKHdvcmtpbmcgY29weSkKQEAgLTE2Nyw2ICsxNjcsOCBAQCBqYXZhc2NyaXB0Y29yZV9z
b3VyY2VzICs9IFwKIAlTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmggXAogCVNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuY3BwIFwKIAlTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmggXAorCVNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHTElDTVBoYXNlLmNwcCBcCisJU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdM
SUNNUGhhc2UuaCBcCiAJU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmggXAogCVNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZVJlZmVyZW5jZUJsb2IuaCBcCiAJU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlVXNlLmggXApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL1RhcmdldC5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL1Rh
cmdldC5wcmkJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9UYXJn
ZXQucHJpCSh3b3JraW5nIGNvcHkpCkBAIC05NCw2ICs5NCw3IEBAIFNPVVJDRVMgKz0gXAogICAg
IGRmZy9ERkdEcml2ZXIuY3BwIFwKICAgICBkZmcvREZHR3JhcGguY3BwIFwKICAgICBkZmcvREZH
SklUQ29tcGlsZXIuY3BwIFwKKyAgICBkZmcvREZHTElDTVBoYXNlLmNwcCBcCiAgICAgZGZnL0RG
R09wZXJhdGlvbnMuY3BwIFwKICAgICBkZmcvREZHT1NSRW50cnkuY3BwIFwKICAgICBkZmcvREZH
T1NSRXhpdC5jcHAgXApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9u
IDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01NSw2ICs1NSw4IEBACiAJCTA4
Q0FCQkE2MTI2NUFCMzkwMEIyMDZDRSAvKiBTdHJpbmdDb25jYXRlbmF0ZS5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg5NkMyOUUxMjY1QUIwOTAwQjFD
REQzIC8qIFN0cmluZ0NvbmNhdGVuYXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJMDhEREE1QzExMjY0NjMxNzAwNzUxNzMyIC8qIFVTdHJpbmdC
dWlsZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
OEREQTVCQjEyNjQ1RjFEMDA3NTE3MzIgLyogVVN0cmluZ0J1aWxkZXIuaCAqLzsgc2V0dGluZ3Mg
PSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwOEUyNzlFOTBFRjgzQjEwMDA3
REI1MjMgLyogUmFuZG9tTnVtYmVyU2VlZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMDhFMjc5RTgwRUY4M0IxMDAwN0RCNTIzIC8qIFJhbmRvbU51bWJl
clNlZWQuaCAqLzsgfTsKKwkJMEE0MzM3QTExNEZDOTE0MzAwOTkxQzk1IC8qIERGR0xJQ01QaGFz
ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQTQz
MzdBMDE0RkM5MTQzMDA5OTFDOTUgLyogREZHTElDTVBoYXNlLmNwcCAqLzsgfTsKKwkJMEE0MzM3
QTQxNEZDOTE1MjAwOTkxQzk1IC8qIERGR0xJQ01QaGFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEE0MzM3QTMxNEZDOTE1MjAwOTkxQzk1IC8qIERG
R0xJQ01QaGFzZS5oICovOyB9OwogCQkwQjMzMEMyNzBGMzhDNjIzMDA2OTJERTMgLyogVHlwZVRy
YWl0cy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
QjMzMEMyNjBGMzhDNjIzMDA2OTJERTMgLyogVHlwZVRyYWl0cy5jcHAgKi87IH07CiAJCTBCNEQ3
RTYzMEYzMTlBQzgwMEFEN0U1OCAvKiBUeXBlVHJhaXRzLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQjREN0U2MjBGMzE5QUM4MDBBRDdFNTggLyogVHlw
ZVRyYWl0cy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAJCTBCQUM5NEEwMTMzODcyODQwMENGMTM1QiAvKiBUaHJlYWRSZXN0cmljdGlvblZlcmlmaWVy
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwQkFDOTQ5
RTEzMzg3Mjg0MDBDRjEzNUIgLyogVGhyZWFkUmVzdHJpY3Rpb25WZXJpZmllci5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC05MjEsNiArOTIzLDgg
QEAKIAkJMDg5NkMyOUUxMjY1QUIwOTAwQjFDREQzIC8qIFN0cmluZ0NvbmNhdGVuYXRlLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFN0cmluZ0NvbmNhdGVuYXRlLmg7IHBhdGgg
PSB0ZXh0L1N0cmluZ0NvbmNhdGVuYXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTA4RERBNUJCMTI2NDVGMUQwMDc1MTczMiAvKiBVU3RyaW5nQnVpbGRlci5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBVU3RyaW5nQnVpbGRlci5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwOEUyNzlFODBFRjgzQjEwMDA3REI1MjMgLyogUmFuZG9tTnVtYmVyU2Vl
ZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSYW5kb21OdW1iZXJTZWVkLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBBNDMzN0EwMTRGQzkxNDMwMDk5MUM5NSAv
KiBERkdMSUNNUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0g
REZHTElDTVBoYXNlLmNwcDsgcGF0aCA9IGRmZy9ERkdMSUNNUGhhc2UuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQkwQTQzMzdBMzE0RkM5MTUyMDA5OTFDOTUgLyogREZHTElDTVBo
YXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0xJQ01QaGFzZS5oOyBw
YXRoID0gZGZnL0RGR0xJQ01QaGFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
QjMzMEMyNjBGMzhDNjIzMDA2OTJERTMgLyogVHlwZVRyYWl0cy5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBUeXBlVHJhaXRzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJMEI0RDdFNjIwRjMxOUFDODAwQUQ3RTU4IC8qIFR5cGVUcmFpdHMuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHlwZVRyYWl0cy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkwQkFDOTQ5RTEzMzg3Mjg0MDBDRjEzNUIgLyogVGhyZWFkUmVzdHJp
Y3Rpb25WZXJpZmllci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUaHJlYWRS
ZXN0cmljdGlvblZlcmlmaWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNjg5
LDYgKzI2OTMsOCBAQAogCQkJCTg2RUM5REI4MTMyOERGODIwMDJCMkFENyAvKiBERkdHcmFwaC5o
ICovLAogCQkJCTg2RUM5REJCMTMyOERGODIwMDJCMkFENyAvKiBERkdKSVRDb21waWxlci5jcHAg
Ki8sCiAJCQkJODZFQzlEQkMxMzI4REY4MjAwMkIyQUQ3IC8qIERGR0pJVENvbXBpbGVyLmggKi8s
CisJCQkJMEE0MzM3QTAxNEZDOTE0MzAwOTkxQzk1IC8qIERGR0xJQ01QaGFzZS5jcHAgKi8sCisJ
CQkJMEE0MzM3QTMxNEZDOTE1MjAwOTkxQzk1IC8qIERGR0xJQ01QaGFzZS5oICovLAogCQkJCTg2
RUNBM0U5MTMyREVGMUMwMDJCMkFENyAvKiBERkdOb2RlLmggKi8sCiAJCQkJMEY2NkUxNjgxNERG
M0YxMzAwQjdCMkU0IC8qIERGR05vZGVSZWZlcmVuY2VCbG9iLmggKi8sCiAJCQkJMEY2NkUxNjkx
NERGM0YxMzAwQjdCMkU0IC8qIERGR05vZGVVc2UuaCAqLywKQEAgLTM0MDUsNiArMzQxMSw3IEBA
CiAJCQkJMEZCNTQ2NzcxNEY1OUI1QzAwMkMyOTg5IC8qIExhenlPcGVyYW5kVmFsdWVQcm9maWxl
LmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkI1NDY3QjE0RjVDN0UxMDAyQzI5ODkgLyogTWV0aG9k
T2ZHZXR0aW5nQVZhbHVlUHJvZmlsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCNTQ2OTAxNEZB
REE3QjAwMkMyOTg5IC8qIFJlZkNvdW50ZWRBcnJheS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEE0
MzM3QTQxNEZDOTE1MjAwOTkxQzk1IC8qIERGR0xJQ01QaGFzZS5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBA
IC00MDE0LDYgKzQwMjEsNyBAQAogCQkJCTBGRkZDOTVGMTRFRjkwQkIwMEM3MjUzMiAvKiBERkdW
aXJ0dWFsUmVnaXN0ZXJBbGxvY2F0aW9uUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZC
NTQ2NzkxNEY1QzQ2QjAwMkMyOTg5IC8qIExhenlPcGVyYW5kVmFsdWVQcm9maWxlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTBGQjU0NjdEMTRGNUNGRDYwMDJDMjk4OSAvKiBNZXRob2RPZkdldHRp
bmdBVmFsdWVQcm9maWxlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTBBNDMzN0ExMTRGQzkxNDMw
MDk5MUM5NSAvKiBERkdMSUNNUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVu
T25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkocmV2aXNpb24gMTA5MDYy
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEwOTIsNyArMTA5MiwxMiBAQCB2b2lkIENvZGVCbG9jazo6ZHVtcChFeGVj
U3RhdGUqIGV4ZWMsIGNvCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBj
YXNlIG9wX2xvb3BfaGludDogewotICAgICAgICAgICAgZGF0YUxvZygiWyU0ZF0gbG9vcF9oaW50
XG4iLCBsb2NhdGlvbik7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKCsraXQpLT51Lm9wZXJh
bmQ7CisgICAgICAgICAgICBkYXRhTG9nKCJbJTRkXSBsb29wX2hpbnRcdCAlZFxuIiwgbG9jYXRp
b24sIGxvY2F0aW9uICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIGRhdGFMb2coIlsl
NGRdIGxvb3BfcHJlaGVhZGVyXG4iLCBsb2NhdGlvbik7CiAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgfQogICAgICAgICBjYXNlIG9wX3N3aXRjaF9pbW06IHsKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvZGUvT3Bjb2RlLmgJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMTU3LDcg
KzE1Nyw4IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICBtYWNybyhvcF9sb29wX2lmX2xlc3Nl
cSwgNCkgXAogICAgICAgICBtYWNybyhvcF9sb29wX2lmX2dyZWF0ZXIsIDQpIFwKICAgICAgICAg
bWFjcm8ob3BfbG9vcF9pZl9ncmVhdGVyZXEsIDQpIFwKLSAgICAgICAgbWFjcm8ob3BfbG9vcF9o
aW50LCAxKSBcCisgICAgICAgIG1hY3JvKG9wX2xvb3BfaGludCwgMikgXAorICAgICAgICBtYWNy
byhvcF9sb29wX3ByZWhlYWRlciwgMSkgXAogICAgICAgICBtYWNybyhvcF9zd2l0Y2hfaW1tLCA0
KSBcCiAgICAgICAgIG1hY3JvKG9wX3N3aXRjaF9jaGFyLCA0KSBcCiAgICAgICAgIG1hY3JvKG9w
X3N3aXRjaF9zdHJpbmcsIDQpIFwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29t
cGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAxMDkw
NjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJh
dG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYzLDEwICs2NjMsMTkgQEAgVmFsdWVQcm9maWxl
KiBCeXRlY29kZUdlbmVyYXRvcjo6ZW1pdFBybwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXZv
aWQgQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wSGludCgpCit2b2lkIEJ5dGVjb2RlR2VuZXJh
dG9yOjplbWl0TG9vcEhpbnQoTGFiZWwqIHByZUhlYWRlcikKIHsKICNpZiBFTkFCTEUoREZHX0pJ
VCkKKyAgICBzaXplX3QgYmVnaW4gPSBpbnN0cnVjdGlvbnMoKS5zaXplKCk7CiAgICAgZW1pdE9w
Y29kZShvcF9sb29wX2hpbnQpOworICAgIGluc3RydWN0aW9ucygpLmFwcGVuZChwcmVIZWFkZXIt
PmJpbmQoYmVnaW4sIGluc3RydWN0aW9ucygpLnNpemUoKSkpOworI2VuZGlmCit9CisKK3ZvaWQg
Qnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRMb29wUHJlSGVhZGVyKCkKK3sKKyNpZiBFTkFCTEUoREZH
X0pJVCkKKyAgICBlbWl0T3Bjb2RlKG9wX2xvb3BfcHJlaGVhZGVyKTsKICNlbmRpZgogfQogCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9y
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5oCShyZXZpc2lvbiAxMDkwNjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3
MSw3ICs0NzEsOCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgdm9pZCBlbWl0VG9QcmltaXRp
dmUoUmVnaXN0ZXJJRCogZHN0LCBSZWdpc3RlcklEKiBzcmMpOwogCiAgICAgICAgIFBhc3NSZWZQ
dHI8TGFiZWw+IGVtaXRMYWJlbChMYWJlbCopOwotICAgICAgICB2b2lkIGVtaXRMb29wSGludCgp
OworICAgICAgICB2b2lkIGVtaXRMb29wSGludChMYWJlbCogcHJlSGVhZGVyKTsKKyAgICAgICAg
dm9pZCBlbWl0TG9vcFByZUhlYWRlcigpOwogICAgICAgICBQYXNzUmVmUHRyPExhYmVsPiBlbWl0
SnVtcChMYWJlbCogdGFyZ2V0KTsKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdEp1bXBJ
ZlRydWUoUmVnaXN0ZXJJRCogY29uZCwgTGFiZWwqIHRhcmdldCk7CiAgICAgICAgIFBhc3NSZWZQ
dHI8TGFiZWw+IGVtaXRKdW1wSWZGYWxzZShSZWdpc3RlcklEKiBjb25kLCBMYWJlbCogdGFyZ2V0
KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2Vu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05v
ZGVzQ29kZWdlbi5jcHAJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29tcGlsZXIvTm9kZXNDb2RlZ2VuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUxOSw5
ICsxNTE5LDEzIEBAIFJlZ2lzdGVySUQqIERvV2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUoQnkKIHsK
ICAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0b3IubmV3TGFiZWxTY29wZShM
YWJlbFNjb3BlOjpMb29wKTsKIAorICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhlYWRlciA9IGdl
bmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFByZUhlYWRl
ci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CisKICAgICBSZWZQ
dHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAgIGdlbmVyYXRv
ci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvb3BIaW50
KCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludChsb29wUHJlSGVhZGVyLmdldCgpKTsKICAg
ICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5l
KCksIGxhc3RMaW5lKCkpOwogICAgCiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGdl
bmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fc3RhdGVtZW50KTsKQEAgLTE1NDUsMTUgKzE1NDksMTgg
QEAgUmVnaXN0ZXJJRCogV2hpbGVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZQogewogICAgIFJlZlB0
cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVsU2NvcGU6
Okxvb3ApOwogCisgICAgUmVmUHRyPExhYmVsPiBsb29wUHJlSGVhZGVyID0gZ2VuZXJhdG9yLm5l
d0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wUHJlSGVhZGVyLmdldCgpKTsK
KyAgICBnZW5lcmF0b3IuZW1pdExvb3BQcmVIZWFkZXIoKTsKICAgICBnZW5lcmF0b3IuZW1pdEp1
bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwogCiAgICAgUmVmUHRyPExhYmVsPiB0b3BPZkxv
b3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHRvcE9m
TG9vcC5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludCgpOwotICAgIAorCiAgICAg
Z2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOwogCiAgICAgZ2VuZXJhdG9yLmVt
aXRMYWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29w
SGludChsb29wUHJlSGVhZGVyLmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhX
aWxsRXhlY3V0ZVN0YXRlbWVudCwgbV9leHByLT5saW5lTm8oKSwgbV9leHByLT5saW5lTm8oKSk7
CiAKICAgICBpZiAobV9leHByLT5oYXNDb25kaXRpb25Db250ZXh0Q29kZWdlbigpKQpAQCAtMTU4
MCwxMiArMTU4NywxNSBAQCBSZWdpc3RlcklEKiBGb3JOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNv
CiAgICAgaWYgKG1fZXhwcjEpCiAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShnZW5lcmF0b3Iu
aWdub3JlZFJlc3VsdCgpLCBtX2V4cHIxKTsKIAorICAgIFJlZlB0cjxMYWJlbD4gbG9vcFByZUhl
YWRlciA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9v
cFByZUhlYWRlci5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wUHJlSGVhZGVyKCk7CisK
ICAgICBSZWZQdHI8TGFiZWw+IGNvbmRpdGlvbiA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwogICAg
IGdlbmVyYXRvci5lbWl0SnVtcChjb25kaXRpb24uZ2V0KCkpOwogCiAgICAgUmVmUHRyPExhYmVs
PiB0b3BPZkxvb3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBnZW5lcmF0b3IuZW1pdExh
YmVsKHRvcE9mTG9vcC5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludCgpOwogCiAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlc3VsdCA9IGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1f
c3RhdGVtZW50KTsKIApAQCAtMTU5NSw2ICsxNjA1LDcgQEAgUmVnaXN0ZXJJRCogRm9yTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjbwogICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9y
Lmlnbm9yZWRSZXN1bHQoKSwgbV9leHByMyk7CiAKICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGNv
bmRpdGlvbi5nZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb29wSGludChsb29wUHJlSGVhZGVy
LmdldCgpKTsKICAgICBpZiAobV9leHByMikgewogICAgICAgICBpZiAobV9leHByMi0+aGFzQ29u
ZGl0aW9uQ29udGV4dENvZGVnZW4oKSkKICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZUlu
Q29uZGl0aW9uQ29udGV4dChtX2V4cHIyLCB0b3BPZkxvb3AuZ2V0KCksIHNjb3BlLT5icmVha1Rh
cmdldCgpLCBmYWxzZSk7CkBAIC0xNjI5LDExICsxNjQwLDE0IEBAIFJlZ2lzdGVySUQqIEZvcklu
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGUKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2l6ZSA9IGdl
bmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZXhwZWN0ZWRT
dWJzY3JpcHQ7CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGl0ZXIgPSBnZW5lcmF0b3IuZW1pdEdl
dFByb3BlcnR5TmFtZXMoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBiYXNlLmdldCgpLCBpLmdl
dCgpLCBzaXplLmdldCgpLCBzY29wZS0+YnJlYWtUYXJnZXQoKSk7CisKKyAgICBSZWZQdHI8TGFi
ZWw+IGxvb3BQcmVIZWFkZXIgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0b3Iu
ZW1pdExhYmVsKGxvb3BQcmVIZWFkZXIuZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcFBy
ZUhlYWRlcigpOwogICAgIGdlbmVyYXRvci5lbWl0SnVtcChzY29wZS0+Y29udGludWVUYXJnZXQo
KSk7CiAKICAgICBSZWZQdHI8TGFiZWw+IGxvb3BTdGFydCA9IGdlbmVyYXRvci5uZXdMYWJlbCgp
OwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobG9vcFN0YXJ0LmdldCgpKTsKLSAgICBnZW5lcmF0
b3IuZW1pdExvb3BIaW50KCk7CiAKICAgICBSZWdpc3RlcklEKiBwcm9wZXJ0eU5hbWU7CiAgICAg
Ym9vbCBvcHRpbWl6ZWRGb3JpbkFjY2VzcyA9IGZhbHNlOwpAQCAtMTY4MCw2ICsxNjk0LDcgQEAg
UmVnaXN0ZXJJRCogRm9ySW5Ob2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZQogICAgICAgICBnZW5lcmF0
b3IucG9wT3B0aW1pc2VkRm9ySW4oKTsKIAogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoc2NvcGUt
PmNvbnRpbnVlVGFyZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0TG9vcEhpbnQobG9vcFByZUhl
YWRlci5nZXQoKSk7CiAgICAgZ2VuZXJhdG9yLmVtaXROZXh0UHJvcGVydHlOYW1lKHByb3BlcnR5
TmFtZSwgYmFzZS5nZXQoKSwgaS5nZXQoKSwgc2l6ZS5nZXQoKSwgaXRlci5nZXQoKSwgbG9vcFN0
YXJ0LmdldCgpKTsKICAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRl
bWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwogICAgIGdlbmVyYXRvci5lbWl0TGFiZWwo
c2NvcGUtPmJyZWFrVGFyZ2V0KCkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdBYnN0cmFjdFN0YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCShyZXZpc2lvbiAxMDkwNjIpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05
Miw4ICs5Miw2IEBAIHZvaWQgQWJzdHJhY3RTdGF0ZTo6YmVnaW5CYXNpY0Jsb2NrKEJhc2kKICAg
ICAgICAgfQogICAgIH0KICAgICAKLSAgICBiYXNpY0Jsb2NrLT5jZmFTaG91bGRSZXZpc2l0ID0g
ZmFsc2U7Ci0gICAgYmFzaWNCbG9jay0+Y2ZhSGFzVmlzaXRlZCA9IHRydWU7CiAgICAgbV9ibG9j
ayA9IGJhc2ljQmxvY2s7CiAgICAgbV9pc1ZhbGlkID0gdHJ1ZTsKIH0KQEAgLTEwMDQsMTUgKzEw
MDIsMjAgQEAgaW5saW5lIGJvb2wgQWJzdHJhY3RTdGF0ZTo6bWVyZ2VTdGF0ZUF0VAogICAgICAg
ICAKICAgICBBYnN0cmFjdFZhbHVlKiBzb3VyY2U7CiAgICAgICAgIAotICAgIE5vZGUmIG5vZGUg
PSBtX2dyYXBoW25vZGVJbmRleF07Ci0gICAgaWYgKCFub2RlLnJlZkNvdW50KCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBOb2RlKiBub2RlUHRyID0gJm1fZ3JhcGhbbm9kZUluZGV4XTsK
KyAgICBpZiAoIW5vZGVQdHItPnJlZkNvdW50KCkpIHsKKyAgICAgICAgaWYgKG5vZGVQdHItPm9w
ID09IEdldExvY2FsKSB7CisgICAgICAgICAgICBBU1NFUlQobm9kZVB0ci0+Y2hpbGQxKCkgIT0g
Tm9Ob2RlKTsKKyAgICAgICAgICAgIG5vZGVQdHIgPSAmbV9ncmFwaFtub2RlUHRyLT5jaGlsZDEo
KV07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAg
ICAKICNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgICAgICAgSXQncyBsaXZlLCBub2RlIEAldS5cbiIsIG5vZGVJbmRleCk7
CiAjZW5kaWYKIAotICAgIHN3aXRjaCAobm9kZS5vcCkgeworICAgIHN3aXRjaCAobm9kZVB0ci0+
b3ApIHsKICAgICBjYXNlIFBoaToKICAgICBjYXNlIFNldEFyZ3VtZW50OgogICAgIGNhc2UgRmx1
c2g6CkBAIC0xMDM0LDcgKzEwMzcsNyBAQCBpbmxpbmUgYm9vbCBBYnN0cmFjdFN0YXRlOjptZXJn
ZVN0YXRlQXRUCiAgICAgY2FzZSBTZXRMb2NhbDoKICAgICAgICAgLy8gVGhlIGJsb2NrIHNldHMg
dGhlIHZhcmlhYmxlLCBhbmQgcG90ZW50aWFsbHkgcmVmaW5lcyBpdCwgYm90aAogICAgICAgICAv
LyBiZWZvcmUgYW5kIGFmdGVyIHNldHRpbmcgaXQuCi0gICAgICAgIHNvdXJjZSA9ICZmb3JOb2Rl
KG5vZGUuY2hpbGQxKCkpOworICAgICAgICBzb3VyY2UgPSAmZm9yTm9kZShub2RlUHRyLT5jaGls
ZDEoKSk7CiAjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAg
ICBkYXRhTG9nKCIgICAgICAgICAgU2V0dGluZy5cbiIpOwogI2VuZGlmCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAkocmV2aXNpb24g
MTA5MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTEwMiwxNCArMTAyLDYgQEAgcHJpdmF0ZToKICAgICAvLyBM
aW5rIGJsb2NrIHN1Y2Nlc3NvcnMuCiAgICAgdm9pZCBsaW5rQmxvY2soQmFzaWNCbG9jayosIFZl
Y3RvcjxCbG9ja0luZGV4PiYgcG9zc2libGVUYXJnZXRzKTsKICAgICB2b2lkIGxpbmtCbG9ja3Mo
VmVjdG9yPFVubGlua2VkQmxvY2s+JiB1bmxpbmtlZEJsb2NrcywgVmVjdG9yPEJsb2NrSW5kZXg+
JiBwb3NzaWJsZVRhcmdldHMpOwotICAgIC8vIExpbmsgR2V0TG9jYWwgJiBTZXRMb2NhbCBub2Rl
cywgdG8gZW5zdXJlIGxpdmUgdmFsdWVzIGFyZSBnZW5lcmF0ZWQuCi0gICAgZW51bSBQaGlTdGFj
a1R5cGUgewotICAgICAgICBMb2NhbFBoaVN0YWNrLAotICAgICAgICBBcmd1bWVudFBoaVN0YWNr
Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZTxQaGlTdGFja1R5cGUgc3RhY2tUeXBlPgotICAgIHZvaWQg
cHJvY2Vzc1BoaVN0YWNrKCk7Ci0gICAgCiAgICAgdm9pZCBmaXhWYXJpYWJsZUFjY2Vzc1ByZWRp
Y3Rpb25zKCk7CiAgICAgLy8gQWRkIHNwaWxsIGxvY2F0aW9ucyB0byBub2Rlcy4KICAgICB2b2lk
IGFsbG9jYXRlVmlydHVhbFJlZ2lzdGVycygpOwpAQCAtMjI1LDcgKzIxNyw3IEBAIHByaXZhdGU6
CiAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogdmFyaWFibGVBY2Nlc3NEYXRhID0gbmV3VmFy
aWFibGVBY2Nlc3NEYXRhKG9wZXJhbmQpOwogICAgICAgICAKICAgICAgICAgTm9kZUluZGV4IHBo
aSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8odmFyaWFibGVBY2Nlc3NEYXRhKSk7Ci0gICAgICAg
IG1fbG9jYWxQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhp
LCBvcGVyYW5kKSk7CisgICAgICAgIG1fZ3JhcGgubV9sb2NhbFBoaVN0YWNrLmFwcGVuZChQaGlT
dGFja0VudHJ5KG1fY3VycmVudEJsb2NrLCBwaGksIG9wZXJhbmQpKTsKICAgICAgICAgbm9kZUlu
ZGV4ID0gaW5qZWN0TGF6eU9wZXJhbmRQcmVkaWN0aW9uKGFkZFRvR3JhcGgoR2V0TG9jYWwsIE9w
SW5mbyh2YXJpYWJsZUFjY2Vzc0RhdGEpLCBwaGkpKTsKICAgICAgICAgbV9jdXJyZW50QmxvY2st
PnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG5vZGVJbmRleDsKICAgICAgICAgCkBA
IC0yOTUsNyArMjg3LDcgQEAgcHJpdmF0ZToKICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2
YXJpYWJsZUFjY2Vzc0RhdGEgPSBuZXdWYXJpYWJsZUFjY2Vzc0RhdGEob3BlcmFuZCk7CiAKICAg
ICAgICAgTm9kZUluZGV4IHBoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcEluZm8odmFyaWFibGVBY2Nl
c3NEYXRhKSk7Ci0gICAgICAgIG1fYXJndW1lbnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRy
eShtX2N1cnJlbnRCbG9jaywgcGhpLCBhcmd1bWVudCkpOworICAgICAgICBtX2dyYXBoLm1fYXJn
dW1lbnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRCbG9jaywgcGhpLCBh
cmd1bWVudCkpOwogICAgICAgICBub2RlSW5kZXggPSBpbmplY3RMYXp5T3BlcmFuZFByZWRpY3Rp
b24oYWRkVG9HcmFwaChHZXRMb2NhbCwgT3BJbmZvKHZhcmlhYmxlQWNjZXNzRGF0YSksIHBoaSkp
OwogICAgICAgICBtX2N1cnJlbnRCbG9jay0+dmFyaWFibGVzQXRUYWlsLmFyZ3VtZW50KGFyZ3Vt
ZW50KSA9IG5vZGVJbmRleDsKICAgICAgICAgCkBAIC0zNTMsMTEgKzM0NSwxMSBAQCBwcml2YXRl
OgogICAgICAgICBOb2RlSW5kZXggcGhpID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyh2YXJpYWJs
ZUFjY2Vzc0RhdGEpKTsKICAgICAgICAgbm9kZUluZGV4ID0gYWRkVG9HcmFwaChGbHVzaCwgT3BJ
bmZvKHZhcmlhYmxlQWNjZXNzRGF0YSksIHBoaSk7CiAgICAgICAgIGlmIChvcGVyYW5kSXNBcmd1
bWVudChvcGVyYW5kKSkgewotICAgICAgICAgICAgbV9hcmd1bWVudFBoaVN0YWNrLmFwcGVuZChQ
aGlTdGFja0VudHJ5KG1fY3VycmVudEJsb2NrLCBwaGksIGluZGV4KSk7CisgICAgICAgICAgICBt
X2dyYXBoLm1fYXJndW1lbnRQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJlbnRC
bG9jaywgcGhpLCBpbmRleCkpOwogICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxl
c0F0VGFpbC5hcmd1bWVudChpbmRleCkgPSBub2RlSW5kZXg7CiAgICAgICAgICAgICBtX2N1cnJl
bnRCbG9jay0+dmFyaWFibGVzQXRIZWFkLnNldEFyZ3VtZW50Rmlyc3RUaW1lKGluZGV4LCBub2Rl
SW5kZXgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9sb2NhbFBoaVN0YWNrLmFw
cGVuZChQaGlTdGFja0VudHJ5KG1fY3VycmVudEJsb2NrLCBwaGksIGluZGV4KSk7CisgICAgICAg
ICAgICBtX2dyYXBoLm1fbG9jYWxQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeShtX2N1cnJl
bnRCbG9jaywgcGhpLCBpbmRleCkpOwogICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlh
Ymxlc0F0VGFpbC5sb2NhbChpbmRleCkgPSBub2RlSW5kZXg7CiAgICAgICAgICAgICBtX2N1cnJl
bnRCbG9jay0+dmFyaWFibGVzQXRIZWFkLnNldExvY2FsRmlyc3RUaW1lKGluZGV4LCBub2RlSW5k
ZXgpOwogICAgICAgICB9CkBAIC04NDQsMjEgKzgzNiw2IEBAIHByaXZhdGU6CiAgICAgLy8gVGhl
IGluZGV4IGluIHRoZSBnbG9iYWwgcmVzb2x2ZSBpbmZvLgogICAgIHVuc2lnbmVkIG1fZ2xvYmFs
UmVzb2x2ZU51bWJlcjsKIAotICAgIHN0cnVjdCBQaGlTdGFja0VudHJ5IHsKLSAgICAgICAgUGhp
U3RhY2tFbnRyeShCYXNpY0Jsb2NrKiBibG9jaywgTm9kZUluZGV4IHBoaSwgdW5zaWduZWQgdmFy
Tm8pCi0gICAgICAgICAgICA6IG1fYmxvY2soYmxvY2spCi0gICAgICAgICAgICAsIG1fcGhpKHBo
aSkKLSAgICAgICAgICAgICwgbV92YXJObyh2YXJObykKLSAgICAgICAgewotICAgICAgICB9Ci0K
LSAgICAgICAgQmFzaWNCbG9jayogbV9ibG9jazsKLSAgICAgICAgTm9kZUluZGV4IG1fcGhpOwot
ICAgICAgICB1bnNpZ25lZCBtX3Zhck5vOwotICAgIH07Ci0gICAgVmVjdG9yPFBoaVN0YWNrRW50
cnksIDE2PiBtX2FyZ3VtZW50UGhpU3RhY2s7Ci0gICAgVmVjdG9yPFBoaVN0YWNrRW50cnksIDE2
PiBtX2xvY2FsUGhpU3RhY2s7Ci0gICAgCiAgICAgc3RydWN0IElubGluZVN0YWNrRW50cnkgewog
ICAgICAgICBCeXRlQ29kZVBhcnNlciogbV9ieXRlQ29kZVBhcnNlcjsKICAgICAgICAgCkBAIC05
NTUsNiArOTMyLDkgQEAgcHJpdmF0ZToKICAgICAKICAgICAvLyBDYWNoZSBvZiBjb2RlIGJsb2Nr
cyB0aGF0IHdlJ3ZlIGdlbmVyYXRlZCBieXRlY29kZSBmb3IuCiAgICAgQnl0ZUNvZGVDYWNoZTxj
YW5JbmxpbmVGdW5jdGlvbkZvcj4gbV9jb2RlQmxvY2tDYWNoZTsKKworICAgIC8vIFN0YWNrIHRv
IHRyYWNrIHRoZSBsb29wcyBlbmNvdW50ZXJlZCBpbiB0aGlzIGNvZGUgYmxvY2sKKyAgICBWZWN0
b3I8QmxvY2tJbmRleD4gbV9sb29wU3RhY2s7CiB9OwogCiAjZGVmaW5lIE5FWFRfT1BDT0RFKG5h
bWUpIFwKQEAgLTE5NzQsNiArMTk1NCw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxv
Y2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9sb29wOiB7CiAgICAgICAgICAgICB1bnNpZ25l
ZCByZWxhdGl2ZU9mZnNldCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CiAgICAg
ICAgICAgICBhZGRUb0dyYXBoKEp1bXAsIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZl
T2Zmc2V0KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fbG9vcFN0YWNrLmlzRW1wdHkoKSk7Cisg
ICAgICAgICAgICBtX2xvb3BTdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgICAgICBMQVNUX09Q
Q09ERShvcF9sb29wKTsKICAgICAgICAgfQogCkBAIC0xOTk1LDYgKzE5NzcsOCBAQCBib29sIEJ5
dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICB1bnNpZ25lZCBy
ZWxhdGl2ZU9mZnNldCA9IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CiAgICAgICAg
ICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9w
ZXJhbmQpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChCcmFuY2gsIE9wSW5mbyhtX2N1cnJlbnRJ
bmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xF
TkdUSChvcF9sb29wX2lmX3RydWUpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCgh
bV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxh
c3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfdHJ1ZSk7CiAgICAgICAg
IH0KIApAQCAtMjAwMiw2ICsxOTg2LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9j
ayh1bnNpZ25lZAogICAgICAgICAgICAgdW5zaWduZWQgcmVsYXRpdmVPZmZzZXQgPSBjdXJyZW50
SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwogICAgICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlv
biA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIGFk
ZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyBPUENPREVfTEVOR1RIKG9w
X2xvb3BfaWZfZmFsc2UpKSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsgcmVsYXRpdmVPZmZzZXQp
LCBjb25kaXRpb24pOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0VtcHR5KCkp
OworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgTEFT
VF9PUENPREUob3BfbG9vcF9pZl9mYWxzZSk7CiAgICAgICAgIH0KIApAQCAtMjA5OSw2ICsyMDg1
LDggQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAg
ICAgTm9kZUluZGV4IG9wMiA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsK
ICAgICAgICAgICAgIE5vZGVJbmRleCBjb25kaXRpb24gPSBhZGRUb0dyYXBoKENvbXBhcmVMZXNz
LCBvcDEsIG9wMik7CiAgICAgICAgICAgICBhZGRUb0dyYXBoKEJyYW5jaCwgT3BJbmZvKG1fY3Vy
cmVudEluZGV4ICsgcmVsYXRpdmVPZmZzZXQpLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyBPUENP
REVfTEVOR1RIKG9wX2xvb3BfaWZfbGVzcykpLCBjb25kaXRpb24pOworICAgICAgICAgICAgQVNT
RVJUKCFtX2xvb3BTdGFjay5pc0VtcHR5KCkpOworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVt
b3ZlTGFzdCgpOwogICAgICAgICAgICAgTEFTVF9PUENPREUob3BfbG9vcF9pZl9sZXNzKTsKICAg
ICAgICAgfQogCkBAIC0yMTA4LDYgKzIwOTYsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICBOb2RlSW5kZXggb3AyID0gZ2V0KGN1cnJlbnRJ
bnN0cnVjdGlvblsyXS51Lm9wZXJhbmQpOwogICAgICAgICAgICAgTm9kZUluZGV4IGNvbmRpdGlv
biA9IGFkZFRvR3JhcGgoQ29tcGFyZUxlc3NFcSwgb3AxLCBvcDIpOwogICAgICAgICAgICAgYWRk
VG9HcmFwaChCcmFuY2gsIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwg
T3BJbmZvKG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2xlc3NlcSkp
LCBjb25kaXRpb24pOworICAgICAgICAgICAgQVNTRVJUKCFtX2xvb3BTdGFjay5pc0VtcHR5KCkp
OworICAgICAgICAgICAgbV9sb29wU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgTEFT
VF9PUENPREUob3BfbG9vcF9pZl9sZXNzZXEpOwogICAgICAgICB9CiAKQEAgLTIxMTcsNiArMjEw
Nyw4IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAg
ICAgIE5vZGVJbmRleCBvcDIgPSBnZXQoY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZCk7
CiAgICAgICAgICAgICBOb2RlSW5kZXggY29uZGl0aW9uID0gYWRkVG9HcmFwaChDb21wYXJlR3Jl
YXRlciwgb3AxLCBvcDIpOwogICAgICAgICAgICAgYWRkVG9HcmFwaChCcmFuY2gsIE9wSW5mbyht
X2N1cnJlbnRJbmRleCArIHJlbGF0aXZlT2Zmc2V0KSwgT3BJbmZvKG1fY3VycmVudEluZGV4ICsg
T1BDT0RFX0xFTkdUSChvcF9sb29wX2lmX2dyZWF0ZXIpKSwgY29uZGl0aW9uKTsKKyAgICAgICAg
ICAgIEFTU0VSVCghbV9sb29wU3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0
YWNrLnJlbW92ZUxhc3QoKTsKICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfZ3Jl
YXRlcik7CiAgICAgICAgIH0KIApAQCAtMjEyNiw2ICsyMTE4LDggQEAgYm9vbCBCeXRlQ29kZVBh
cnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgTm9kZUluZGV4IG9wMiA9IGdl
dChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kKTsKICAgICAgICAgICAgIE5vZGVJbmRl
eCBjb25kaXRpb24gPSBhZGRUb0dyYXBoKENvbXBhcmVHcmVhdGVyRXEsIG9wMSwgb3AyKTsKICAg
ICAgICAgICAgIGFkZFRvR3JhcGgoQnJhbmNoLCBPcEluZm8obV9jdXJyZW50SW5kZXggKyByZWxh
dGl2ZU9mZnNldCksIE9wSW5mbyhtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfbG9v
cF9pZl9ncmVhdGVyZXEpKSwgY29uZGl0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9sb29w
U3RhY2suaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbG9vcFN0YWNrLnJlbW92ZUxhc3QoKTsK
ICAgICAgICAgICAgIExBU1RfT1BDT0RFKG9wX2xvb3BfaWZfZ3JlYXRlcmVxKTsKICAgICAgICAg
fQogCkBAIC0yMjE2LDcgKzIyMTAsMTcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9j
ayh1bnNpZ25lZAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBvcF9sb29wX2hpbnQ6IHsKLSAg
ICAgICAgICAgIC8vIEJhc2VsaW5lLT5ERkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBoaW50cy4g
VGhlIERGRyBhc3N1bWVzIHRoYXQgQmFzZWxpbmUtPkRGRworICAgICAgICAgICAgQVNTRVJUX1VO
VVNFRChibG9ja0JlZ2luLCBtX2N1cnJlbnRJbmRleCA9PSBibG9ja0JlZ2luKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgLy8gRW1pdCBhIHBoYW50b20gbm9kZSB0byBlbnN1cmUgdGhhdCB0
aGVyZSBpcyBhIHBsYWNlaG9sZGVyIG5vZGUgZm9yIHRoaXMgYnl0ZWNvZGUKKyAgICAgICAgICAg
IC8vIG9wLgorICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tKTsKKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgTkVYVF9PUENPREUob3BfbG9vcF9oaW50KTsKKyAgICAgICAgfQorCisgICAg
ICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFkZXI6IHsKKyAgICAgICAgICAgIC8vIEJhc2VsaW5lLT5E
RkcgT1NSIGp1bXBzIGJldHdlZW4gbG9vcCBwcmVoZWFkZXJzLiBUaGUgREZHIGFzc3VtZXMgdGhh
dCBCYXNlbGluZS0+REZHCiAgICAgICAgICAgICAvLyBPU1IgY2FuIG9ubHkgaGFwcGVuIGF0IGJh
c2ljIGJsb2NrIGJvdW5kYXJpZXMuIEFzc2VydCB0aGF0IHRoZXNlIHR3byBzdGF0ZW1lbnRzCiAg
ICAgICAgICAgICAvLyBhcmUgY29tcGF0aWJsZS4KICAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQo
YmxvY2tCZWdpbiwgbV9jdXJyZW50SW5kZXggPT0gYmxvY2tCZWdpbik7CkBAIC0yMjMxLDcgKzIy
MzUsMTMgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAg
ICAgICAgLy8gb3AuCiAgICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20pOwogICAgICAgICAg
ICAgCi0gICAgICAgICAgICBORVhUX09QQ09ERShvcF9sb29wX2hpbnQpOworICAgICAgICAgICAg
QmxvY2tJbmRleCBjdXJyZW50QmxvY2sgPSBtX2dyYXBoLm1fYmxvY2tzLnNpemUoKSAtIDE7Cisg
ICAgICAgICAgICBCbG9ja0luZGV4IG91dGVyTG9vcCA9IG1fbG9vcFN0YWNrLmlzRW1wdHkoKSA/
IE5vQmxvY2sgOiBtX2xvb3BTdGFjay5sYXN0KCk7CisgICAgICAgICAgICBtX2xvb3BTdGFjay5h
cHBlbmQoY3VycmVudEJsb2NrKTsKKyAgICAgICAgICAgIExvb3BQcmVIZWFkZXIgcHJlSGVhZGVy
ID0ge2N1cnJlbnRCbG9jaywgb3V0ZXJMb29wfTsKKyAgICAgICAgICAgIG1fZ3JhcGgubV9sb29w
UHJlSGVhZGVycy5hcHBlbmQocHJlSGVhZGVyKTsKKworICAgICAgICAgICAgTkVYVF9PUENPREUo
b3BfbG9vcF9wcmVoZWFkZXIpOwogICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgY2Fz
ZSBvcF9pbml0X2xhenlfcmVnOiB7CkBAIC0yMjgxLDE1MCArMjI5MSw2IEBAIGJvb2wgQnl0ZUNv
ZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICB9CiB9CiAKLXRlbXBsYXRlPEJ5dGVD
b2RlUGFyc2VyOjpQaGlTdGFja1R5cGUgc3RhY2tUeXBlPgotdm9pZCBCeXRlQ29kZVBhcnNlcjo6
cHJvY2Vzc1BoaVN0YWNrKCkKLXsKLSAgICBWZWN0b3I8UGhpU3RhY2tFbnRyeSwgMTY+JiBwaGlT
dGFjayA9IChzdGFja1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykgPyBtX2FyZ3VtZW50UGhpU3Rh
Y2sgOiBtX2xvY2FsUGhpU3RhY2s7Ci0KLSAgICB3aGlsZSAoIXBoaVN0YWNrLmlzRW1wdHkoKSkg
ewotICAgICAgICBQaGlTdGFja0VudHJ5IGVudHJ5ID0gcGhpU3RhY2subGFzdCgpOwotICAgICAg
ICBwaGlTdGFjay5yZW1vdmVMYXN0KCk7Ci0gICAgICAgIAotICAgICAgICBQcmVkZWNlc3Nvckxp
c3QmIHByZWRlY2Vzc29ycyA9IGVudHJ5Lm1fYmxvY2stPm1fcHJlZGVjZXNzb3JzOwotICAgICAg
ICB1bnNpZ25lZCB2YXJObyA9IGVudHJ5Lm1fdmFyTm87Ci0gICAgICAgIFZhcmlhYmxlQWNjZXNz
RGF0YSogZGF0YUZvclBoaSA9IG1fZ3JhcGhbZW50cnkubV9waGldLnZhcmlhYmxlQWNjZXNzRGF0
YSgpOwotCi0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAg
ICBkYXRhTG9nKCIgICBIYW5kbGluZyBwaGkgZW50cnkgZm9yIHZhciAldSwgcGhpIEAldS5cbiIs
IGVudHJ5Lm1fdmFyTm8sIGVudHJ5Lm1fcGhpKTsKLSNlbmRpZgotCi0gICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgcHJlZGVjZXNzb3JzLnNpemUoKTsgKytpKSB7Ci0jaWYgREZHX0VOQUJM
RShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAgZGF0YUxvZygiICAgICBE
ZWFsaW5nIHdpdGggcHJlZGVjZXNzb3IgYmxvY2sgJXUuXG4iLCBwcmVkZWNlc3NvcnNbaV0pOwot
I2VuZGlmCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJhc2ljQmxvY2sqIHByZWRlY2Vzc29y
QmxvY2sgPSBtX2dyYXBoLm1fYmxvY2tzW3ByZWRlY2Vzc29yc1tpXV0uZ2V0KCk7Ci0KLSAgICAg
ICAgICAgIE5vZGVJbmRleCYgdmFyID0gKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrKSA/
IHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudCh2YXJObykgOiBwcmVk
ZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdFRhaWwubG9jYWwodmFyTm8pOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICBOb2RlSW5kZXggdmFsdWVJblByZWRlY2Vzc29yID0gdmFyOwotICAgICAg
ICAgICAgaWYgKHZhbHVlSW5QcmVkZWNlc3NvciA9PSBOb05vZGUpIHsKLSNpZiBERkdfRU5BQkxF
KERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAg
ICAgRGlkIG5vdCBmaW5kIG5vZGUsIGFkZGluZyBwaGkuXG4iKTsKLSNlbmRpZgotCi0gICAgICAg
ICAgICAgICAgdmFsdWVJblByZWRlY2Vzc29yID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyhuZXdW
YXJpYWJsZUFjY2Vzc0RhdGEoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhpU3RhY2sgPyBhcmd1bWVu
dFRvT3BlcmFuZCh2YXJObykgOiBzdGF0aWNfY2FzdDxpbnQ+KHZhck5vKSkpKTsKLSAgICAgICAg
ICAgICAgICB2YXIgPSB2YWx1ZUluUHJlZGVjZXNzb3I7Ci0gICAgICAgICAgICAgICAgaWYgKHN0
YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrKQotICAgICAgICAgICAgICAgICAgICBwcmVkZWNl
c3NvckJsb2NrLT52YXJpYWJsZXNBdEhlYWQuc2V0QXJndW1lbnRGaXJzdFRpbWUodmFyTm8sIHZh
bHVlSW5QcmVkZWNlc3Nvcik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
ICAgICBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdEhlYWQuc2V0TG9jYWxGaXJzdFRpbWUo
dmFyTm8sIHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0gICAgICAgICAgICAgICAgcGhpU3RhY2suYXBw
ZW5kKFBoaVN0YWNrRW50cnkocHJlZGVjZXNzb3JCbG9jaywgdmFsdWVJblByZWRlY2Vzc29yLCB2
YXJObykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtX2dyYXBoW3ZhbHVlSW5QcmVkZWNlc3Nv
cl0ub3AgPT0gR2V0TG9jYWwpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZF
UkJPU0UpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgRm91bmQgR2V0TG9jYWwgQCV1
LlxuIiwgdmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLy8g
V2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcmUgaWRlbnRp
Y2FsIGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgICAgLy8gR2V0TG9jYWwgYW5kIGl0cyBibG9j
ay1sb2NhbCBQaGkuIFN0cmljdGx5IHNwZWFraW5nIHdlIG9ubHkgbmVlZCB0aGUgdHdvCi0gICAg
ICAgICAgICAgICAgLy8gdG8gYmUgdW5pZmllZC4gQnV0IGZvciBlZmZpY2llbmN5LCB3ZSB3YW50
IHRoZSBjb2RlIHRoYXQgY3JlYXRlcyBHZXRMb2NhbHMKLSAgICAgICAgICAgICAgICAvLyBhbmQg
UGhpcyB0byB0cnkgdG8gcmV1c2UgVmFyaWFibGVBY2Nlc3NEYXRhcyBhcyBtdWNoIGFzIHBvc3Np
YmxlLgotICAgICAgICAgICAgICAgIEFTU0VSVChtX2dyYXBoW3ZhbHVlSW5QcmVkZWNlc3Nvcl0u
dmFyaWFibGVBY2Nlc3NEYXRhKCkgPT0gbV9ncmFwaFttX2dyYXBoW3ZhbHVlSW5QcmVkZWNlc3Nv
cl0uY2hpbGQxKCkuaW5kZXgoKV0udmFyaWFibGVBY2Nlc3NEYXRhKCkpOwotICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgIHZhbHVlSW5QcmVkZWNlc3NvciA9IG1fZ3JhcGhbdmFsdWVJ
blByZWRlY2Vzc29yXS5jaGlsZDEoKS5pbmRleCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgICAgRm91bmQgQCV1LlxuIiwgdmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRp
ZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGhbdmFsdWVJblByZWRl
Y2Vzc29yXS5vcCA9PSBTZXRMb2NhbAotICAgICAgICAgICAgICAgICAgIHx8IG1fZ3JhcGhbdmFs
dWVJblByZWRlY2Vzc29yXS5vcCA9PSBQaGkKLSAgICAgICAgICAgICAgICAgICB8fCBtX2dyYXBo
W3ZhbHVlSW5QcmVkZWNlc3Nvcl0ub3AgPT0gRmx1c2gKLSAgICAgICAgICAgICAgICAgICB8fCAo
bV9ncmFwaFt2YWx1ZUluUHJlZGVjZXNzb3JdLm9wID09IFNldEFyZ3VtZW50Ci0gICAgICAgICAg
ICAgICAgICAgICAgICYmIHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrKSk7Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogZGF0YUZvclByZWRlY2Vzc29y
ID0gbV9ncmFwaFt2YWx1ZUluUHJlZGVjZXNzb3JdLnZhcmlhYmxlQWNjZXNzRGF0YSgpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBkYXRhRm9yUHJlZGVjZXNzb3ItPnVuaWZ5KGRhdGFGb3JQ
aGkpOwotCi0gICAgICAgICAgICBOb2RlKiBwaGlOb2RlID0gJm1fZ3JhcGhbZW50cnkubV9waGld
OwotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAg
IGRhdGFMb2coIiAgICAgIFJlZiBjb3VudCBvZiBAJXUgPSAldS5cbiIsIGVudHJ5Lm1fcGhpLCBw
aGlOb2RlLT5yZWZDb3VudCgpKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHBoaU5vZGUtPnJl
ZkNvdW50KCkpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0g
ICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgUmVmZmluZyBAJXUuXG4iLCB2YWx1ZUluUHJl
ZGVjZXNzb3IpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgbV9ncmFwaC5yZWYodmFsdWVJblBy
ZWRlY2Vzc29yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFwaGlOb2RlLT5j
aGlsZDEoKSkgewotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgICBTZXR0aW5nIEAldS0+Y2hpbGQxID0gQCV1Llxu
IiwgZW50cnkubV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7Ci0jZW5kaWYKLSAgICAgICAgICAg
ICAgICBwaGlOb2RlLT5jaGlsZHJlbi5zZXRDaGlsZDEoTm9kZVVzZSh2YWx1ZUluUHJlZGVjZXNz
b3IpKTsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5tX3BoaSk7
Ci0gICAgICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKFdURjo6ZGF0YUZpbGUoKSk7
Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiLlxuIik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcGhpTm9kZS0+Y2hp
bGQyKCkpIHsKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAg
ICAgICAgICAgICAgZGF0YUxvZygiICAgICAgU2V0dGluZyBAJXUtPmNoaWxkMiA9IEAldS5cbiIs
IGVudHJ5Lm1fcGhpLCB2YWx1ZUluUHJlZGVjZXNzb3IpOwotI2VuZGlmCi0gICAgICAgICAgICAg
ICAgcGhpTm9kZS0+Y2hpbGRyZW4uc2V0Q2hpbGQyKE5vZGVVc2UodmFsdWVJblByZWRlY2Vzc29y
KSk7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgZW50cnkubV9waGkpOwot
ICAgICAgICAgICAgICAgIHBoaU5vZGUtPmR1bXBDaGlsZHJlbihXVEY6OmRhdGFGaWxlKCkpOwot
ICAgICAgICAgICAgICAgIGRhdGFMb2coIi5cbiIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBoaU5vZGUtPmNoaWxk
MygpKSB7Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICAgIFNldHRpbmcgQCV1LT5jaGlsZDMgPSBAJXUuXG4iLCBl
bnRyeS5tX3BoaSwgdmFsdWVJblByZWRlY2Vzc29yKTsKLSNlbmRpZgotICAgICAgICAgICAgICAg
IHBoaU5vZGUtPmNoaWxkcmVuLnNldENoaWxkMyhOb2RlVXNlKHZhbHVlSW5QcmVkZWNlc3Nvcikp
OwotI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKLSAgICAgICAgICAg
ICAgICBkYXRhTG9nKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKLSAg
ICAgICAgICAgICAgICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4oV1RGOjpkYXRhRmlsZSgpKTsKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIuXG4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb2RlSW5k
ZXggbmV3UGhpID0gYWRkVG9HcmFwaChQaGksIE9wSW5mbyhkYXRhRm9yUGhpKSk7Ci0gICAgICAg
ICAgICAKLSNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAg
ICAgICBkYXRhTG9nKCIgICAgICBTcGxpdHRpbmcgQCV1LCBjcmVhdGVkIEAldS5cbiIsIGVudHJ5
Lm1fcGhpLCBuZXdQaGkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHBoaU5vZGUgPSAmbV9ncmFw
aFtlbnRyeS5tX3BoaV07IC8vIHJlbG9hZCBhZnRlciB2ZWN0b3IgcmVzaXplCi0gICAgICAgICAg
ICBOb2RlJiBuZXdQaGlOb2RlID0gbV9ncmFwaFtuZXdQaGldOwotICAgICAgICAgICAgaWYgKHBo
aU5vZGUtPnJlZkNvdW50KCkpCi0gICAgICAgICAgICAgICAgbV9ncmFwaC5yZWYobmV3UGhpKTsK
LQotICAgICAgICAgICAgbmV3UGhpTm9kZS5jaGlsZHJlbiA9IHBoaU5vZGUtPmNoaWxkcmVuOwot
Ci0jaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQotICAgICAgICAgICAg
ZGF0YUxvZygiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBuZXdQaGkpOwotICAgICAgICAgICAg
bmV3UGhpTm9kZS5kdW1wQ2hpbGRyZW4oV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgICAgIGRh
dGFMb2coIi5cbiIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHBoaU5vZGUtPmNoaWxkcmVuLmlu
aXRpYWxpemUobmV3UGhpLCB2YWx1ZUluUHJlZGVjZXNzb3IsIE5vTm9kZSk7Ci0KLSNpZiBERkdf
RU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCi0gICAgICAgICAgICBkYXRhTG9nKCIg
ICAgICBDaGlsZHJlbiBvZiBAJXU6ICIsIGVudHJ5Lm1fcGhpKTsKLSAgICAgICAgICAgIHBoaU5v
ZGUtPmR1bXBDaGlsZHJlbihXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgZGF0YUxvZygi
LlxuIik7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLX0KLQogdm9pZCBCeXRlQ29kZVBhcnNl
cjo6Zml4VmFyaWFibGVBY2Nlc3NQcmVkaWN0aW9ucygpCiB7CiAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fZ3JhcGgubV92YXJpYWJsZUFjY2Vzc0RhdGEuc2l6ZSgpOyArK2kpIHsKQEAg
LTI3MjcsMTcgKzI1OTMsMTkgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2UoKQogICAgIAog
ICAgIG1fY3VycmVudFByb2ZpbGluZ0luZGV4ID0gbV9jdXJyZW50SW5kZXg7CiAgICAgCi0gICAg
cHJvY2Vzc1BoaVN0YWNrPExvY2FsUGhpU3RhY2s+KCk7CisgICAgLy8gTGluayBHZXRMb2NhbCAm
IFNldExvY2FsIG5vZGVzLCB0byBlbnN1cmUgbGl2ZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZC4KKyAg
ICBtX2dyYXBoLnByb2Nlc3NQaGlTdGFjayhMb2NhbFBoaVN0YWNrKTsKICNpZiBERkdfRU5BQkxF
KERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCiAgICAgZGF0YUxvZygiUHJvY2Vzc2luZyBhcmd1
bWVudCBwaGlzLlxuIik7CiAjZW5kaWYKLSAgICBwcm9jZXNzUGhpU3RhY2s8QXJndW1lbnRQaGlT
dGFjaz4oKTsKKyAgICBtX2dyYXBoLnByb2Nlc3NQaGlTdGFjayhBcmd1bWVudFBoaVN0YWNrKTsK
ICAgICAKICAgICBmaXhWYXJpYWJsZUFjY2Vzc1ByZWRpY3Rpb25zKCk7CiAgICAgCiAgICAgbV9n
cmFwaC5tX3ByZXNlcnZlZFZhcnMgPSBtX3ByZXNlcnZlZFZhcnM7CiAgICAgbV9ncmFwaC5tX2xv
Y2FsVmFycyA9IG1fbnVtTG9jYWxzOwogICAgIG1fZ3JhcGgubV9wYXJhbWV0ZXJTbG90cyA9IG1f
cGFyYW1ldGVyU2xvdHM7CisgICAgbV9ncmFwaC5tX29yaWdpbmFsU2l6ZSA9IG1fZ3JhcGguc2l6
ZSgpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NGQVBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NGQVBoYXNlLmNwcAkocmV2aXNpb24gMTA5MDYyKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdDRkFQaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc3LDYgKzc3LDgg
QEAgcHJpdmF0ZToKICAgICAgICAgZGF0YUxvZygiICAgQmxvY2sgIyV1IChiYyMldSk6XG4iLCBi
bG9ja0luZGV4LCBibG9jay0+Ynl0ZWNvZGVCZWdpbik7CiAjZW5kaWYKICAgICAgICAgbV9zdGF0
ZS5iZWdpbkJhc2ljQmxvY2soYmxvY2spOworICAgICAgICBibG9jay0+Y2ZhU2hvdWxkUmV2aXNp
dCA9IGZhbHNlOworICAgICAgICBibG9jay0+Y2ZhSGFzVmlzaXRlZCA9IHRydWU7CiAjaWYgREZH
X0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQogICAgICAgICBkYXRhTG9nKCIgICAg
ICBoZWFkIHZhcnM6ICIpOwogICAgICAgICBkdW1wT3BlcmFuZHMoYmxvY2stPnZhbHVlc0F0SGVh
ZCwgV1RGOjpkYXRhRmlsZSgpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
Q1NFUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
Q1NFUGhhc2UuY3BwCShyZXZpc2lvbiAxMDkwNjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NTRVBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTc3LDUyICsxNzcsNiBAQCBw
cml2YXRlOgogICAgICAgICByZXR1cm4gTm9Ob2RlOwogICAgIH0KICAgICAKLSAgICBib29sIGlz
UHJlZGljdGVkTnVtZXJpY2FsKE5vZGUmIG5vZGUpCi0gICAgewotICAgICAgICBQcmVkaWN0ZWRU
eXBlIGxlZnQgPSBtX2dyYXBoW25vZGUuY2hpbGQxKCldLnByZWRpY3Rpb24oKTsKLSAgICAgICAg
UHJlZGljdGVkVHlwZSByaWdodCA9IG1fZ3JhcGhbbm9kZS5jaGlsZDIoKV0ucHJlZGljdGlvbigp
OwotICAgICAgICByZXR1cm4gaXNOdW1iZXJQcmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJl
ZGljdGlvbihyaWdodCk7Ci0gICAgfQotICAgIAotICAgIGJvb2wgbG9naWNhbE5vdElzUHVyZShO
b2RlJiBub2RlKQotICAgIHsKLSAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0aW9uID0gbV9n
cmFwaFtub2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCk7Ci0gICAgICAgIHJldHVybiBpc0Jvb2xl
YW5QcmVkaWN0aW9uKHByZWRpY3Rpb24pIHx8ICFwcmVkaWN0aW9uOwotICAgIH0KLSAgICAKLSAg
ICBib29sIGJ5VmFsSXNQdXJlKE5vZGUmIG5vZGUpCi0gICAgewotICAgICAgICByZXR1cm4gbV9n
cmFwaFtub2RlLmNoaWxkMigpXS5zaG91bGRTcGVjdWxhdGVJbnRlZ2VyKCkKLSAgICAgICAgICAg
ICYmICgobm9kZS5vcCA9PSBQdXRCeVZhbCB8fCBub2RlLm9wID09IFB1dEJ5VmFsQWxpYXMpCi0g
ICAgICAgICAgICAgICAgPyBpc0FjdGlvbmFibGVNdXRhYmxlQXJyYXlQcmVkaWN0aW9uKG1fZ3Jh
cGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigpKQotICAgICAgICAgICAgICAgIDogaXNBY3Rp
b25hYmxlQXJyYXlQcmVkaWN0aW9uKG1fZ3JhcGhbbm9kZS5jaGlsZDEoKV0ucHJlZGljdGlvbigp
KSk7Ci0gICAgfQotICAgIAotICAgIGJvb2wgY2xvYmJlcnNXb3JsZChOb2RlSW5kZXggbm9kZUlu
ZGV4KQotICAgIHsKLSAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbbm9kZUluZGV4XTsKLSAg
ICAgICAgaWYgKG5vZGUub3AgJiBOb2RlQ2xvYmJlcnNXb3JsZCkKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICBpZiAoIShub2RlLm9wICYgTm9kZU1pZ2h0Q2xvYmJlcikpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHN3aXRjaCAobm9kZS5vcCkgewotICAgICAg
ICBjYXNlIFZhbHVlQWRkOgotICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgotICAgICAgICBjYXNl
IENvbXBhcmVMZXNzRXE6Ci0gICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6Ci0gICAgICAgIGNh
c2UgQ29tcGFyZUdyZWF0ZXJFcToKLSAgICAgICAgY2FzZSBDb21wYXJlRXE6Ci0gICAgICAgICAg
ICByZXR1cm4gIWlzUHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOwotICAgICAgICBjYXNlIExvZ2lj
YWxOb3Q6Ci0gICAgICAgICAgICByZXR1cm4gIWxvZ2ljYWxOb3RJc1B1cmUobm9kZSk7Ci0gICAg
ICAgIGNhc2UgR2V0QnlWYWw6Ci0gICAgICAgICAgICByZXR1cm4gIWJ5VmFsSXNQdXJlKG5vZGUp
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSWYgYnkgc29tZSBvZGRpdHkgd2UgaGl0IHRoaXMg
Y2FzZSBpbiByZWxlYXNlIGJ1aWxkIGl0J3Mgc2FmZXIgdG8gaGF2ZSBDU0UgYXNzdW1lIHRoZSB3
b3JzdC4KLSAgICAgICAgfQotICAgIH0KLSAgICAKICAgICBOb2RlSW5kZXggaW1wdXJlQ1NFKE5v
ZGUmIG5vZGUpCiAgICAgewogICAgICAgICBOb2RlSW5kZXggY2hpbGQxID0gY2Fub25pY2FsaXpl
KG5vZGUuY2hpbGQxKCkpOwpAQCAtMjUwLDcgKzIwNCw3IEBAIHByaXZhdGU6CiAgICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBpZiAoY2xvYmJlcnNXb3JsZChpbmRleCkpCisgICAgICAgICAgICBpZiAobV9ncmFwaC5jbG9i
YmVyc1dvcmxkKGluZGV4KSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAg
ICAgICByZXR1cm4gTm9Ob2RlOwpAQCAtMjczLDcgKzIyNyw3IEBAIHByaXZhdGU6CiAgICAgICAg
ICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaWYgKGNsb2JiZXJzV29ybGQoaW5kZXgpKQorICAgICAgICAgICAgaWYgKG1fZ3Jh
cGguY2xvYmJlcnNXb3JsZChpbmRleCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg
IH0KICAgICAgICAgcmV0dXJuIE5vTm9kZTsKQEAgLTI4NiwxNCArMjQwLDE0IEBAIHByaXZhdGU6
CiAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CiAgICAgICAgICAgICBz
d2l0Y2ggKG5vZGUub3ApIHsKICAgICAgICAgICAgIGNhc2UgR2V0QnlWYWw6Ci0gICAgICAgICAg
ICAgICAgaWYgKCFieVZhbElzUHVyZShub2RlKSkKKyAgICAgICAgICAgICAgICBpZiAoIW1fZ3Jh
cGguYnlWYWxJc1B1cmUobm9kZSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb05vZGU7
CiAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGQxKCkgPT0gY2hpbGQxICYmIGNhbm9uaWNh
bGl6ZShub2RlLmNoaWxkMigpKSA9PSBjYW5vbmljYWxpemUoY2hpbGQyKSkKICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICAgY2FzZSBQdXRCeVZhbDoKICAgICAgICAgICAgIGNhc2UgUHV0QnlWYWxBbGlhczoKLSAgICAg
ICAgICAgICAgICBpZiAoIWJ5VmFsSXNQdXJlKG5vZGUpKQorICAgICAgICAgICAgICAgIGlmICgh
bV9ncmFwaC5ieVZhbElzUHVyZShub2RlKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5v
Tm9kZTsKICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZDEoKSA9PSBjaGlsZDEgJiYgY2Fu
b25pY2FsaXplKG5vZGUuY2hpbGQyKCkpID09IGNhbm9uaWNhbGl6ZShjaGlsZDIpKQogICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gbm9kZS5jaGlsZDMoKS5pbmRleCgpOwpAQCAtMzEyLDcgKzI2
Niw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgLy8gQSBwdXNoIGNhbm5vdCBhZmZlY3Qg
cHJldmlvdXNseSBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCiAgICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChjbG9i
YmVyc1dvcmxkKGluZGV4KSkKKyAgICAgICAgICAgICAgICBpZiAobV9ncmFwaC5jbG9iYmVyc1dv
cmxkKGluZGV4KSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vTm9kZTsKICAgICAgICAg
ICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTM1Nyw3ICszMTEsNyBAQCBwcml2YXRl
OgogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBQdXRCeVZhbDoKICAgICAgICAg
ICAgIGNhc2UgUHV0QnlWYWxBbGlhczoKLSAgICAgICAgICAgICAgICBpZiAoYnlWYWxJc1B1cmUo
bm9kZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9ncmFwaC5ieVZhbElzUHVyZShub2RlKSkg
ewogICAgICAgICAgICAgICAgICAgICAvLyBJZiBQdXRCeVZhbCBzcGVjdWxhdGVzIHRoYXQgaXQn
cyBhY2Nlc3NpbmcgYW4gYXJyYXkgd2l0aCBhbgogICAgICAgICAgICAgICAgICAgICAvLyBpbnRl
Z2VyIGluZGV4LCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1c2UgYSBzdHJ1Y3R1
cmUKICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlLgpAQCAtMzY2LDcgKzMyMCw3IEBAIHBy
aXZhdGU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoY2xvYmJlcnNXb3JsZChp
bmRleCkpCisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGguY2xvYmJlcnNXb3JsZChpbmRleCkp
CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVh
azsKICAgICAgICAgICAgIH0KQEAgLTQwMCw3ICszNTQsNyBAQCBwcml2YXRlOgogICAgICAgICAg
ICAgICAgIAogICAgICAgICAgICAgY2FzZSBQdXRCeVZhbDoKICAgICAgICAgICAgIGNhc2UgUHV0
QnlWYWxBbGlhczoKLSAgICAgICAgICAgICAgICBpZiAoYnlWYWxJc1B1cmUobm9kZSkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAobV9ncmFwaC5ieVZhbElzUHVyZShub2RlKSkgewogICAgICAgICAg
ICAgICAgICAgICAvLyBJZiBQdXRCeVZhbCBzcGVjdWxhdGVzIHRoYXQgaXQncyBhY2Nlc3Npbmcg
YW4gYXJyYXkgd2l0aCBhbgogICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ2VyIGluZGV4LCB0
aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1c2UgYSBzdHJ1Y3R1cmUKICAgICAgICAg
ICAgICAgICAgICAgLy8gY2hhbmdlLgpAQCAtNDA5LDcgKzM2Myw3IEBAIHByaXZhdGU6CiAgICAg
ICAgICAgICAgICAgcmV0dXJuIE5vTm9kZTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGNsb2JiZXJzV29ybGQoaW5kZXgpKQorICAg
ICAgICAgICAgICAgIGlmIChtX2dyYXBoLmNsb2JiZXJzV29ybGQoaW5kZXgpKQogICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gTm9Ob2RlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICAgICAgfQpAQCAtNDM2LDcgKzM5MCw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICBjYXNlIFB1dEJ5VmFsOgogICAgICAgICAgICAgY2FzZSBQdXRCeVZhbEFsaWFz
OgotICAgICAgICAgICAgICAgIGlmIChieVZhbElzUHVyZShub2RlKSkgeworICAgICAgICAgICAg
ICAgIGlmIChtX2dyYXBoLmJ5VmFsSXNQdXJlKG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAg
IC8vIElmIFB1dEJ5VmFsIHNwZWN1bGF0ZXMgdGhhdCBpdCdzIGFjY2Vzc2luZyBhbiBhcnJheSB3
aXRoIGFuCiAgICAgICAgICAgICAgICAgICAgIC8vIGludGVnZXIgaW5kZXgsIHRoZW4gaXQncyBp
bXBvc3NpYmxlIGZvciBpdCB0byBjYXVzZSBhIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAg
ICAvLyBjaGFuZ2UuCkBAIC00NDUsNyArMzk5LDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAg
ICByZXR1cm4gTm9Ob2RlOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgZGVmYXVsdDoK
LSAgICAgICAgICAgICAgICBpZiAoY2xvYmJlcnNXb3JsZChpbmRleCkpCisgICAgICAgICAgICAg
ICAgaWYgKG1fZ3JhcGguY2xvYmJlcnNXb3JsZChpbmRleCkpCiAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBOb05vZGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBA
IC00NzgsMTIgKzQzMiwxMiBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBQdXRCeVZhbDoKLSAgICAgICAgICAgICAg
ICBpZiAoaXNGaXhlZEluZGV4ZWRTdG9yYWdlT2JqZWN0UHJlZGljdGlvbihtX2dyYXBoW25vZGUu
Y2hpbGQxKCldLnByZWRpY3Rpb24oKSkgJiYgYnlWYWxJc1B1cmUobm9kZSkpCisgICAgICAgICAg
ICAgICAgaWYgKGlzRml4ZWRJbmRleGVkU3RvcmFnZU9iamVjdFByZWRpY3Rpb24obV9ncmFwaFtu
b2RlLmNoaWxkMSgpXS5wcmVkaWN0aW9uKCkpICYmIG1fZ3JhcGguYnlWYWxJc1B1cmUobm9kZSkp
CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIHJldHVybiBOb05v
ZGU7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGNsb2JiZXJz
V29ybGQoaW5kZXgpKQorICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoLmNsb2JiZXJzV29ybGQo
aW5kZXgpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9Ob2RlOwogICAgICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjM5LDE4ICs1OTMsMTggQEAgcHJpdmF0ZToK
ICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRl
ckVxOgogICAgICAgICBjYXNlIENvbXBhcmVFcTogewotICAgICAgICAgICAgaWYgKGlzUHJlZGlj
dGVkTnVtZXJpY2FsKG5vZGUpKSB7CisgICAgICAgICAgICBpZiAobV9ncmFwaC5pc1ByZWRpY3Rl
ZE51bWVyaWNhbChub2RlKSkgewogICAgICAgICAgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVu
dEluZGV4ID0gcHVyZUNTRShub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRJ
bmRleCAhPSBOb05vZGUgJiYgaXNQcmVkaWN0ZWROdW1lcmljYWwobV9ncmFwaFtyZXBsYWNlbWVu
dEluZGV4XSkpCisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50SW5kZXggIT0gTm9Ob2Rl
ICYmIG1fZ3JhcGguaXNQcmVkaWN0ZWROdW1lcmljYWwobV9ncmFwaFtyZXBsYWNlbWVudEluZGV4
XSkpCiAgICAgICAgICAgICAgICAgICAgIHNldFJlcGxhY2VtZW50KHJlcGxhY2VtZW50SW5kZXgp
OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAg
ICAgIAogICAgICAgICBjYXNlIExvZ2ljYWxOb3Q6IHsKLSAgICAgICAgICAgIGlmIChsb2dpY2Fs
Tm90SXNQdXJlKG5vZGUpKSB7CisgICAgICAgICAgICBpZiAobV9ncmFwaC5sb2dpY2FsTm90SXNQ
dXJlKG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50SW5kZXgg
PSBwdXJlQ1NFKG5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudEluZGV4ICE9
IE5vTm9kZSAmJiBsb2dpY2FsTm90SXNQdXJlKG1fZ3JhcGhbcmVwbGFjZW1lbnRJbmRleF0pKQor
ICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudEluZGV4ICE9IE5vTm9kZSAmJiBtX2dyYXBo
LmxvZ2ljYWxOb3RJc1B1cmUobV9ncmFwaFtyZXBsYWNlbWVudEluZGV4XSkpCiAgICAgICAgICAg
ICAgICAgICAgIHNldFJlcGxhY2VtZW50KHJlcGxhY2VtZW50SW5kZXgpOwogICAgICAgICAgICAg
fQogICAgICAgICAgICAgYnJlYWs7CkBAIC02NjMsMTIgKzYxNywxMiBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBHZXRCeVZhbDoKLSAg
ICAgICAgICAgIGlmIChieVZhbElzUHVyZShub2RlKSkKKyAgICAgICAgICAgIGlmIChtX2dyYXBo
LmJ5VmFsSXNQdXJlKG5vZGUpKQogICAgICAgICAgICAgICAgIHNldFJlcGxhY2VtZW50KGdldEJ5
VmFsTG9hZEVsaW1pbmF0aW9uKG5vZGUuY2hpbGQxKCkuaW5kZXgoKSwgbm9kZS5jaGlsZDIoKS5p
bmRleCgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIAogICAgICAgICBjYXNl
IFB1dEJ5VmFsOgotICAgICAgICAgICAgaWYgKGJ5VmFsSXNQdXJlKG5vZGUpICYmIGdldEJ5VmFs
TG9hZEVsaW1pbmF0aW9uKG5vZGUuY2hpbGQxKCkuaW5kZXgoKSwgbm9kZS5jaGlsZDIoKS5pbmRl
eCgpKSAhPSBOb05vZGUpCisgICAgICAgICAgICBpZiAobV9ncmFwaC5ieVZhbElzUHVyZShub2Rl
KSAmJiBnZXRCeVZhbExvYWRFbGltaW5hdGlvbihub2RlLmNoaWxkMSgpLmluZGV4KCksIG5vZGUu
Y2hpbGQyKCkuaW5kZXgoKSkgIT0gTm9Ob2RlKQogICAgICAgICAgICAgICAgIG5vZGUub3AgPSBQ
dXRCeVZhbEFsaWFzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAkocmV2aXNpb24gMTA5
MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDYXBhYmlsaXRpZXMuaAkod29y
a2luZyBjb3B5KQpAQCAtMTM1LDYgKzEzNSw3IEBAIGlubGluZSBib29sIGNhbkNvbXBpbGVPcGNv
ZGUoT3Bjb2RlSUQgb3AKICAgICBjYXNlIG9wX2puZ3JlYXRlcjoKICAgICBjYXNlIG9wX2puZ3Jl
YXRlcmVxOgogICAgIGNhc2Ugb3BfbG9vcF9oaW50OgorICAgIGNhc2Ugb3BfbG9vcF9wcmVoZWFk
ZXI6CiAgICAgY2FzZSBvcF9sb29wX2lmX2xlc3M6CiAgICAgY2FzZSBvcF9sb29wX2lmX2xlc3Nl
cToKICAgICBjYXNlIG9wX2xvb3BfaWZfZ3JlYXRlcjoKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHRHJpdmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0RyaXZlci5jcHAJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHRHJpdmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsNiArMzMsNyBA
QAogI2luY2x1ZGUgIkRGR0NGQVBoYXNlLmgiCiAjaW5jbHVkZSAiREZHQ1NFUGhhc2UuaCIKICNp
bmNsdWRlICJERkdKSVRDb21waWxlci5oIgorI2luY2x1ZGUgIkRGR0xJQ01QaGFzZS5oIgogI2lu
Y2x1ZGUgIkRGR1ByZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZHVmly
dHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmgiCiAKQEAgLTYxLDYgKzYyLDcgQEAgaW5saW5l
IGJvb2wgY29tcGlsZShDb21waWxlTW9kZSBjb21waWxlTQogICAgIHBlcmZvcm1Bcml0aE5vZGVG
bGFnc0luZmVyZW5jZShkZmcpOwogICAgIHBlcmZvcm1QcmVkaWN0aW9uUHJvcGFnYXRpb24oZGZn
KTsKICAgICBwZXJmb3JtQ1NFKGRmZyk7CisgICAgcGVyZm9ybUxJQ00oZGZnKTsKICAgICBwZXJm
b3JtVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvbihkZmcpOwogICAgIHBlcmZvcm1DRkEoZGZnKTsK
IApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHJldmlzaW9uIDEw
OTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMjQsNyArMTI0LDcgQEAgdm9pZCBHcmFwaDo6ZHVtcChOb2RlSW5kZXggbm9k
ZUluZGV4KQogCiAgICAgdW5zaWduZWQgcmVmQ291bnQgPSBub2RlLnJlZkNvdW50KCk7CiAgICAg
Ym9vbCBza2lwcGVkID0gIXJlZkNvdW50OwotICAgIGJvb2wgbXVzdEdlbmVyYXRlID0gbm9kZS5t
dXN0R2VuZXJhdGUoKTsKKyAgICBib29sIG11c3RHZW5lcmF0ZSA9IHJlZkNvdW50ICYmIG5vZGUu
bXVzdEdlbmVyYXRlKCk7CiAgICAgaWYgKG11c3RHZW5lcmF0ZSkgewogICAgICAgICBBU1NFUlQo
cmVmQ291bnQpOwogICAgICAgICAtLXJlZkNvdW50OwpAQCAtMjg0LDcgKzI4NCw3IEBAIHZvaWQg
R3JhcGg6OmR1bXAoKQogICAgICAgICBkYXRhTG9nKCJcbiIpOwogICAgIH0KICAgICBkYXRhTG9n
KCJQaGkgTm9kZXM6XG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgpLT5l
bmQ7IGkgPCBzaXplKCk7ICsraSkKKyAgICBmb3IgKHNpemVfdCBpID0gbV9ibG9ja3MubGFzdCgp
LT5lbmQ7IGkgPCBtX29yaWdpbmFsU2l6ZTsgKytpKQogICAgICAgICBkdW1wKGkpOwogfQogCkBA
IC0zNDIsNiArMzQyLDE1NSBAQCB2b2lkIEdyYXBoOjpwcmVkaWN0QXJndW1lbnRUeXBlcygpCiAg
ICAgfQogfQogCit2b2lkIEdyYXBoOjpwcm9jZXNzUGhpU3RhY2soUGhpU3RhY2tUeXBlIHN0YWNr
VHlwZSwgQmxvY2tJbmRleCBkZWZpbml0aW9uQmxvY2spCit7CisgICAgVmVjdG9yPFBoaVN0YWNr
RW50cnksIDE2PiYgcGhpU3RhY2sgPSAoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhpU3RhY2spID8g
bV9hcmd1bWVudFBoaVN0YWNrIDogbV9sb2NhbFBoaVN0YWNrOworCisgICAgd2hpbGUgKCFwaGlT
dGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgUGhpU3RhY2tFbnRyeSBlbnRyeSA9IHBoaVN0YWNr
Lmxhc3QoKTsKKyAgICAgICAgcGhpU3RhY2sucmVtb3ZlTGFzdCgpOworICAgICAgICAKKyAgICAg
ICAgUHJlZGVjZXNzb3JMaXN0JiBwcmVkZWNlc3NvcnMgPSBlbnRyeS5tX2Jsb2NrLT5tX3ByZWRl
Y2Vzc29yczsKKyAgICAgICAgdW5zaWduZWQgdmFyTm8gPSBlbnRyeS5tX3Zhck5vOworICAgICAg
ICBWYXJpYWJsZUFjY2Vzc0RhdGEqIGRhdGFGb3JQaGkgPSBhdChlbnRyeS5tX3BoaSkudmFyaWFi
bGVBY2Nlc3NEYXRhKCk7CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJP
U0UpCisgICAgICAgIGRhdGFMb2coIiAgIEhhbmRsaW5nIHBoaSBlbnRyeSBmb3IgdmFyICV1LCBw
aGkgQCV1LlxuIiwgZW50cnkubV92YXJObywgZW50cnkubV9waGkpOworI2VuZGlmCisKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVkZWNlc3NvcnMuc2l6ZSgpOyArK2kpIHsKKyNp
ZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICBkYXRh
TG9nKCIgICAgIERlYWxpbmcgd2l0aCBwcmVkZWNlc3NvciBibG9jayAldS5cbiIsIHByZWRlY2Vz
c29yc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQmFzaWNCbG9jayog
cHJlZGVjZXNzb3JCbG9jayA9IG1fYmxvY2tzW3ByZWRlY2Vzc29yc1tpXV0uZ2V0KCk7CisKKyAg
ICAgICAgICAgIE5vZGVJbmRleCYgdmFyID0gKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNr
KSA/IHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0VGFpbC5hcmd1bWVudCh2YXJObykgOiBw
cmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdFRhaWwubG9jYWwodmFyTm8pOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBOb2RlSW5kZXggdmFsdWVJblByZWRlY2Vzc29yID0gdmFyOworICAg
ICAgICAgICAgLy8gV2Ugb25seSB0YWtlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc3BlY2lmaWVk
IGRlZmluaXRpb24gYmxvY2suCisgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkJsb2NrICE9IE5v
QmxvY2sgJiYgZGVmaW5pdGlvbkJsb2NrICE9IHByZWRlY2Vzc29yc1tpXQorICAgICAgICAgICAg
ICAgICYmIHZhciAhPSBOb05vZGUgJiYgYXQodmFyKS5vcCA9PSBTZXRMb2NhbCkKKyAgICAgICAg
ICAgICAgICB2YWx1ZUluUHJlZGVjZXNzb3IgPSBOb05vZGU7CisKKyAgICAgICAgICAgIGlmICh2
YWx1ZUluUHJlZGVjZXNzb3IgPT0gTm9Ob2RlKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9Q
QUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIERpZCBub3Qg
ZmluZCBub2RlLCBhZGRpbmcgcGhpLlxuIik7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGlu
dCBvcGVyYW5kID0gKHN0YWNrVHlwZSA9PSBBcmd1bWVudFBoaVN0YWNrID8gYXJndW1lbnRUb09w
ZXJhbmQodmFyTm8pIDogc3RhdGljX2Nhc3Q8aW50Pih2YXJObykpOworICAgICAgICAgICAgICAg
IG1fdmFyaWFibGVBY2Nlc3NEYXRhLmFwcGVuZChWYXJpYWJsZUFjY2Vzc0RhdGEoc3RhdGljX2Nh
c3Q8VmlydHVhbFJlZ2lzdGVyPihvcGVyYW5kKSkpOworICAgICAgICAgICAgICAgIHZhbHVlSW5Q
cmVkZWNlc3NvciA9IChOb2RlSW5kZXgpc2l6ZSgpOworICAgICAgICAgICAgICAgIGFwcGVuZChO
b2RlKFBoaSwgQ29kZU9yaWdpbigpLCBPcEluZm8oJm1fdmFyaWFibGVBY2Nlc3NEYXRhLmxhc3Qo
KSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhY2tUeXBlID09IEFyZ3VtZW50UGhpU3RhY2sp
CisgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yQmxvY2stPnZhcmlhYmxlc0F0SGVhZC5h
cmd1bWVudCh2YXJObykgPSB2YWx1ZUluUHJlZGVjZXNzb3I7CisgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvckJsb2NrLT52YXJpYWJsZXNBdEhlYWQu
c2V0TG9jYWwodmFyTm8sIHZhbHVlSW5QcmVkZWNlc3Nvcik7CisgICAgICAgICAgICAgICAgdmFy
ID0gdmFsdWVJblByZWRlY2Vzc29yOworICAgICAgICAgICAgICAgIHBoaVN0YWNrLmFwcGVuZChQ
aGlTdGFja0VudHJ5KHByZWRlY2Vzc29yQmxvY2ssIHZhbHVlSW5QcmVkZWNlc3NvciwgdmFyTm8p
KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXQodmFsdWVJblByZWRlY2Vzc29yKS5vcCA9PSBH
ZXRMb2NhbCkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgICBGb3VuZCBHZXRMb2NhbCBAJXUuXG4iLCB2YWx1
ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRv
IGVuc3VyZSB0aGF0IHRoZSBWYXJpYWJsZUFjY2Vzc0RhdGFzIGFyZSBpZGVudGljYWwgYmV0d2Vl
biB0aGUKKyAgICAgICAgICAgICAgICAvLyBHZXRMb2NhbCBhbmQgaXRzIGJsb2NrLWxvY2FsIFBo
aS4gU3RyaWN0bHkgc3BlYWtpbmcgd2Ugb25seSBuZWVkIHRoZSB0d28KKyAgICAgICAgICAgICAg
ICAvLyB0byBiZSB1bmlmaWVkLiBCdXQgZm9yIGVmZmljaWVuY3ksIHdlIHdhbnQgdGhlIGNvZGUg
dGhhdCBjcmVhdGVzIEdldExvY2FscworICAgICAgICAgICAgICAgIC8vIGFuZCBQaGlzIHRvIHRy
eSB0byByZXVzZSBWYXJpYWJsZUFjY2Vzc0RhdGFzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAg
ICAgICAgICAgICAgQVNTRVJUKGF0KHZhbHVlSW5QcmVkZWNlc3NvcikudmFyaWFibGVBY2Nlc3NE
YXRhKCkgPT0gYXQoYXQodmFsdWVJblByZWRlY2Vzc29yKS5jaGlsZDEoKS5pbmRleCgpKS52YXJp
YWJsZUFjY2Vzc0RhdGEoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFs
dWVJblByZWRlY2Vzc29yID0gYXQodmFsdWVJblByZWRlY2Vzc29yKS5jaGlsZDEoKS5pbmRleCgp
OworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9O
X1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgRm91bmQgQCV1LlxuIiwg
dmFsdWVJblByZWRlY2Vzc29yKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAg
QVNTRVJUKGF0KHZhbHVlSW5QcmVkZWNlc3Nvcikub3AgPT0gU2V0TG9jYWwgfHwgYXQodmFsdWVJ
blByZWRlY2Vzc29yKS5vcCA9PSBQaGkgfHwgYXQodmFsdWVJblByZWRlY2Vzc29yKS5vcCA9PSBG
bHVzaCB8fCAoYXQodmFsdWVJblByZWRlY2Vzc29yKS5vcCA9PSBTZXRBcmd1bWVudCAmJiBzdGFj
a1R5cGUgPT0gQXJndW1lbnRQaGlTdGFjaykpOworICAgICAgICAgICAgCisgICAgICAgICAgICBW
YXJpYWJsZUFjY2Vzc0RhdGEqIGRhdGFGb3JQcmVkZWNlc3NvciA9IGF0KHZhbHVlSW5QcmVkZWNl
c3NvcikudmFyaWFibGVBY2Nlc3NEYXRhKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRh
dGFGb3JQcmVkZWNlc3Nvci0+dW5pZnkoZGF0YUZvclBoaSk7CisKKyAgICAgICAgICAgIE5vZGUq
IHBoaU5vZGUgPSAmYXQoZW50cnkubV9waGkpOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFH
QVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFJlZiBjb3VudCBvZiBA
JXUgPSAldS5cbiIsIGVudHJ5Lm1fcGhpLCBwaGlOb2RlLT5yZWZDb3VudCgpKTsKKyNlbmRpZgor
ICAgICAgICAgICAgaWYgKHBoaU5vZGUtPnJlZkNvdW50KCkpIHsKKyNpZiBERkdfRU5BQkxFKERF
QlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAg
UmVmZmluZyBAJXUuXG4iLCB2YWx1ZUluUHJlZGVjZXNzb3IpOworI2VuZGlmCisgICAgICAgICAg
ICAgICAgcmVmKHZhbHVlSW5QcmVkZWNlc3Nvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmICghcGhpTm9kZS0+Y2hpbGQxKCkpIHsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BB
R0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgU2V0dGluZyBA
JXUtPmNoaWxkMSA9IEAldS5cbiIsIGVudHJ5Lm1fcGhpLCB2YWx1ZUluUHJlZGVjZXNzb3IpOwor
I2VuZGlmCisgICAgICAgICAgICAgICAgcGhpTm9kZS0+Y2hpbGRyZW4uc2V0Q2hpbGQxKE5vZGVV
c2UodmFsdWVJblByZWRlY2Vzc29yKSk7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElP
Tl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIENoaWxkcmVuIG9mIEAl
dTogIiwgZW50cnkubV9waGkpOworICAgICAgICAgICAgICAgIHBoaU5vZGUtPmR1bXBDaGlsZHJl
bihXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgICAgIGRhdGFMb2coIi5cbiIpOworI2Vu
ZGlmCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBpZiAoIXBoaU5vZGUtPmNoaWxkMigpKSB7CisjaWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdB
VElPTl9WRVJCT1NFKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIFNldHRpbmcgQCV1
LT5jaGlsZDIgPSBAJXUuXG4iLCBlbnRyeS5tX3BoaSwgdmFsdWVJblByZWRlY2Vzc29yKTsKKyNl
bmRpZgorICAgICAgICAgICAgICAgIHBoaU5vZGUtPmNoaWxkcmVuLnNldENoaWxkMihOb2RlVXNl
KHZhbHVlSW5QcmVkZWNlc3NvcikpOworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05f
VkVSQk9TRSkKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgICBDaGlsZHJlbiBvZiBAJXU6
ICIsIGVudHJ5Lm1fcGhpKTsKKyAgICAgICAgICAgICAgICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4o
V1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIuXG4iKTsKKyNlbmRp
ZgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKCFwaGlOb2RlLT5jaGlsZDMoKSkgeworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJ
T05fVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgICBTZXR0aW5nIEAldS0+
Y2hpbGQzID0gQCV1LlxuIiwgZW50cnkubV9waGksIHZhbHVlSW5QcmVkZWNlc3Nvcik7CisjZW5k
aWYKKyAgICAgICAgICAgICAgICBwaGlOb2RlLT5jaGlsZHJlbi5zZXRDaGlsZDMoTm9kZVVzZSh2
YWx1ZUluUHJlZGVjZXNzb3IpKTsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZF
UkJPU0UpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAi
LCBlbnRyeS5tX3BoaSk7CisgICAgICAgICAgICAgICAgcGhpTm9kZS0+ZHVtcENoaWxkcmVuKFdU
Rjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiLlxuIik7CisjZW5kaWYK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgTm9kZUluZGV4IG5ld1BoaSA9IChOb2RlSW5kZXgpc2l6ZSgpOworICAgICAg
ICAgICAgYXBwZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbyhkYXRhRm9yUGhpKSkp
OworICAgICAgICAgICAgLy8gTm9kZUluZGV4IG5ld1BoaSA9IGFkZFRvR3JhcGgoUGhpLCBPcElu
Zm8oZGF0YUZvclBoaSkpOworICAgICAgICAgICAgCisjaWYgREZHX0VOQUJMRShERUJVR19QUk9Q
QUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgZGF0YUxvZygiICAgICAgU3BsaXR0aW5nIEAl
dSwgY3JlYXRlZCBAJXUuXG4iLCBlbnRyeS5tX3BoaSwgbmV3UGhpKTsKKyNlbmRpZgorCisgICAg
ICAgICAgICBwaGlOb2RlID0gJmF0KGVudHJ5Lm1fcGhpKTsgLy8gcmVsb2FkIGFmdGVyIHZlY3Rv
ciByZXNpemUKKyAgICAgICAgICAgIE5vZGUmIG5ld1BoaU5vZGUgPSBhdChuZXdQaGkpOworICAg
ICAgICAgICAgaWYgKHBoaU5vZGUtPnJlZkNvdW50KCkpCisgICAgICAgICAgICAgICAgcmVmKG5l
d1BoaSk7CisKKyAgICAgICAgICAgIG5ld1BoaU5vZGUuY2hpbGRyZW4gPSBwaGlOb2RlLT5jaGls
ZHJlbjsKKworI2lmIERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAg
ICAgICAgIGRhdGFMb2coIiAgICAgIENoaWxkcmVuIG9mIEAldTogIiwgbmV3UGhpKTsKKyAgICAg
ICAgICAgIG5ld1BoaU5vZGUuZHVtcENoaWxkcmVuKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAg
ICAgICBkYXRhTG9nKCIuXG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICBwaGlOb2RlLT5jaGls
ZHJlbi5pbml0aWFsaXplKG5ld1BoaSwgdmFsdWVJblByZWRlY2Vzc29yLCBOb05vZGUpOworCisj
aWYgREZHX0VOQUJMRShERUJVR19QUk9QQUdBVElPTl9WRVJCT1NFKQorICAgICAgICAgICAgZGF0
YUxvZygiICAgICAgQ2hpbGRyZW4gb2YgQCV1OiAiLCBlbnRyeS5tX3BoaSk7CisgICAgICAgICAg
ICBwaGlOb2RlLT5kdW1wQ2hpbGRyZW4oV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIGRh
dGFMb2coIi5cbiIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpERkcKIAogI2VuZGlmCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdH
cmFwaC5oCShyZXZpc2lvbiAxMDkwNjIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAgLTY1LDYgKzY1LDI5IEBAIHN0cnVjdCBSZXNvbHZl
R2xvYmFsRGF0YSB7CiAgICAgdW5zaWduZWQgcmVzb2x2ZUluZm9JbmRleDsKIH07CiAKK3N0cnVj
dCBMb29wUHJlSGVhZGVyIHsKKyAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXg7CisgICAgQmxvY2tJ
bmRleCBvdXRlckxvb3A7Cit9OworCitlbnVtIFBoaVN0YWNrVHlwZSB7CisgICAgTG9jYWxQaGlT
dGFjaywKKyAgICBBcmd1bWVudFBoaVN0YWNrCit9OworCitzdHJ1Y3QgUGhpU3RhY2tFbnRyeSB7
CisgICAgUGhpU3RhY2tFbnRyeShCYXNpY0Jsb2NrKiBibG9jaywgTm9kZUluZGV4IHBoaSwgdW5z
aWduZWQgdmFyTm8pCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICAgICAgLCBtX3BoaShw
aGkpCisgICAgICAgICwgbV92YXJObyh2YXJObykKKyAgICB7CisgICAgfQorCisgICAgQmFzaWNC
bG9jayogbV9ibG9jazsKKyAgICBOb2RlSW5kZXggbV9waGk7CisgICAgdW5zaWduZWQgbV92YXJO
bzsKK307CisKIC8vIAogLy8gPT09IEdyYXBoID09PQogLy8KQEAgLTM0NiwxMSArMzY5LDY4IEBA
IHB1YmxpYzoKICAgICAgICAgcmV0dXJuIGlzQ2FwdHVyZWQoc3RhdGljX2Nhc3Q8aW50Pih2aXJ0
dWFsUmVnaXN0ZXIpKTsKICAgICB9CiAgICAgCisgICAgYm9vbCBpc1ByZWRpY3RlZE51bWVyaWNh
bChOb2RlJiBub2RlKQorICAgIHsKKyAgICAgICAgUHJlZGljdGVkVHlwZSBsZWZ0ID0gYXQobm9k
ZS5jaGlsZDEoKSkucHJlZGljdGlvbigpOworICAgICAgICBQcmVkaWN0ZWRUeXBlIHJpZ2h0ID0g
YXQobm9kZS5jaGlsZDIoKSkucHJlZGljdGlvbigpOworICAgICAgICByZXR1cm4gaXNOdW1iZXJQ
cmVkaWN0aW9uKGxlZnQpICYmIGlzTnVtYmVyUHJlZGljdGlvbihyaWdodCk7CisgICAgfQorICAg
IAorICAgIGJvb2wgY29tcGFyZUVxSXNQdXJlKE5vZGUmIG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gaXNQcmVkaWN0ZWROdW1lcmljYWwobm9kZSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNo
b3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0KGF0KG5vZGUuY2hpbGQxKCkpLCBhdChub2RlLmNoaWxk
MigpKSkKKyAgICAgICAgICAgIHx8IE5vZGU6OnNob3VsZFNwZWN1bGF0ZUFycmF5KGF0KG5vZGUu
Y2hpbGQxKCkpLCBhdChub2RlLmNoaWxkMigpKSk7CisgICAgfQorCisgICAgYm9vbCBsb2dpY2Fs
Tm90SXNQdXJlKE5vZGUmIG5vZGUpCisgICAgeworICAgICAgICBQcmVkaWN0ZWRUeXBlIHByZWRp
Y3Rpb24gPSBhdChub2RlLmNoaWxkMSgpKS5wcmVkaWN0aW9uKCk7CisgICAgICAgIHJldHVybiBp
c0Jvb2xlYW5QcmVkaWN0aW9uKHByZWRpY3Rpb24pIHx8ICFwcmVkaWN0aW9uOworICAgIH0KKyAg
ICAKKyAgICBib29sIGJ5VmFsSXNQdXJlKE5vZGUmIG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gYXQobm9kZS5jaGlsZDIoKSkuc2hvdWxkU3BlY3VsYXRlSW50ZWdlcigpCisgICAgICAgICAg
ICAmJiAoKG5vZGUub3AgPT0gUHV0QnlWYWwgfHwgbm9kZS5vcCA9PSBQdXRCeVZhbEFsaWFzKQor
ICAgICAgICAgICAgICAgID8gaXNBY3Rpb25hYmxlTXV0YWJsZUFycmF5UHJlZGljdGlvbihhdChu
b2RlLmNoaWxkMSgpKS5wcmVkaWN0aW9uKCkpCisgICAgICAgICAgICAgICAgOiBpc0FjdGlvbmFi
bGVBcnJheVByZWRpY3Rpb24oYXQobm9kZS5jaGlsZDEoKSkucHJlZGljdGlvbigpKSk7CisgICAg
fQorICAgIAorICAgIGJvb2wgY2xvYmJlcnNXb3JsZChOb2RlSW5kZXggbm9kZUluZGV4KQorICAg
IHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IGF0KG5vZGVJbmRleCk7CisgICAgICAgIGlmIChub2Rl
Lm9wICYgTm9kZUNsb2JiZXJzV29ybGQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgaWYgKCEobm9kZS5vcCAmIE5vZGVNaWdodENsb2JiZXIpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKKyAgICAgICAgY2FzZSBWYWx1ZUFk
ZDoKKyAgICAgICAgY2FzZSBDb21wYXJlTGVzczoKKyAgICAgICAgY2FzZSBDb21wYXJlTGVzc0Vx
OgorICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICBjYXNlIENvbXBhcmVHcmVh
dGVyRXE6CisgICAgICAgICAgICByZXR1cm4gIWlzUHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOwor
ICAgICAgICBjYXNlIENvbXBhcmVFcToKKyAgICAgICAgICAgIHJldHVybiAhY29tcGFyZUVxSXNQ
dXJlKG5vZGUpOworICAgICAgICBjYXNlIExvZ2ljYWxOb3Q6CisgICAgICAgICAgICByZXR1cm4g
IWxvZ2ljYWxOb3RJc1B1cmUobm9kZSk7CisgICAgICAgIGNhc2UgR2V0QnlWYWw6CisgICAgICAg
ICAgICByZXR1cm4gIWJ5VmFsSXNQdXJlKG5vZGUpOworICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8g
SWYgYnkgc29tZSBvZGRpdHkgd2UgaGl0IHRoaXMgY2FzZSBpbiByZWxlYXNlIGJ1aWxkIGl0J3Mg
c2FmZXIgdG8gaGF2ZSBDU0UgYXNzdW1lIHRoZSB3b3JzdC4KKyAgICAgICAgfQorICAgIH0KKyAg
ICAKKyAgICB2b2lkIHByb2Nlc3NQaGlTdGFjayhQaGlTdGFja1R5cGUsIEJsb2NrSW5kZXggZGVm
aW5pdGlvbkJsb2NrID0gTm9CbG9jayk7CisKICAgICBKU0dsb2JhbERhdGEmIG1fZ2xvYmFsRGF0
YTsKICAgICBDb2RlQmxvY2sqIG1fY29kZUJsb2NrOwogICAgIENvZGVCbG9jayogbV9wcm9maWxl
ZEJsb2NrOwogCiAgICAgVmVjdG9yPCBPd25QdHI8QmFzaWNCbG9jaz4gLCA4PiBtX2Jsb2NrczsK
KyAgICBWZWN0b3I8TG9vcFByZUhlYWRlciwgOD4gbV9sb29wUHJlSGVhZGVyczsKICAgICBWZWN0
b3I8Tm9kZVVzZSwgMTY+IG1fdmFyQXJnQ2hpbGRyZW47CiAgICAgVmVjdG9yPFN0b3JhZ2VBY2Nl
c3NEYXRhPiBtX3N0b3JhZ2VBY2Nlc3NEYXRhOwogICAgIFZlY3RvcjxSZXNvbHZlR2xvYmFsRGF0
YT4gbV9yZXNvbHZlR2xvYmFsRGF0YTsKQEAgLTM1OCw5ICs0MzgsMTIgQEAgcHVibGljOgogICAg
IFNlZ21lbnRlZFZlY3RvcjxWYXJpYWJsZUFjY2Vzc0RhdGEsIDE2PiBtX3ZhcmlhYmxlQWNjZXNz
RGF0YTsKICAgICBTZWdtZW50ZWRWZWN0b3I8U3RydWN0dXJlU2V0LCAxNj4gbV9zdHJ1Y3R1cmVT
ZXQ7CiAgICAgU2VnbWVudGVkVmVjdG9yPFN0cnVjdHVyZVRyYW5zaXRpb25EYXRhLCA4PiBtX3N0
cnVjdHVyZVRyYW5zaXRpb25EYXRhOworICAgIFZlY3RvcjxQaGlTdGFja0VudHJ5LCAxNj4gbV9h
cmd1bWVudFBoaVN0YWNrOworICAgIFZlY3RvcjxQaGlTdGFja0VudHJ5LCAxNj4gbV9sb2NhbFBo
aVN0YWNrOwogICAgIEJpdFZlY3RvciBtX3ByZXNlcnZlZFZhcnM7CiAgICAgdW5zaWduZWQgbV9s
b2NhbFZhcnM7CiAgICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJTbG90czsKKyAgICB1bnNpZ25lZCBt
X29yaWdpbmFsU2l6ZTsgLy8gVGhlIGdyYXBoIHNpemUgYmVmb3JlIHdlIGRvIG9wdGltaXphdGlv
bnMgd2hpY2ggd2lsbCBleHBhbmQgdGhlIGdyYXBoLgogcHJpdmF0ZToKICAgICAKICAgICBib29s
IGFkZEltbWVkaWF0ZVNob3VsZFNwZWN1bGF0ZUludGVnZXIoTm9kZSYgYWRkLCBOb2RlJiB2YXJp
YWJsZSwgTm9kZSYgaW1tZWRpYXRlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdKSVRDb21waWxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHSklUQ29tcGlsZXIuaAkocmV2aXNpb24gMTA5MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdKSVRDb21waWxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOTcsMTQgKzI5Nywx
NCBAQCBwdWJsaWM6CiAgICAgICAgIC8vIHZhbHVlIG9mIChOb25lLCBbXSkuIEJ1dCB0aGUgb2xk
IEpJVCBtYXkgc3Rhc2ggc29tZSB2YWx1ZXMgdGhlcmUuIFNvIHdlIHJlYWxseQogICAgICAgICAv
LyBuZWVkIChUb3AsIFRPUCkuCiAgICAgICAgIGZvciAoc2l6ZV90IGFyZ3VtZW50ID0gMDsgYXJn
dW1lbnQgPCBiYXNpY0Jsb2NrLnZhcmlhYmxlc0F0SGVhZC5udW1iZXJPZkFyZ3VtZW50cygpOyAr
K2FyZ3VtZW50KSB7Ci0gICAgICAgICAgICBpZiAoYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQu
YXJndW1lbnQoYXJndW1lbnQpID09IE5vTm9kZSkKKyAgICAgICAgICAgIGlmICghYmFzaWNCbG9j
ay5jZmFIYXNWaXNpdGVkIHx8IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLmFyZ3VtZW50KGFy
Z3VtZW50KSA9PSBOb05vZGUpCiAgICAgICAgICAgICAgICAgZW50cnktPm1fZXhwZWN0ZWRWYWx1
ZXMuYXJndW1lbnQoYXJndW1lbnQpLm1ha2VUb3AoKTsKICAgICAgICAgfQogICAgICAgICBmb3Ig
KHNpemVfdCBsb2NhbCA9IDA7IGxvY2FsIDwgYmFzaWNCbG9jay52YXJpYWJsZXNBdEhlYWQubnVt
YmVyT2ZMb2NhbHMoKTsgKytsb2NhbCkgewogICAgICAgICAgICAgTm9kZUluZGV4IG5vZGVJbmRl
eCA9IGJhc2ljQmxvY2sudmFyaWFibGVzQXRIZWFkLmxvY2FsKGxvY2FsKTsKLSAgICAgICAgICAg
IGlmIChub2RlSW5kZXggPT0gTm9Ob2RlKQorICAgICAgICAgICAgaWYgKCFiYXNpY0Jsb2NrLmNm
YUhhc1Zpc2l0ZWQgfHwgbm9kZUluZGV4ID09IE5vTm9kZSkKICAgICAgICAgICAgICAgICBlbnRy
eS0+bV9leHBlY3RlZFZhbHVlcy5sb2NhbChsb2NhbCkubWFrZVRvcCgpOwotICAgICAgICAgICAg
ZWxzZSBpZiAobV9ncmFwaFtub2RlSW5kZXhdLnZhcmlhYmxlQWNjZXNzRGF0YSgpLT5zaG91bGRV
c2VEb3VibGVGb3JtYXQoKSkKKyAgICAgICAgICAgIGlmIChub2RlSW5kZXggIT0gTm9Ob2RlICYm
IG1fZ3JhcGhbbm9kZUluZGV4XS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91Ymxl
Rm9ybWF0KCkpCiAgICAgICAgICAgICAgICAgZW50cnktPm1fbG9jYWxzRm9yY2VkRG91YmxlLnNl
dChsb2NhbCk7CiAgICAgICAgIH0KICNlbHNlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0xJQ01QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdMSUNNUGhhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdMSUNNUGhhc2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDczOCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJERkdMSUNNUGhhc2UuaCIKKworI2lmIEVOQUJM
RShERkdfSklUKQorCisjaW5jbHVkZSAiREZHR3JhcGguaCIKKyNpbmNsdWRlICJERkdQaGFzZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CisKK2NsYXNzIExJQ01QaGFzZSA6
IHB1YmxpYyBQaGFzZSB7CitwdWJsaWM6CisgICAgTElDTVBoYXNlKEdyYXBoJiBncmFwaCkKKyAg
ICAgICAgOiBQaGFzZShncmFwaCwgImxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIikKKyAgICB7
CisgICAgICAgIG1fcmVwbGFjZW1lbnRzLnJlc2l6ZShtX2dyYXBoLnNpemUoKSk7CisgICAgICAg
IAorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9ncmFwaC5zaXplKCk7ICsraSkK
KyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRzW2ldID0gTm9Ob2RlOworICAgIH0KKyAgICAKKyAg
ICB2b2lkIHJ1bigpCisgICAgeworICAgICAgICBCaXRWZWN0b3Igbm9uTGVhZkxvb3BzOyAvLyBU
byBtYXJrIHVwIHRob3NlIGxvb3BzIHdoaWNoIGhhdmUgaW5uZXIgbG9vcHMuCisgICAgICAgIHVu
c2lnbmVkIGkgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9ncmFwaC5tX2xvb3BQcmVI
ZWFkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBCbG9ja0luZGV4IG91dGVyTG9vcCA9
IG1fZ3JhcGgubV9sb29wUHJlSGVhZGVyc1tpXS5vdXRlckxvb3A7CisgICAgICAgICAgICBpZiAo
b3V0ZXJMb29wICE9IE5vQmxvY2spCisgICAgICAgICAgICAgICAgbm9uTGVhZkxvb3BzLnNldChv
dXRlckxvb3ApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fZ3JhcGgu
bV9sb29wUHJlSGVhZGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgTG9vcFByZUhlYWRl
ciBwcmVIZWFkZXIgPSBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnNbaV07CisgICAgICAgICAgICAv
LyBXZSBvbmx5IHBlcmZvcm0gTElDTSBmb3IgdGhlIGxlYWYgKGlubmVybW9zdCkgbG9vcHMgZm9y
IG5vdyEKKyAgICAgICAgICAgIC8vIEFzIE9TUiBpbiB0aGUgaW5uZXIgbG9vcHMgd2lsbCBtYWtl
IExJQ00gZm9yIHRoZSBvdXRlciBsb29wcworICAgICAgICAgICAgLy8gbWVhbmluZ2xlc3MgYnV0
IHdhc3RlZnVsLCB1bmxlc3Mgd2UgZmlndXJlIG91dCBhIGdvb2Qgc29sdXRpb24uCisgICAgICAg
ICAgICBpZiAoIW5vbkxlYWZMb29wcy5nZXQocHJlSGVhZGVyLmJsb2NrSW5kZXgpKQorICAgICAg
ICAgICAgICAgIHBlcmZvcm1MSUNNRm9yKHByZUhlYWRlcik7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBTb21lIFBoaSBub2RlcyBtYXkgbm90IGdldCB1cGRhdGVkIGNoaWxkcmVuIGZvciBub3cu
CisgICAgICAgIGZvciAoaSA9IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQ7IGkgPCBtX2dy
YXBoLm1fb3JpZ2luYWxTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHBlcmZvcm1TdWJzdGl0dXRp
b24obV9ncmFwaFtpXS5jaGlsZHJlbi5jaGlsZDEoKSk7CisgICAgICAgICAgICBwZXJmb3JtU3Vi
c3RpdHV0aW9uKG1fZ3JhcGhbaV0uY2hpbGRyZW4uY2hpbGQyKCkpOworICAgICAgICAgICAgcGVy
Zm9ybVN1YnN0aXR1dGlvbihtX2dyYXBoW2ldLmNoaWxkcmVuLmNoaWxkMygpKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKK3ByaXZhdGU6CisKKyAgICB2b2lkIHBlcmZvcm1TdWJzdGl0dXRpb24o
Tm9kZVVzZSYgY2hpbGQsIGJvb2wgYWRkUmVmID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIENo
ZWNrIGlmIHRoaXMgb3BlcmFuZCBpcyBhY3R1YWxseSB1bnVzZWQuCisgICAgICAgIGlmICghY2hp
bGQgfHwgY2hpbGQuaW5kZXgoKSA+PSBtX3JlcGxhY2VtZW50cy5zaXplKCkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcmVw
bGFjZW1lbnQuCisgICAgICAgIE5vZGVJbmRleCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRz
W2NoaWxkLmluZGV4KCldOworICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gTm9Ob2RlKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgY2hpbGQuc2V0SW5kZXgocmVwbGFj
ZW1lbnQpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlcmUgaXMgZGVmaW5pdGVseSBhIHJlcGxh
Y2VtZW50LiBBc3NlcnQgdGhhdCB0aGUgcmVwbGFjZW1lbnQgZG9lcyBub3QKKyAgICAgICAgLy8g
aGF2ZSBhIHJlcGxhY2VtZW50LgorICAgICAgICBBU1NFUlQoY2hpbGQuaW5kZXgoKSA+PSBtX3Jl
cGxhY2VtZW50cy5zaXplKCkgfHwgbV9yZXBsYWNlbWVudHNbY2hpbGQuaW5kZXgoKV0gPT0gTm9O
b2RlKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhZGRSZWYpCisgICAgICAgICAgICBtX2dyYXBo
LnJlZihjaGlsZCk7CisgICAgfQorICAgIAorI2RlZmluZSBNQVhfSE9JU1RFRF9MT09QX0lOVkFS
SUFOVFMgMjU2CisKKyAgICBzdHJ1Y3QgTG9vcFNpZGVFZmZlY3RzIHsKKyAgICAgICAgZW51bSBD
bG9iYmVyS2luZCB7CisgICAgICAgICAgICBDbG9iYmVyR2V0R2xvYmFsVmFyLAorICAgICAgICAg
ICAgQ2xvYmJlckdldEJ5VmFsLAorICAgICAgICAgICAgQ2xvYmJlckNoZWNrU3RydWN0dXJlLAor
ICAgICAgICAgICAgQ2xvYmJlckdldEJ5T2Zmc2V0LAorICAgICAgICAgICAgQ2xvYmJlckdldFBy
b3BlcnR5U3RvcmFnZSwKKyAgICAgICAgICAgIENsb2JiZXJHZXRJbmRleGVkUHJvcGVydHlTdG9y
YWdlLAorICAgICAgICAgICAgQ2xvYmJlckdldEFycmF5TGVuZ3RoLAorICAgICAgICAgICAgQ2xv
YmJlckdldFN0cmluZ0xlbmd0aAorICAgICAgICB9OworCisgICAgICAgIExvb3BTaWRlRWZmZWN0
cyhCbG9ja0luZGV4IHByZUhlYWRlcikKKyAgICAgICAgICAgIDogcHJlSGVhZGVySW5kZXgocHJl
SGVhZGVyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNhbkhvaXN0R2V0
R2xvYmFsVmFyKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0R2xvYmFsVmFyKTsg
fQorICAgICAgICBib29sIGNhbkhvaXN0R2V0QnlWYWwoKSB7IHJldHVybiAhY2xvYmJlcnMuZ2V0
KENsb2JiZXJHZXRCeVZhbCk7IH0KKyAgICAgICAgYm9vbCBjYW5Ib2lzdENoZWNrU3RydWN0dXJl
KCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUpOyB9CisgICAg
ICAgIGJvb2wgY2FuSG9pc3RHZXRCeU9mZnNldCgpIHsgcmV0dXJuICFjbG9iYmVycy5nZXQoQ2xv
YmJlckdldEJ5T2Zmc2V0KTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0UHJvcGVydHlTdG9y
YWdlKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0UHJvcGVydHlTdG9yYWdlKTsg
fQorICAgICAgICBib29sIGNhbkhvaXN0R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpIHsgcmV0
dXJuICFjbG9iYmVycy5nZXQoQ2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UpOyB9Cisg
ICAgICAgIGJvb2wgY2FuSG9pc3RHZXRBcnJheUxlbmd0aCgpIHsgcmV0dXJuICFjbG9iYmVycy5n
ZXQoQ2xvYmJlckdldEFycmF5TGVuZ3RoKTsgfQorICAgICAgICBib29sIGNhbkhvaXN0R2V0U3Ry
aW5nTGVuZ3RoKCkgeyByZXR1cm4gIWNsb2JiZXJzLmdldChDbG9iYmVyR2V0U3RyaW5nTGVuZ3Ro
KTsgfQorCisgICAgICAgIHZvaWQgY2xvYmJlckdldEdsb2JhbFZhcigpIHsgY2xvYmJlcnMuc2V0
KENsb2JiZXJHZXRHbG9iYWxWYXIpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldEJ5VmFsKCkg
eyBjbG9iYmVycy5zZXQoQ2xvYmJlckdldEJ5VmFsKTsgfQorICAgICAgICB2b2lkIGNsb2JiZXJD
aGVja1N0cnVjdHVyZSgpIHsgY2xvYmJlcnMuc2V0KENsb2JiZXJDaGVja1N0cnVjdHVyZSk7IH0K
KyAgICAgICAgdm9pZCBjbG9iYmVyR2V0QnlPZmZzZXQoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVy
R2V0QnlPZmZzZXQpOyB9CisgICAgICAgIHZvaWQgY2xvYmJlckdldFByb3BlcnR5U3RvcmFnZSgp
IHsgY2xvYmJlcnMuc2V0KENsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UpOyB9CisgICAgICAgIHZv
aWQgY2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2UoKSB7IGNsb2JiZXJzLnNldChDbG9i
YmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSk7IH0KKyAgICAgICAgdm9pZCBjbG9iYmVyR2V0
QXJyYXlMZW5ndGgoKSB7IGNsb2JiZXJzLnNldChDbG9iYmVyR2V0QXJyYXlMZW5ndGgpOyB9Cisg
ICAgICAgIHZvaWQgY2xvYmJlckdldFN0cmluZ0xlbmd0aCgpIHsgY2xvYmJlcnMuc2V0KENsb2Ji
ZXJHZXRTdHJpbmdMZW5ndGgpOyB9CisKKyAgICAgICAgVmVjdG9yPGludCwgOD4gYWNjZXNzZWRM
b2NhbHM7CisgICAgICAgIFZlY3RvcjxpbnQsIDg+IHBvbGx1dGVkTG9jYWxzOworICAgICAgICBW
ZWN0b3I8dW5zaWduZWQsIDQ+IHBvbGx1dGVkR2xvYmFsczsKKyAgICAgICAgVmVjdG9yPE5vZGVJ
bmRleCwgND4gbm9kZXNXaXRoUG9sbHV0ZWRTdHJ1Y3R1cmVzOworICAgICAgICBWZWN0b3I8dW5z
aWduZWQsIDQ+IHBvbGx1dGVkSWRlbnRpZmllcnM7CisgICAgICAgIEJpdFZlY3RvciBjbG9iYmVy
czsKKyAgICAgICAgQmxvY2tJbmRleCBwcmVIZWFkZXJJbmRleDsKKyAgICB9OworCisgICAgdm9p
ZCBhbmFseXplTG9vcFNpZGVFZmZlY3RzKE5vZGVJbmRleCBsb29wQmVnaW4sIE5vZGVJbmRleCBs
b29wRW5kLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgZm9yIChO
b2RlSW5kZXggaW5kZXggPSBsb29wQmVnaW47IGluZGV4IDwgbG9vcEVuZDsgaW5kZXgrKykgewor
ICAgICAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOworCisgICAgICAgICAgICBp
ZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgICAgICAgICBjYXNlIFB1dEJ5VmFs
OgorICAgICAgICAgICAgY2FzZSBQdXRCeVZhbEFsaWFzOgorICAgICAgICAgICAgICAgIC8vIElm
IFB1dEJ5VmFsIHNwZWN1bGF0ZXMgdGhhdCBpdCdzIGFjY2Vzc2luZyBhbiBhcnJheSB3aXRoIGFu
CisgICAgICAgICAgICAgICAgLy8gaW50ZWdlciBpbmRleCwgdGhlbiBpdCdzIGltcG9zc2libGUg
Zm9yIGl0IHRvIGNhdXNlIGEgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlLgor
ICAgICAgICAgICAgICAgIGlmICghbV9ncmFwaC5ieVZhbElzUHVyZShub2RlKSkgeworICAgICAg
ICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyQ2hlY2tTdHJ1Y3R1cmUoKTsKKyAgICAgICAg
ICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEJ5T2Zmc2V0KCk7CisgICAgICAgICAgICAg
ICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gUHV0QnlWYWxBbGlhcyBjYW4ndCBjaGFuZ2UgdGhlIGluZGV4ZWQgc3RvcmFn
ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IFB1dEJ5VmFsKQor
ICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldEluZGV4ZWRQcm9wZXJ0
eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUub3AgPT0gUHV0QnlW
YWwgJiYgIWlzRml4ZWRJbmRleGVkU3RvcmFnZU9iamVjdFByZWRpY3Rpb24obV9ncmFwaFtub2Rl
LmNoaWxkMSgpXS5wcmVkaWN0aW9uKCkpKQorICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5j
bG9iYmVyR2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAgICAgICAgICAgICAgIC8vIFdl
IG11c3QgYXNzdW1lIHRoYXQgdGhlIFB1dEJ5VmFsIHdpbGwgY2xvYmJlciB0aGUgbG9jYXRpb24g
d2UncmUgZ2V0dGluZyBmcm9tLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gZG8g
YmV0dGVyOyBpZiB3ZSBrbm93IHRoYXQgdGhlIFB1dEJ5VmFsIGlzIGFjY2Vzc2luZyBhbiBhcnJh
eSBvZiBhCisgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgR2V0QnlW
YWwsIHRoZW4gd2Uga25vdyB0aGF0IHRoZXkgd29uJ3QgY2xvYmJlciBlYWNoIG90aGVyLgorICAg
ICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeVZhbCgpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSBQdXRTdHJ1Y3R1cmU6CisgICAgICAgICAgICAgICAg
Ly8gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBvciBwdXR0aW5nIHRvIHRoZSBzdG9yYWdlIGNhbm5v
dAorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgcHJvcGVydHkgc3RvcmFnZSBwb2ludGVy
LgorICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIHRoZSBzdHJ1Y3R1cmUgY2Fubm90IGNoYW5n
ZSB0aGUgb3V0Y29tZSBvZiBhIHByb3BlcnR5IGdldC4KKyAgICAgICAgICAgICAgICBsb29wSW5m
by5ub2Rlc1dpdGhQb2xsdXRlZFN0cnVjdHVyZXMuYXBwZW5kKG5vZGUuY2hpbGQxKCkuaW5kZXgo
KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dEJ5T2Zmc2V0
OgorICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYSBwcm9wZXJ0eSBjYW5ub3QgY2hhbmdlIHRo
ZSBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRJZGVudGlmaWVy
cy5hcHBlbmQobV9ncmFwaC5tX3N0b3JhZ2VBY2Nlc3NEYXRhW25vZGUuc3RvcmFnZUFjY2Vzc0Rh
dGFJbmRleCgpXS5pZGVudGlmaWVyTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgQXJyYXlQb3A6CisgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJl
ckdldEJ5VmFsKCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoLgorICAgICAgICAg
ICAgY2FzZSBBcnJheVB1c2g6CisgICAgICAgICAgICAgICAgLy8gQSBwdXNoIGNhbm5vdCBhZmZl
Y3QgcHJldmlvdXNseSBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgICAgICAgICAg
ICAgICAgbG9vcEluZm8uY2xvYmJlckdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIFB1dEdsb2JhbFZhcjoKKyAgICAgICAgICAgICAgICBs
b29wSW5mby5wb2xsdXRlZEdsb2JhbHMuYXBwZW5kKG5vZGUudmFyTnVtYmVyKCkpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKKyAgICAgICAgICAg
IGNhc2UgRmx1c2g6CisgICAgICAgICAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMuYXBw
ZW5kKG5vZGUubG9jYWwoKSk7CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoLgorICAg
ICAgICAgICAgY2FzZSBHZXRMb2NhbDoKKyAgICAgICAgICAgICAgICBsb29wSW5mby5hY2Nlc3Nl
ZExvY2Fscy5hcHBlbmQobm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGguY2xvYmJlcnNX
b3JsZChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckNoZWNr
U3RydWN0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRCeU9m
ZnNldCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0UHJvcGVydHlT
dG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJHZXRJbmRleGVk
UHJvcGVydHlTdG9yYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGxvb3BJbmZvLmNsb2JiZXJH
ZXRCeVZhbCgpOworICAgICAgICAgICAgICAgICAgICBsb29wSW5mby5jbG9iYmVyR2V0QXJyYXlM
ZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJlckdldFN0cmluZ0xl
bmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vcCA9PSBDYWxsIHx8IG5vZGUu
b3AgPT0gQ29uc3RydWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluZm8uY2xvYmJl
ckdldEdsb2JhbFZhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNIb2lzdENh
bmRpZGF0ZShOb2RlJiBub2RlLCBMb29wU2lkZUVmZmVjdHMmIGxvb3BJbmZvKQorICAgIHsKKyAg
ICAgICAgYm9vbCBpc0NhbmRpZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAobm9kZS5v
cCkgeworCisgICAgICAgIGNhc2UgR2V0Q2FsbGVlOgorICAgICAgICBjYXNlIENoZWNrRnVuY3Rp
b246CisgICAgICAgIGNhc2UgU3RyaW5nQ2hhckNvZGVBdDoKKyAgICAgICAgY2FzZSBTdHJpbmdD
aGFyQXQ6CisgICAgICAgIGNhc2UgQ2hlY2tIYXNJbnN0YW5jZToKKyAgICAgICAgY2FzZSBJbnN0
YW5jZU9mOgorICAgICAgICBjYXNlIENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgY2FzZSBCaXRB
bmQ6CisgICAgICAgIGNhc2UgQml0T3I6CisgICAgICAgIGNhc2UgQml0WG9yOgorICAgICAgICBj
YXNlIEJpdExTaGlmdDoKKyAgICAgICAgY2FzZSBCaXRSU2hpZnQ6CisgICAgICAgIGNhc2UgQml0
VVJTaGlmdDoKKyAgICAgICAgY2FzZSBWYWx1ZVRvSW50MzI6CisgICAgICAgIGNhc2UgVUludDMy
VG9OdW1iZXI6CisgICAgICAgIGNhc2UgQXJpdGhBZGQ6CisgICAgICAgIGNhc2UgQXJpdGhTdWI6
CisgICAgICAgIGNhc2UgQXJpdGhOZWdhdGU6CisgICAgICAgIGNhc2UgQXJpdGhNdWw6CisgICAg
ICAgIGNhc2UgQXJpdGhNb2Q6CisgICAgICAgIGNhc2UgQXJpdGhEaXY6CisgICAgICAgIGNhc2Ug
QXJpdGhBYnM6CisgICAgICAgIGNhc2UgQXJpdGhNaW46CisgICAgICAgIGNhc2UgQXJpdGhNYXg6
CisgICAgICAgIGNhc2UgQXJpdGhTcXJ0OgorICAgICAgICBjYXNlIEpTQ29uc3RhbnQ6CisgICAg
ICAgIGNhc2UgV2Vha0pTQ29uc3RhbnQ6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IHRydWU7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWYWx1ZUFkZDoKKyAgICAgICAgY2Fz
ZSBDb21wYXJlTGVzczoKKyAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICBjYXNl
IENvbXBhcmVHcmVhdGVyOgorICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6CisgICAgICAg
IC8vIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBtX2dyYXBoLmlz
UHJlZGljdGVkTnVtZXJpY2FsKG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBtX2dyYXBoLmNvbXBhcmVF
cUlzUHVyZShub2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExvZ2ljYWxO
b3Q6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IG1fZ3JhcGgubG9naWNhbE5vdElzUHVyZShu
b2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENoZWNrU3RydWN0dXJlOgor
ICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5jYW5Ib2lzdENoZWNrU3RydWN0dXJl
KCkgJiYgIWxvb3BJbmZvLm5vZGVzV2l0aFBvbGx1dGVkU3RydWN0dXJlcy5jb250YWlucyhub2Rl
LmNoaWxkMSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldEJ5VmFsOgor
ICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBtX2dyYXBoLmJ5VmFsSXNQdXJlKG5vZGUpICYmIGxv
b3BJbmZvLmNhbkhvaXN0R2V0QnlWYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEdldFByb3BlcnR5U3RvcmFnZToKKyAgICAgICAgICAgIGlzQ2FuZGlkYXRlID0gbG9vcElu
Zm8uY2FuSG9pc3RHZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEdldEluZGV4ZWRQcm9wZXJ0eVN0b3JhZ2U6CisgICAgICAgICAgICBpc0NhbmRp
ZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0SW5kZXhlZFByb3BlcnR5U3RvcmFnZSgpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0QnlPZmZzZXQ6CisgICAgICAgICAgICBp
c0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhvaXN0R2V0QnlPZmZzZXQoKSAmJiAhbG9vcEluZm8u
cG9sbHV0ZWRJZGVudGlmaWVycy5jb250YWlucyhtX2dyYXBoLm1fc3RvcmFnZUFjY2Vzc0RhdGFb
bm9kZS5zdG9yYWdlQWNjZXNzRGF0YUluZGV4KCldLmlkZW50aWZpZXJOdW1iZXIpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6CisgICAgICAgIGNhc2Ug
R2V0Qnl0ZUFycmF5TGVuZ3RoOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSBsb29wSW5mby5j
YW5Ib2lzdEdldEFycmF5TGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBHZXRTdHJpbmdMZW5ndGg6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNh
bkhvaXN0R2V0U3RyaW5nTGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBHZXRHbG9iYWxWYXI6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9IGxvb3BJbmZvLmNhbkhv
aXN0R2V0R2xvYmFsVmFyKCkgJiYgIWxvb3BJbmZvLnBvbGx1dGVkR2xvYmFscy5jb250YWlucyhu
b2RlLnZhck51bWJlcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdldExv
Y2FsOgorICAgICAgICAgICAgaXNDYW5kaWRhdGUgPSAhbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMu
Y29udGFpbnMobm9kZS5sb2NhbCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBE
YW5nZXJvdXMhIFBheSBtb3JlIGF0dGVudGlvbiBwbGVhc2UuCisgICAgICAgIGNhc2UgU2V0TG9j
YWw6CisgICAgICAgICAgICBpc0NhbmRpZGF0ZSA9ICFsb29wSW5mby5hY2Nlc3NlZExvY2Fscy5j
b250YWlucyhub2RlLmxvY2FsKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpc0Nh
bmRpZGF0ZTsKKyAgICB9CisKKyAgICBib29sIG5vZGVDYW5CZUhvaXN0ZWQoTm9kZSYgbm9kZSwg
QmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIFZlY3RvcjxOb2RlSW5kZXgsIDM+JiBob2lzdGVkQ2hp
bGRyZW4pCisgICAgeworICAgICAgICBib29sIGNhbkhvaXN0ID0gdHJ1ZTsKKworICAgICAgICBp
ZiAobm9kZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGNoaWxkSWR4ID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkSWR4IDwgbm9kZS5maXJzdENoaWxk
KCkgKyBub2RlLm51bUNoaWxkcmVuKCk7IGNoaWxkSWR4KyspIHsKKyAgICAgICAgICAgICAgICBO
b2RlSW5kZXggY2hpbGQgPSBtX2dyYXBoLm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdLmluZGV4
VW5jaGVja2VkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IE5vTm9kZSkgeworICAg
ICAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1lbnQgPSBtX3JlcGxhY2VtZW50c1tj
aGlsZF07CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA+PSB0YXJnZXRCbG9j
ay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVuZCkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQpOworICAgICAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5Ib2lzdCA9IGZhbHNlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIE5vZGVJbmRleCBjaGlsZDEgPSBub2RlLmNoaWxkcmVuLmNoaWxkMSgpLmluZGV4VW5jaGVj
a2VkKCk7CisgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQyID0gbm9kZS5jaGlsZHJlbi5jaGls
ZDIoKS5pbmRleFVuY2hlY2tlZCgpOworICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IG5v
ZGUuY2hpbGRyZW4uY2hpbGQzKCkuaW5kZXhVbmNoZWNrZWQoKTsKKworICAgICAgICAgICAgaWYg
KGNoaWxkMSAhPSBOb05vZGUpIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggcmVwbGFjZW1l
bnQgPSBtX3JlcGxhY2VtZW50c1tjaGlsZDFdOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNl
bWVudCA+PSB0YXJnZXRCbG9jay5iZWdpbiAmJiByZXBsYWNlbWVudCA8IHRhcmdldEJsb2NrLmVu
ZCkKKyAgICAgICAgICAgICAgICAgICAgaG9pc3RlZENoaWxkcmVuLmFwcGVuZChjaGlsZDEpOwor
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FuSG9pc3QgPSBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlKSB7Cisg
ICAgICAgICAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hp
bGQyXTsKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPj0gdGFyZ2V0QmxvY2suYmVn
aW4gJiYgcmVwbGFjZW1lbnQgPCB0YXJnZXRCbG9jay5lbmQpCisgICAgICAgICAgICAgICAgICAg
IGhvaXN0ZWRDaGlsZHJlbi5hcHBlbmQoY2hpbGQyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIGNhbkhvaXN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoY2hpbGQzICE9IE5vTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGVJbmRl
eCByZXBsYWNlbWVudCA9IG1fcmVwbGFjZW1lbnRzW2NoaWxkM107CisgICAgICAgICAgICAgICAg
aWYgKHJlcGxhY2VtZW50ID49IHRhcmdldEJsb2NrLmJlZ2luICYmIHJlcGxhY2VtZW50IDwgdGFy
Z2V0QmxvY2suZW5kKQorICAgICAgICAgICAgICAgICAgICBob2lzdGVkQ2hpbGRyZW4uYXBwZW5k
KGNoaWxkMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjYW5I
b2lzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGNhbkhvaXN0OworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUhvaXN0KE5vZGVJbmRleCBpbmRl
eCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVuc2lnbmVkJiBob2lzdGVkKQorICAgIHsKKyAg
ICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5kZXhdOworCisgICAgICAgIGlmICghaG9pc3Rl
ZCkKKyAgICAgICAgICAgIHRhcmdldEJsb2NrLmJlZ2luID0gbV9ncmFwaC5zaXplKCk7CisKKyAg
ICAgICAgbV9ncmFwaC5hcHBlbmQobm9kZSk7CisgICAgICAgIE5vZGUmIHJlcGxhY2VtZW50ID0g
bV9ncmFwaC5sYXN0KCk7CisgICAgICAgIHJlcGxhY2VtZW50LnNldFJlZkNvdW50KCFub2RlLmhh
c1Jlc3VsdCgpICYmIChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkgPyAxIDogMCk7CisgICAg
ICAgIC8vIE9ubHkgcGVyZm9ybSBjaGlsZHJlbiBzdWJzdGl0dXRpb24gZm9yIHRoZSByZXBsYWNl
bWVudCBub2RlLgorICAgICAgICBpZiAocmVwbGFjZW1lbnQub3AgJiBOb2RlSGFzVmFyQXJncykg
eworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IHJlcGxhY2VtZW50LmZpcnN0
Q2hpbGQoKTsgY2hpbGRJZHggPCByZXBsYWNlbWVudC5maXJzdENoaWxkKCkgKyByZXBsYWNlbWVu
dC5udW1DaGlsZHJlbigpOyBjaGlsZElkeCsrKQorICAgICAgICAgICAgICAgIHBlcmZvcm1TdWJz
dGl0dXRpb24obV9ncmFwaC5tX3ZhckFyZ0NoaWxkcmVuW2NoaWxkSWR4XSwgcmVwbGFjZW1lbnQu
cmVmQ291bnQoKSk7IC8vIERvbid0IHJlZmVyZW5jZSB0aGUgbmV3IGNoaWxkIGhlcmUuCisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKHJlcGxhY2VtZW50
LmNoaWxkcmVuLmNoaWxkMSgpLCByZXBsYWNlbWVudC5yZWZDb3VudCgpKTsKKyAgICAgICAgICAg
IHBlcmZvcm1TdWJzdGl0dXRpb24ocmVwbGFjZW1lbnQuY2hpbGRyZW4uY2hpbGQyKCksIHJlcGxh
Y2VtZW50LnJlZkNvdW50KCkpOworICAgICAgICAgICAgcGVyZm9ybVN1YnN0aXR1dGlvbihyZXBs
YWNlbWVudC5jaGlsZHJlbi5jaGlsZDMoKSwgcmVwbGFjZW1lbnQucmVmQ291bnQoKSk7CisgICAg
ICAgIH0KKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAg
IGRhdGFMb2coIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV6dSIsIGluZGV4LCBtX2dyYXBoLnNpemUo
KSAtIDEpOworI2VuZGlmCisgICAgICAgIG1fcmVwbGFjZW1lbnRzW2luZGV4XSA9IG1fZ3JhcGgu
c2l6ZSgpIC0gMTsKKyAgICAgICAgTm9kZSYgbmV3Tm9kZSA9IG1fZ3JhcGhbaW5kZXhdOyAvLyBU
aGlzIGNhbiBkaWZmZXIgZnJvbSAibm9kZSIgYmVjYXVzZSBtX2dyYXBoIGlzIGV4cGFuZGVkCisg
ICAgICAgIG5ld05vZGUuc2V0UmVmQ291bnQoMCk7CisgICAgICAgICsraG9pc3RlZDsKKyAgICAg
ICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7CisgICAgfQorCisgICAgdm9pZCBo
b2lzdEdldExvY2FsKE5vZGVJbmRleCBpbmRleCwgQmFzaWNCbG9jayYgdGFyZ2V0QmxvY2ssIHVu
c2lnbmVkJiBob2lzdGVkKQorICAgIHsKKyAgICAgICAgTm9kZSYgbm9kZSA9IG1fZ3JhcGhbaW5k
ZXhdOworICAgICAgICBBU1NFUlQobm9kZS5vcCA9PSBHZXRMb2NhbCk7CisKKyNpZiBERkdfRU5B
QkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgIGRhdGFMb2coIiAgICVzIEAl
dTogIiwgR3JhcGg6Om9wTmFtZShtX2dyYXBoW2luZGV4XS5vcCksIGluZGV4KTsKKyNlbmRpZgor
CisgICAgICAgIGludCBvcGVyYW5kID0gbm9kZS5sb2NhbCgpOworICAgICAgICBOb2RlSW5kZXgg
bGFzdERlZmluZUluZGV4ID0gTm9Ob2RlOworICAgICAgICBpZiAob3BlcmFuZElzQXJndW1lbnQo
b3BlcmFuZCkpCisgICAgICAgICAgICBsYXN0RGVmaW5lSW5kZXggPSB0YXJnZXRCbG9jay52YXJp
YWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBsYXN0RGVmaW5lSW5kZXggPSB0YXJnZXRCbG9jay52YXJpYWJs
ZXNBdFRhaWwubG9jYWwob3BlcmFuZCk7CisKKyAgICAgICAgQVNTRVJUKGxhc3REZWZpbmVJbmRl
eCAhPSBOb05vZGUpOworICAgICAgICBOb2RlJiBsYXN0RGVmaW5lID0gbV9ncmFwaFtsYXN0RGVm
aW5lSW5kZXhdOworICAgICAgICBpZiAobGFzdERlZmluZS5vcCA9PSBHZXRMb2NhbCkgeworI2lm
IERGR19FTkFCTEUoREVCVUdfUFJPUEFHQVRJT05fVkVSQk9TRSkKKyAgICAgICAgICAgIGRhdGFM
b2coIiAgIFJlcGxhY2luZyBAJXUgLT4gQCV1XG4iLCBpbmRleCwgbGFzdERlZmluZUluZGV4KTsK
KyNlbmRpZgorICAgICAgICAgICAgbV9yZXBsYWNlbWVudHNbaW5kZXhdID0gbGFzdERlZmluZUlu
ZGV4OworICAgICAgICAgICAgbm9kZS5zZXRSZWZDb3VudCgwKTsKKyAgICAgICAgICAgIHJldHVy
bjsgLy8gV2UncmUgZG9uZS4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RGVmaW5lLm9w
ID09IFNldExvY2FsKSB7CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHJlYWNoIGhlcmUg
YmVjYXVzZSBhIFNldExvY2FsIHdpdGggdGhpcyBvcGVyYW5kCisgICAgICAgICAgICAvLyBzaG91
bGQgbm90IGJlIGhvaXN0ZWQgdG8gdGhpcyBibG9jayAKKyAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3REZWZpbmUub3AgPT0gUGhp
KSB7CisgICAgICAgICAgICBpZiAoIWhvaXN0ZWQpCisgICAgICAgICAgICAgICAgdGFyZ2V0Qmxv
Y2suYmVnaW4gPSBtX2dyYXBoLnNpemUoKTsKKyAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5kKG1f
Z3JhcGhbaW5kZXhdKTsKKyAgICAgICAgICAgIE5vZGUmIGdldExvY2FsTm9kZSA9IG1fZ3JhcGhb
aW5kZXhdOworICAgICAgICAgICAgTm9kZSYgZ2V0TG9jYWxSZXBsYWNlbWVudCA9IG1fZ3JhcGgu
bGFzdCgpOworICAgICAgICAgICAgZ2V0TG9jYWxSZXBsYWNlbWVudC5jaGlsZHJlbi5zZXRDaGls
ZDEoTm9kZVVzZShsYXN0RGVmaW5lSW5kZXgpKTsKKyAgICAgICAgICAgIG1fcmVwbGFjZW1lbnRz
W2luZGV4XSA9IG1fZ3JhcGguc2l6ZSgpIC0gMTsKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BB
R0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAgICBkYXRhTG9nKCIgICBSZXBsYWNpbmcgQCV1IC0+
IEAlenVcbiIsIGluZGV4LCBtX2dyYXBoLnNpemUoKSAtIDEpOworI2VuZGlmCisgICAgICAgICAg
ICBnZXRMb2NhbFJlcGxhY2VtZW50LnNldFJlZkNvdW50KDApOworICAgICAgICAgICAgZ2V0TG9j
YWxOb2RlLnNldFJlZkNvdW50KDApOworICAgICAgICAgICAgKytob2lzdGVkOworICAgICAgICAg
ICAgdGFyZ2V0QmxvY2suZW5kID0gbV9ncmFwaC5zaXplKCk7CisKKyAgICAgICAgICAgIGlmIChv
cGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkKKyAgICAgICAgICAgICAgICB0YXJnZXRCbG9jay52
YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQob3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCkpID0gbV9n
cmFwaC5zaXplKCkgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRhcmdl
dEJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IG1fZ3JhcGguc2l6ZSgpIC0g
MTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZml4SG9pc3RlZENoaWxkV2l0aFNldExv
Y2FsKEJsb2NrSW5kZXggYmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBMb29wU2lkZUVmZmVj
dHMmIGxvb3BJbmZvKQorICAgIHsKKyAgICAgICAgTm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9y
ZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBBU1NFUlQocmVwbGFjZW1lbnQgIT0gTm9Ob2Rl
KTsKKyAgICAgICAgQVNTRVJUKG1fZ3JhcGhbY2hpbGRdLm9wICE9IEdldExvY2FsICYmIG1fZ3Jh
cGhbY2hpbGRdLm9wICE9IFBoaSAmJiBtX2dyYXBoW2NoaWxkXS5vcCAhPSBTZXRMb2NhbCk7Cisg
ICAgICAgIE5vZGUmIHNldExvY2FsTm9kZSA9IG1fZ3JhcGhbcmVwbGFjZW1lbnQgKyAxXTsKKyAg
ICAgICAgQVNTRVJUKHNldExvY2FsTm9kZS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFTU0VS
VChzZXRMb2NhbE5vZGUuY2hpbGRyZW4uY2hpbGQxKCkuaW5kZXgoKSA9PSByZXBsYWNlbWVudCk7
CisKKyAgICAgICAgbV9ncmFwaFtjaGlsZF0ub3AgPSBHZXRMb2NhbDsKKyAgICAgICAgbV9ncmFw
aFtjaGlsZF0uc2V0VmFyaWFibGVBY2Nlc3NEYXRhKHNldExvY2FsTm9kZS52YXJpYWJsZUFjY2Vz
c0RhdGEoKSk7CisgICAgICAgIGludCBvcGVyYW5kID0gbV9ncmFwaFtjaGlsZF0ubG9jYWwoKTsK
KyAgICAgICAgQmFzaWNCbG9jayYgcHJlSGVhZGVyQmxvY2sgPSAqbV9ncmFwaC5tX2Jsb2Nrc1ts
b29wSW5mby5wcmVIZWFkZXJJbmRleF07CisgICAgICAgIEJhc2ljQmxvY2smIGN1cnJlbnRCbG9j
ayA9ICptX2dyYXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdOworICAgICAgICBOb2RlSW5kZXggZmly
c3REZWZpbmVJbmRleCA9IE5vTm9kZTsKKyAgICAgICAgbG9vcEluZm8ucG9sbHV0ZWRMb2NhbHMu
YXBwZW5kKG9wZXJhbmQpOworICAgICAgICBsb29wSW5mby5hY2Nlc3NlZExvY2Fscy5hcHBlbmQo
b3BlcmFuZCk7CisgICAgICAgIGlmIChvcGVyYW5kSXNBcmd1bWVudChvcGVyYW5kKSkgeworICAg
ICAgICAgICAgdW5zaWduZWQgYXJnID0gb3BlcmFuZFRvQXJndW1lbnQob3BlcmFuZCk7CisgICAg
ICAgICAgICBwcmVIZWFkZXJCbG9jay52YXJpYWJsZXNBdFRhaWwuYXJndW1lbnQoYXJnKSA9IHJl
cGxhY2VtZW50ICsgMTsKKyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjdXJyZW50Qmxv
Y2sudmFyaWFibGVzQXRIZWFkLmFyZ3VtZW50KGFyZyk7CisgICAgICAgICAgICBjdXJyZW50Qmxv
Y2sudmFyaWFibGVzQXRUYWlsLmFyZ3VtZW50KGFyZykgPSBjaGlsZDsKKyAgICAgICAgICAgIGlm
IChmaXJzdERlZmluZUluZGV4ID09IE5vTm9kZSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRC
bG9jay52YXJpYWJsZXNBdEhlYWQuc2V0QXJndW1lbnRGaXJzdFRpbWUoYXJnLCBjaGlsZCk7Cisg
ICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgb2RkISBUaGUgbmV3IFBoaSBub2RlIHdp
bGwgYmUgcGxhY2VkIGluIHRoZSAKKyAgICAgICAgICAgICAgICAvLyBwcmUgaGVhZGVyIGJsb2Nr
IHRoYXQgaXQgc2hvdWxkIG5vdCBiZWxvbmcgdG8uCisgICAgICAgICAgICAgICAgZmlyc3REZWZp
bmVJbmRleCA9IG1fZ3JhcGguc2l6ZSgpOworICAgICAgICAgICAgICAgIG1fZ3JhcGguYXBwZW5k
KE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbyhtX2dyYXBoW2NoaWxkXS52YXJpYWJsZUFj
Y2Vzc0RhdGEoKSkpKTsKKyAgICAgICAgICAgICAgICBtX2dyYXBoLm1fYXJndW1lbnRQaGlTdGFj
ay5hcHBlbmQoUGhpU3RhY2tFbnRyeSgmY3VycmVudEJsb2NrLCBmaXJzdERlZmluZUluZGV4LCBh
cmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZUhl
YWRlckJsb2NrLnZhcmlhYmxlc0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IHJlcGxhY2VtZW50ICsg
MTsKKyAgICAgICAgICAgIGZpcnN0RGVmaW5lSW5kZXggPSBjdXJyZW50QmxvY2sudmFyaWFibGVz
QXRIZWFkLmxvY2FsKG9wZXJhbmQpOworICAgICAgICAgICAgY3VycmVudEJsb2NrLnZhcmlhYmxl
c0F0VGFpbC5sb2NhbChvcGVyYW5kKSA9IGNoaWxkOworICAgICAgICAgICAgaWYgKGZpcnN0RGVm
aW5lSW5kZXggPT0gTm9Ob2RlKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLnZhcmlh
Ymxlc0F0SGVhZC5zZXRMb2NhbEZpcnN0VGltZShvcGVyYW5kLCBjaGlsZCk7CisgICAgICAgICAg
ICAgICAgZmlyc3REZWZpbmVJbmRleCA9IG1fZ3JhcGguc2l6ZSgpOworICAgICAgICAgICAgICAg
IG1fZ3JhcGguYXBwZW5kKE5vZGUoUGhpLCBDb2RlT3JpZ2luKCksIE9wSW5mbyhtX2dyYXBoW2No
aWxkXS52YXJpYWJsZUFjY2Vzc0RhdGEoKSkpKTsKKyAgICAgICAgICAgICAgICBtX2dyYXBoLm1f
bG9jYWxQaGlTdGFjay5hcHBlbmQoUGhpU3RhY2tFbnRyeSgmY3VycmVudEJsb2NrLCBmaXJzdERl
ZmluZUluZGV4LCBvcGVyYW5kKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVj
ayBmb3IgcmVhZHMgb2YgdGVtcG9yYXJpZXMgZnJvbSBwcmlvciBibG9ja3MsCisgICAgICAgICAg
ICAvLyBleHBhbmQgbV9wcmVzZXJ2ZWRWYXJzIHRvIGNvdmVyIHRoZXNlLgorICAgICAgICAgICAg
bV9ncmFwaC5tX3ByZXNlcnZlZFZhcnMuc2V0KG9wZXJhbmQpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0ub3AgPT0gR2V0TG9jYWwpCisgICAgICAg
ICAgICBmaXJzdERlZmluZUluZGV4ID0gbV9ncmFwaFtmaXJzdERlZmluZUluZGV4XS5jaGlsZDEo
KS5pbmRleCgpOworCisgICAgICAgIG1fZ3JhcGhbZmlyc3REZWZpbmVJbmRleF0ucmVmKCk7Cisg
ICAgICAgIG1fZ3JhcGhbY2hpbGRdLmNoaWxkcmVuLmluaXRpYWxpemUoZmlyc3REZWZpbmVJbmRl
eCwgTm9Ob2RlLCBOb05vZGUpOworICAgIH0KKworICAgIGJvb2wgZml4SG9pc3RlZENoaWxkKEJs
b2NrSW5kZXggYmxvY2tJbmRleCwgTm9kZUluZGV4IGNoaWxkLCBMb29wU2lkZUVmZmVjdHMmIGxv
b3BJbmZvKQorICAgIHsKKyAgICAgICAgYm9vbCBzdWNjZXNzZnVsID0gdHJ1ZTsKKyAgICAgICAg
Tm9kZUluZGV4IHJlcGxhY2VtZW50ID0gbV9yZXBsYWNlbWVudHNbY2hpbGRdOworICAgICAgICBB
U1NFUlQocmVwbGFjZW1lbnQgIT0gTm9Ob2RlKTsgLy8gQ2hpbGRyZW4gb2YgYSBob2lzdGVkIG5v
ZGUgbXVzdCBoYXZlIGJlZW4gaG9pc3RlZCBhcyB3ZWxsLgorCisgICAgICAgIG1fZ3JhcGhbY2hp
bGRdLnJlZigpOworICAgICAgICBpZiAobV9ncmFwaFtjaGlsZF0ucmVmQ291bnQoKSA9PSAxKSB7
CisgICAgICAgICAgICAvLyBPbmx5IGZpeCB0aGlzIGNoaWxkIG9uY2UuCisgICAgICAgICAgICBp
ZiAobV9ncmFwaFtjaGlsZF0ub3AgIT0gR2V0TG9jYWwgJiYgbV9ncmFwaFtjaGlsZF0ub3AgIT0g
SlNDb25zdGFudCAmJiBtX2dyYXBoW2NoaWxkXS5vcCAhPSBXZWFrSlNDb25zdGFudCkgeworICAg
ICAgICAgICAgICAgIEFTU0VSVChtX2dyYXBoW2NoaWxkXS5vcCAhPSBQaGkgJiYgbV9ncmFwaFtj
aGlsZF0ub3AgIT0gU2V0TG9jYWwpOworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA8
IG1fZ3JhcGguc2l6ZSgpIC0gMSAmJiBtX2dyYXBoW3JlcGxhY2VtZW50ICsgMV0ub3AgPT0gU2V0
TG9jYWwpCisgICAgICAgICAgICAgICAgICAgIGZpeEhvaXN0ZWRDaGlsZFdpdGhTZXRMb2NhbChi
bG9ja0luZGV4LCBjaGlsZCwgbG9vcEluZm8pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgaWYgKG1fZ3JhcGhbY2hpbGRdLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkKKyAgICAgICAg
ICAgICAgICBtX2dyYXBoW2NoaWxkXS5yZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
c3VjY2Vzc2Z1bDsKKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUhvaXN0ZWRDaGlsZChCbG9ja0lu
ZGV4IGJsb2NrSW5kZXgsIE5vZGVJbmRleCBjaGlsZCwgTG9vcFNpZGVFZmZlY3RzJiBsb29wSW5m
bykKKyAgICB7CisgICAgICAgIGlmIChmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQs
IGxvb3BJbmZvKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZiBmYWlsZWQg
dG8gZml4IHRoaXMgY2hpbGQsIHdlIG5lZWQgdG8gYmFjayB0cmFjay4KKyAgICAgICAgVmVjdG9y
PE5vZGVJbmRleCwgMz4gaG9pc3RlZENoaWxkcmVuV2l0aG91dFNldExvY2FsOworICAgICAgICBo
b2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkKTsKKyAgICAgICAgd2hp
bGUgKCFob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtob2lzdGVkQ2hpbGRyZW5XaXRob3V0U2V0TG9jYWwu
bGFzdCgpXTsKKyAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5yZW1v
dmVMYXN0KCk7CisgICAgICAgICAgICBpZiAobm9kZS5vcCAmIE5vZGVIYXNWYXJBcmdzKSB7Cisg
ICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjaGlsZElkeCA9IG5vZGUuZmlyc3RDaGlsZCgp
OyBjaGlsZElkeCA8IG5vZGUuZmlyc3RDaGlsZCgpICsgbm9kZS5udW1DaGlsZHJlbigpOyBjaGls
ZElkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGVJbmRleCBjaGlsZHggPSBtX2dyYXBo
Lm1fdmFyQXJnQ2hpbGRyZW5bY2hpbGRJZHhdLmluZGV4VW5jaGVja2VkKCk7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChjaGlsZHggIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJ
bmRleCwgY2hpbGR4LCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICBob2lzdGVk
Q2hpbGRyZW5XaXRob3V0U2V0TG9jYWwuYXBwZW5kKGNoaWxkeCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hpbGQx
ID0gbm9kZS5jaGlsZHJlbi5jaGlsZDEoKS5pbmRleFVuY2hlY2tlZCgpOworICAgICAgICAgICAg
ICAgIE5vZGVJbmRleCBjaGlsZDIgPSBub2RlLmNoaWxkcmVuLmNoaWxkMigpLmluZGV4VW5jaGVj
a2VkKCk7CisgICAgICAgICAgICAgICAgTm9kZUluZGV4IGNoaWxkMyA9IG5vZGUuY2hpbGRyZW4u
Y2hpbGQzKCkuaW5kZXhVbmNoZWNrZWQoKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDEg
IT0gTm9Ob2RlICYmICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQxLCBsb29wSW5m
bykpCisgICAgICAgICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5h
cHBlbmQoY2hpbGQxKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDIgIT0gTm9Ob2RlICYm
ICFmaXhIb2lzdGVkQ2hpbGQoYmxvY2tJbmRleCwgY2hpbGQyLCBsb29wSW5mbykpCisgICAgICAg
ICAgICAgICAgICAgIGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQy
KTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZDMgIT0gTm9Ob2RlICYmICFmaXhIb2lzdGVk
Q2hpbGQoYmxvY2tJbmRleCwgY2hpbGQzLCBsb29wSW5mbykpCisgICAgICAgICAgICAgICAgICAg
IGhvaXN0ZWRDaGlsZHJlbldpdGhvdXRTZXRMb2NhbC5hcHBlbmQoY2hpbGQzKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNMb29wUHJlSGVhZGVyQmxvY2so
QmxvY2tJbmRleCBpbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlm
IChtX2dyYXBoLm1fbG9vcFByZUhlYWRlcnNbaV0uYmxvY2tJbmRleCA9PSBpbmRleCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgLy8gQWRvcHQgdGhlIGRvbWluYW5jZSBhbGdvcml0aG0gYnkgQ29vcGVy
LCBLZWl0aCBELjsgSGFydmV5LCBUaW1vdGh5IEo7IGFuZCBLZW5uZWR5LCBLZW4gKDIwMDEpLiAK
KyAgICAvLyAiQSBTaW1wbGUsIEZhc3QgRG9taW5hbmNlIEFsZ29yaXRobSIKKyAgICAvLyBodHRw
Oi8vd3d3LmhpcGVyc29mdC5yaWNlLmVkdS9ncmFkcy9wdWJsaWNhdGlvbnMvZG9tMTQucGRmCisg
ICAgdW5zaWduZWQgaW50ZXJzZWN0KHVuc2lnbmVkIGIxLCB1bnNpZ25lZCBiMiwgVmVjdG9yPHVu
c2lnbmVkPiYgZG9tVHJlZSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGZpbmdlcjEgPSBiMTsK
KyAgICAgICAgdW5zaWduZWQgZmluZ2VyMiA9IGIyOworCisgICAgICAgIHdoaWxlIChmaW5nZXIx
ICE9IGZpbmdlcjIpIHsKKyAgICAgICAgICAgIHdoaWxlIChmaW5nZXIxID4gZmluZ2VyMikKKyAg
ICAgICAgICAgICAgIGZpbmdlcjEgPSBkb21UcmVlW2ZpbmdlcjFdOworICAgICAgICAgICAgd2hp
bGUgKGZpbmdlcjIgPiBmaW5nZXIxKQorICAgICAgICAgICAgICAgZmluZ2VyMiA9IGRvbVRyZWVb
ZmluZ2VyMl07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmluZ2VyMTsKKyAgICB9CisK
KyAgICB2b2lkIGNvbXB1dGVEb21pbmF0b3JzKEJsb2NrSW5kZXggYmVnaW4sIEJsb2NrSW5kZXgg
ZW5kLCBWZWN0b3I8QmxvY2tJbmRleCwgOD4mIGRvbWluYXRvcnMpCisgICAgeworICAgICAgICAv
LyBGaXJzdGx5IGNvbXB1dGUgdGhlIGRvbWluYXRvciB0cmVlLgorICAgICAgICAvLyBUaGUgdHJl
ZSBub2RlIGluZGV4IGlzIHRoZSBibG9jayBpbmRleCBvZmZzZXRlZCBieSB0aGUgYmVnaW4gYmxv
Y2sgaW5kZXguCisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZD4gZG9tVHJlZTsKKyAgICAgICAgdW5z
aWduZWQgc2l6ZSA9IGVuZCAtIGJlZ2luICsgMTsKKworICAgICAgICBkb21UcmVlLnJlc2l6ZShz
aXplKTsKKyAgICAgICAgZG9tVHJlZVswXSA9IDA7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDE7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBkb21UcmVlW2ldID0gc2l6ZTsKKworICAg
ICAgICBib29sIGNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIHdoaWxlIChjaGFuZ2VkKSB7Cisg
ICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1fZ3JhcGgubV9i
bG9ja3NbYmVnaW4gKyBpXS0+aXNSZWFjaGFibGUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFZlcmlmeSBhbmQgZW5zdXJlIHRoYXQg
dGhlIHByZWNlc3NvcnMgYXJlIG9yZGVyZWQgYnkgaW5kZXguCisgICAgICAgICAgICAgICAgUHJl
ZGVjZXNzb3JMaXN0JiBwcmVkZWNlc3NvcnMgPSBtX2dyYXBoLm1fYmxvY2tzW2JlZ2luICsgaV0t
Pm1fcHJlZGVjZXNzb3JzOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGogPSAwOworICAgICAg
ICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHByZWRlY2Vzc29yIGluIHRoaXMgc3ViZ3JhcGgK
KyAgICAgICAgICAgICAgICB3aGlsZSAocHJlZGVjZXNzb3JzW2pdIDwgYmVnaW4pCisgICAgICAg
ICAgICAgICAgICAgIGorKzsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5ld0lEb20gPSBw
cmVkZWNlc3NvcnNbal0gLSBiZWdpbjsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZG9tVHJlZVtu
ZXdJRG9tXSAhPSBzaXplKTsgLy8gTXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorICAgICAgICAg
ICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IHByZWRlY2Vzc29ycy5zaXpl
KCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwcmVkID0gcHJlZGVjZXNz
b3JzW2pdIC0gYmVnaW47CisgICAgICAgICAgICAgICAgICAgIGlmIChkb21UcmVlW3ByZWRdICE9
IHNpemUpIC8vIE1lYW5zIGl0J3MgYWxyZWFkeSBjYWxjdWxhdGVkLgorICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3SURvbSA9IGludGVyc2VjdChwcmVkLCBuZXdJRG9tLCBkb21UcmVlKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvbVRyZWVbaV0gIT0gbmV3SURv
bSkgeworICAgICAgICAgICAgICAgICAgICBkb21UcmVlW2ldID0gbmV3SURvbTsKKyAgICAgICAg
ICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgaWYgKGlzTG9vcFByZUhlYWRlckJsb2NrKGJlZ2luICsgaSkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gU2tpcCB0aGUgY29uZGl0aW9uYWwgaW5uZXIgbG9vcHMgaWYgcG9zc2li
bGUuCisgICAgICAgICAgICAgICAgICAgIE5vZGUmIGp1bXAgPSBtX2dyYXBoW21fZ3JhcGgubV9i
bG9ja3NbYmVnaW4gKyBpXS0+ZW5kIC0gMV07CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChq
dW1wLm9wID09IEp1bXApOworICAgICAgICAgICAgICAgICAgICBpID0ganVtcC50YWtlbkJsb2Nr
SW5kZXgoKSAtIGJlZ2luIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIHRyYXZlcnNlIHRoZSBkb21pbmF0b3IgdHJlZSB0
byBnZXQgdGhlIGRvbWluYXRvcnMgb2YgdGhlIGxhc3QgYmxvY2suCisgICAgICAgIHVuc2lnbmVk
IGlkb20gPSBkb21UcmVlLmxhc3QoKTsKKyAgICAgICAgd2hpbGUgKGlkb20pIHsKKyAgICAgICAg
ICAgIGRvbWluYXRvcnMuYXBwZW5kKGlkb20gKyBiZWdpbik7CisgICAgICAgICAgICBpZG9tID0g
ZG9tVHJlZVtpZG9tXTsKKyAgICAgICAgfQorICAgICAgICBkb21pbmF0b3JzLmFwcGVuZChiZWdp
bik7CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtTElDTUZvcihMb29wUHJlSGVhZGVyJiBwcmVI
ZWFkZXIpCisgICAgeworICAgICAgICBCbG9ja0luZGV4IHByZUhlYWRlckluZGV4ID0gcHJlSGVh
ZGVyLmJsb2NrSW5kZXg7CisgICAgICAgIEJhc2ljQmxvY2smIHByZUhlYWRlckJsb2NrID0gKm1f
Z3JhcGgubV9ibG9ja3NbcHJlSGVhZGVySW5kZXhdOworICAgICAgICBCbG9ja0luZGV4IGxvb3BI
ZWFkZXJJbmRleCA9IG1fZ3JhcGhbcHJlSGVhZGVyQmxvY2suZW5kIC0gMV0udGFrZW5CbG9ja0lu
ZGV4KCk7CisgICAgICAgIEJsb2NrSW5kZXggZmlyc3RMb29wQmxvY2tJbmRleCA9IHByZUhlYWRl
ckluZGV4ICsgMTsKKyAgICAgICAgQmxvY2tJbmRleCBsYXN0TG9vcEJsb2NrSW5kZXggPSBsb29w
SGVhZGVySW5kZXg7CisgICAgICAgIExvb3BTaWRlRWZmZWN0cyBsb29wSW5mbyhwcmVIZWFkZXJJ
bmRleCk7CisgICAgICAgIHVuc2lnbmVkIHByZUhlYWRlckVuZEJlZm9yZUxJQ00gPSBwcmVIZWFk
ZXJCbG9jay5lbmQ7CisgICAgICAgIHVuc2lnbmVkIGhvaXN0ZWQgPSAwOworCisgICAgICAgIEJh
c2ljQmxvY2smIGJsb2NrID0gKm1fZ3JhcGgubV9ibG9ja3NbbG9vcEhlYWRlckluZGV4XTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGJsb2NrLm1fcHJlZGVjZXNzb3JzLnNpemUo
KTsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmxvY2subV9wcmVkZWNlc3NvcnNbaV0gPiBsYXN0
TG9vcEJsb2NrSW5kZXgpCisgICAgICAgICAgICAgICAgbGFzdExvb3BCbG9ja0luZGV4ID0gYmxv
Y2subV9wcmVkZWNlc3NvcnNbaV07IC8vIFRoZSBmcm9tIGJsb2NrIG9mIHRoZSBiYWNrIGVkZ2Uu
CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8QmxvY2tJbmRleCwgOD4gbXVzdFJlYWNoQmxv
Y2tzSW5Mb29wOworICAgICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AuYXBwZW5kKGxhc3RMb29w
QmxvY2tJbmRleCk7CisgICAgICAgIGNvbXB1dGVEb21pbmF0b3JzKGZpcnN0TG9vcEJsb2NrSW5k
ZXgsIGxhc3RMb29wQmxvY2tJbmRleCwgbXVzdFJlYWNoQmxvY2tzSW5Mb29wKTsKKyAgICAgICAg
YW5hbHl6ZUxvb3BTaWRlRWZmZWN0cyhtX2dyYXBoLm1fYmxvY2tzW2ZpcnN0TG9vcEJsb2NrSW5k
ZXhdLT5iZWdpbiwgbV9ncmFwaC5tX2Jsb2Nrc1tsYXN0TG9vcEJsb2NrSW5kZXhdLT5lbmQsIGxv
b3BJbmZvKTsKKworICAgICAgICB3aGlsZSAoIW11c3RSZWFjaEJsb2Nrc0luTG9vcC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggYmxvY2tJbmRleCA9IG11c3RSZWFjaEJsb2Nr
c0luTG9vcC5sYXN0KCk7CisgICAgICAgICAgICBtdXN0UmVhY2hCbG9ja3NJbkxvb3AucmVtb3Zl
TGFzdCgpOworCisgICAgICAgICAgICBmb3IgKE5vZGVJbmRleCBjb21waWxlSW5kZXggPSBtX2dy
YXBoLm1fYmxvY2tzW2Jsb2NrSW5kZXhdLT5iZWdpbjsgY29tcGlsZUluZGV4IDwgbV9ncmFwaC5t
X2Jsb2Nrc1tibG9ja0luZGV4XS0+ZW5kOyArK2NvbXBpbGVJbmRleCkgeworICAgICAgICAgICAg
ICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2NvbXBpbGVJbmRleF07CisKKyAgICAgICAgICAgICAg
ICBpZiAobm9kZS5vcCA9PSBQaGkgfHwgbm9kZS5vcCA9PSBGbHVzaCkgeworICAgICAgICAgICAg
ICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4uY2hpbGQxKCkpOworICAg
ICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRyZW4uY2hpbGQy
KCkpOworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3Vic3RpdHV0aW9uKG5vZGUuY2hpbGRy
ZW4uY2hpbGQzKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sIHNob3VsZEdlbmVyYXRlID0gbm9kZS5zaG91
bGRHZW5lcmF0ZSgpOworICAgICAgICAgICAgICAgIGJvb2wgY2FuSG9pc3QgPSBob2lzdGVkIDwg
TUFYX0hPSVNURURfTE9PUF9JTlZBUklBTlRTIC0gMQorICAgICAgICAgICAgICAgICAgICAmJiBp
c0hvaXN0Q2FuZGlkYXRlKG5vZGUsIGxvb3BJbmZvKTsKKworICAgICAgICAgICAgICAgIC8vIExv
b2sgb25lIHN0ZXAgYWhlYWQuCisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGhbY29tcGlsZUlu
ZGV4ICsgMV0ub3AgPT0gU2V0TG9jYWwgJiYgbG9vcEluZm8uYWNjZXNzZWRMb2NhbHMuY29udGFp
bnMobV9ncmFwaFtjb21waWxlSW5kZXggKyAxXS5sb2NhbCgpKSkKKyAgICAgICAgICAgICAgICAg
ICAgY2FuSG9pc3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09IEdl
dExvY2FsICYmIGNhbkhvaXN0ICYmIHNob3VsZEdlbmVyYXRlKSB7CisgICAgICAgICAgICAgICAg
ICAgIGhvaXN0R2V0TG9jYWwoY29tcGlsZUluZGV4LCBwcmVIZWFkZXJCbG9jaywgaG9pc3RlZCk7
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIFZlY3RvcjxOb2RlSW5kZXgsIDM+IGhvaXN0ZWRDaGlsZHJlbjsKKyAgICAg
ICAgICAgICAgICBjYW5Ib2lzdCAmPSBub2RlQ2FuQmVIb2lzdGVkKG5vZGUsIHByZUhlYWRlckJs
b2NrLCBob2lzdGVkQ2hpbGRyZW4pOworCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBo
b2lzdCB0aGUgU2V0TG9jYWwgbm9kZSB3aGF0ZXZlci4KKyAgICAgICAgICAgICAgICBpZiAoIXNo
b3VsZEdlbmVyYXRlICYmIG5vZGUub3AgIT0gU2V0TG9jYWwpCisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZF
UkJPU0UpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgJXMgQCV1OiAiLCBHcmFwaDo6b3BO
YW1lKG1fZ3JhcGhbY29tcGlsZUluZGV4XS5vcCksIGNvbXBpbGVJbmRleCk7CisjZW5kaWYKKwor
ICAgICAgICAgICAgICAgIGlmIChjYW5Ib2lzdCkKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9y
bUhvaXN0KGNvbXBpbGVJbmRleCwgcHJlSGVhZGVyQmxvY2ssIGhvaXN0ZWQpOworICAgICAgICAg
ICAgICAgIGVsc2UgaWYgKHNob3VsZEdlbmVyYXRlICYmICFob2lzdGVkQ2hpbGRyZW4uaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBjYW5ub3QgYmUgaG9pc3Rl
ZCBidXQgaXQgY29udGFpbnMgc29tZSByZWZlcmVuY2VzIHRvIHRoZSBob2lzdGVkIG5vZGVzLgor
ICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgc3VjaCByZWZlcmVuY2VzIGJ5IHV0aWxpemlu
ZyBTZXRMb2NhbC9HZXRMb2NhbCBmb3IgY3Jvc3MgYmxvY2sgcmVmZXJlbmNlcy4KKyAgICAgICAg
ICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGhvaXN0ZWRDaGlsZHJlbi5zaXpl
KCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhvaXN0ZWRDaGlsZChibG9j
a0luZGV4LCBob2lzdGVkQ2hpbGRyZW5baV0sIGxvb3BJbmZvKTsKKyAgICAgICAgICAgICAgICB9
CisKKyNpZiBERkdfRU5BQkxFKERFQlVHX1BST1BBR0FUSU9OX1ZFUkJPU0UpCisgICAgICAgICAg
ICAgICAgZGF0YUxvZygiXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgaWYgKGhvaXN0ZWQpIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2dyYXBoW3ByZUhl
YWRlckVuZEJlZm9yZUxJQ00gLSAxXS5vcCA9PSBKdW1wKTsKKyAgICAgICAgICAgIG1fZ3JhcGgu
YXBwZW5kKG1fZ3JhcGhbcHJlSGVhZGVyRW5kQmVmb3JlTElDTSAtIDFdKTsKKyAgICAgICAgICAg
IHByZUhlYWRlckJsb2NrLmVuZCA9IG1fZ3JhcGguc2l6ZSgpOworCisgICAgICAgICAgICAvLyBQ
cm9jZXNzIHRoZSBuZXdseSBjcmVhdGVkIFBoaSBub2RlcyBkdXJpbmcgTElDTS4KKyAgICAgICAg
ICAgIG1fZ3JhcGgucHJvY2Vzc1BoaVN0YWNrKExvY2FsUGhpU3RhY2ssIHByZUhlYWRlckluZGV4
KTsKKyAgICAgICAgICAgIG1fZ3JhcGgucHJvY2Vzc1BoaVN0YWNrKEFyZ3VtZW50UGhpU3RhY2ss
IHByZUhlYWRlckluZGV4KTsKKworICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSByZWZlcmVuY2Ug
Y291bnRzIG9mIHRoZSBNdXN0R2VuZXJhdGUgbm9kZXMuCisgICAgICAgICAgICAvLyBGb3IgZWZm
aWNpZW5jeSB3ZSBpbml0aWFsbHkgc2V0IHRoZSBjb3VudCB0byBiZSB6ZXJvIHdoZW4gaG9pc3Rp
bmcgdGhlbQorICAgICAgICAgICAgLy8gYXMgdGhleSBtYXkgYmUgZmluYWxseSBub3QgbmVlZGVk
IHRvIGJlIGhvaXN0ZWQsIHNvIHRoYXQgdGhleSB3b24ndCBiZQorICAgICAgICAgICAgLy8gKHdh
c3RlZnVsbHkpIGV2YWx1YXRlZC4KKyAgICAgICAgICAgIC8vIEJ1dCBpbiBjYXNlIGlmIHRoZXkn
cmUgaW5kZWVkIGhvaXN0ZWQgYW5kIG5lZWRlZCB0byBiZSBldmFsdWF0ZWQKKyAgICAgICAgICAg
IC8vIGFmdGVyIHdlIGZpbmlzaCBMSUNNIGZvciBhIGxvb3AsIHdlIG5lZWQgdG8gYWRkIHJlZmVy
ZW5jZSBjb3VudCB0byB0aGVtLgorICAgICAgICAgICAgZm9yIChOb2RlSW5kZXggaW5kZXggPSBw
cmVIZWFkZXJCbG9jay5iZWdpbjsgaW5kZXggPCBwcmVIZWFkZXJCbG9jay5lbmQ7IGluZGV4Kysp
IHsKKyAgICAgICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07CisgICAgICAg
ICAgICAgICAgaWYgKG5vZGUuaGFzUmVzdWx0KCkgJiYgbm9kZS5zaG91bGRHZW5lcmF0ZSgpICYm
IChub2RlLm9wICYgTm9kZU11c3RHZW5lcmF0ZSkpCisgICAgICAgICAgICAgICAgICAgIG5vZGUu
cmVmKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8Tm9k
ZUluZGV4LCAxNj4gbV9yZXBsYWNlbWVudHM7Cit9OworCit2b2lkIHBlcmZvcm1MSUNNKEdyYXBo
JiBncmFwaCkKK3sKKyAgICBydW5QaGFzZTxMSUNNUGhhc2U+KGdyYXBoKTsKK30KKworfSB9IC8v
IG5hbWVzcGFjZSBKU0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKKwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdMSUNNUGhhc2UuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0xJQ01QaGFzZS5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdMSUNNUGhhc2UuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBJbnRlbCBDb3Jwb3Jh
dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgREZHTElDTVBoYXNlX2gKKyNkZWZpbmUgREZHTElDTVBo
YXNlX2gKKworI2luY2x1ZGUgPHd0Zi9QbGF0Zm9ybS5oPgorCisjaWYgRU5BQkxFKERGR19KSVQp
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY2xhc3MgR3JhcGg7CisKKy8v
IExvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uLgorCit2b2lkIHBlcmZvcm1MSUNNKEdyYXBoJik7
CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShERkdfSklU
KQorCisjZW5kaWYgLy8gREZHTElDTVBoYXNlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdOb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdOb2RlLmgJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHTm9kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00OTMsNiArNDkzLDEyIEBAIHN0cnVjdCBO
b2RlIHsKICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VmFyaWFibGVBY2Nlc3NEYXRh
Kj4obV9vcEluZm8pLT5maW5kKCk7CiAgICAgfQogICAgIAorICAgIHZvaWQgc2V0VmFyaWFibGVB
Y2Nlc3NEYXRhKHZvaWQqIGRhdGEpCisgICAgeworICAgICAgICBBU1NFUlQoaGFzVmFyaWFibGVB
Y2Nlc3NEYXRhKCkpOworICAgICAgICBtX29wSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0
cl90PihkYXRhKTsKKyAgICB9CisKICAgICBWaXJ0dWFsUmVnaXN0ZXIgbG9jYWwoKQogICAgIHsK
ICAgICAgICAgcmV0dXJuIHZhcmlhYmxlQWNjZXNzRGF0YSgpLT5sb2NhbCgpOwpAQCAtMTA1NSw3
ICsxMDYxLDcgQEAgc3RydWN0IE5vZGUgewogICAgIHsKICAgICAgICAgcmV0dXJuIG5vZGVDYW5T
cGVjdWxhdGVJbnRlZ2VyKGFyaXRoTm9kZUZsYWdzKCkpOwogICAgIH0KLSAgICAKKwogICAgIHZv
aWQgZHVtcENoaWxkcmVuKEZJTEUqIG91dCkKICAgICB7CiAgICAgICAgIGlmICghY2hpbGQxKCkp
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ByZWRpY3Rpb25Qcm9wYWdhdGlv
blBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1By
ZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNlLmNwcAkocmV2aXNpb24gMTA5MDYyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTEwMiw3ICsxMDIsNyBAQCBwcml2YXRlOgogICAgIAogICAgIHZvaWQg
cHJvcGFnYXRlKE5vZGUmIG5vZGUpCiAgICAgewotICAgICAgICBpZiAoIW5vZGUuc2hvdWxkR2Vu
ZXJhdGUoKSkKKyAgICAgICAgaWYgKCFub2RlLnNob3VsZEdlbmVyYXRlKCkgJiYgbm9kZS5vcCAh
PSBTZXRMb2NhbCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgCiAgICAgICAgIE5vZGVU
eXBlIG9wID0gbm9kZS5vcDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3Bl
Y3VsYXRpdmVKSVQzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gMTA5MDYyKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTcyOCwyMCArMTcyOCwyNCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21w
aWxlKE5vZGUmIG5vZGUpCiAgICAgfQogCiAgICAgY2FzZSBTZXRMb2NhbDogewotICAgICAgICAv
LyBTZXRMb2NhbCBkb3VibGVzIGFzIGEgaGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBiZSBz
dG9yZWQgYW5kCi0gICAgICAgIC8vIGFzIGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3
ZSBzcGVjdWxhdGUgbWFrZSBzdXJlIHRoYXQgd2UKLSAgICAgICAgLy8ga25vdyB3aGVyZSB0aGUg
Y2hpbGQgb2YgdGhpcyBub2RlIG5lZWRzIHRvIGdvIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgIC8v
IHJlZ2lzdGVyIGZpbGUuCi0gICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUpOworICAgICAgICBi
b29sIGlzSG9pc3RlZE5vZGUgPSAobV9jb21waWxlSW5kZXggPj0gbV9qaXQuZ3JhcGgoKS5tX29y
aWdpbmFsU2l6ZSk7CisKKyAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKSB7CisgICAgICAgICAg
ICAvLyBTZXRMb2NhbCBkb3VibGVzIGFzIGEgaGludCBhcyB0byB3aGVyZSBhIG5vZGUgd2lsbCBi
ZSBzdG9yZWQgYW5kCisgICAgICAgICAgICAvLyBhcyBhIHNwZWN1bGF0aW9uIHBvaW50LiBTbyBi
ZWZvcmUgd2Ugc3BlY3VsYXRlIG1ha2Ugc3VyZSB0aGF0IHdlCisgICAgICAgICAgICAvLyBrbm93
IHdoZXJlIHRoZSBjaGlsZCBvZiB0aGlzIG5vZGUgbmVlZHMgdG8gZ28gaW4gdGhlIHZpcnR1YWwK
KyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGZpbGUuCisgICAgICAgICAgICBjb21waWxlTW92SGlu
dChub2RlKTsKICAgICAgICAgCi0gICAgICAgIC8vIEFzIGZhciBhcyBPU1IgaXMgY29uY2VybmVk
LCB3ZSdyZSBvbiB0aGUgYnl0ZWNvZGUgaW5kZXggY29ycmVzcG9uZGluZwotICAgICAgICAvLyB0
byB0aGUgKm5leHQqIGluc3RydWN0aW9uLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5ICJleGVjdXRlZCIg
dGhlCi0gICAgICAgIC8vIFNldExvY2FsIGFuZCB3aGF0ZXZlciBvdGhlciBERkcgTm9kZXMgYXJl
IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyBieXRlY29kZSBpbmRleCBhcyB0
aGUgU2V0TG9jYWwuCi0gICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JPU1IgPT0gbm9kZS5j
b2RlT3JpZ2luKTsKLSAgICAgICAgTm9kZSYgbmV4dE5vZGUgPSBhdChtX2NvbXBpbGVJbmRleCAr
IDEpOworICAgICAgICAgICAgLy8gQXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3JlIG9u
IHRoZSBieXRlY29kZSBpbmRleCBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyB0byB0aGUg
Km5leHQqIGluc3RydWN0aW9uLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5ICJleGVjdXRlZCIgdGhlCisg
ICAgICAgICAgICAvLyBTZXRMb2NhbCBhbmQgd2hhdGV2ZXIgb3RoZXIgREZHIE5vZGVzIGFyZSBh
c3NvY2lhdGVkIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFz
IHRoZSBTZXRMb2NhbC4KKyAgICAgICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JPU1IgPT0g
bm9kZS5jb2RlT3JpZ2luKTsKKyAgICAgICAgICAgIE5vZGUmIG5leHROb2RlID0gYXQobV9jb21w
aWxlSW5kZXggKyAxKTsKICAgICAgICAgCi0gICAgICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IG5l
eHROb2RlLmNvZGVPcmlnaW47CisgICAgICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0
Tm9kZS5jb2RlT3JpZ2luOworICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBpZiAoIW1faml0
LmdyYXBoKCkuaXNDYXB0dXJlZChub2RlLmxvY2FsKCkpKSB7CiAgICAgICAgICAgICBpZiAobm9k
ZS52YXJpYWJsZUFjY2Vzc0RhdGEoKS0+c2hvdWxkVXNlRG91YmxlRm9ybWF0KCkpIHsKQEAgLTE3
NTEsNyArMTc1NSw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkK
ICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2Fy
eSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgICAgICAvLyB0aGlzIGJ5dGVj
b2RlIHZhcmlhYmxlIGZyb20gcmVnaXN0ZXJzIG9yIG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgcmVn
aXN0ZXIgZmlsZSwKICAgICAgICAgICAgICAgICAvLyBidXQgdGhhdCBpdCBpcyBzdG9yZWQgYXMg
YSBkb3VibGUuCi0gICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5k
KG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CisgICAg
ICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgICAgICB2YWx1
ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKERv
dWJsZUluUmVnaXN0ZXJGaWxlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGVkVHlwZSA9IG5vZGUudmFyaWFi
bGVBY2Nlc3NEYXRhKCktPnByZWRpY3Rpb24oKTsKQEAgLTE3NTksMTQgKzE3NjQsMTYgQEAgdm9p
ZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgICAgICAgICAgICAgIERv
dWJsZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CiAgICAgICAgICAgICAgICAg
bV9qaXQuc3RvcmVEb3VibGUodmFsdWUuZnByKCksIEpJVENvbXBpbGVyOjphZGRyZXNzRm9yKG5v
ZGUubG9jYWwoKSkpOwogICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsK
LSAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2Nh
bCgpKSA9IFZhbHVlU291cmNlKERvdWJsZUluUmVnaXN0ZXJGaWxlKTsKKyAgICAgICAgICAgICAg
ICBpZiAoIWlzSG9pc3RlZE5vZGUpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlU291cmNlUmVm
ZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoRG91YmxlSW5SZWdp
c3RlckZpbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAg
ICAgICAgaWYgKGlzSW50MzJQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CiAgICAgICAgICAg
ICAgICAgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7
CiAgICAgICAgICAgICAgICAgbV9qaXQuc3RvcmUzMih2YWx1ZS5ncHIoKSwgSklUQ29tcGlsZXI6
OnBheWxvYWRGb3Iobm9kZS5sb2NhbCgpKSk7CiAgICAgICAgICAgICAgICAgbm9SZXN1bHQobV9j
b21waWxlSW5kZXgpOwotICAgICAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3Bl
cmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoSW50MzJJblJlZ2lzdGVyRmlsZSk7Cisg
ICAgICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgICAgICB2
YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNl
KEludDMySW5SZWdpc3RlckZpbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICAgfQogICAgICAgICAgICAgaWYgKGlzQXJyYXlQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7
CkBAIC0xNzc2LDcgKzE3ODMsOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUm
IG5vZGUpCiAgICAgICAgICAgICAgICAgICAgIHNwZWN1bGF0aW9uQ2hlY2soQmFkVHlwZSwgSlNW
YWx1ZVNvdXJjZTo6dW5ib3hlZENlbGwoY2VsbEdQUiksIG5vZGUuY2hpbGQxKCksIG1faml0LmJy
YW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNz
KGNlbGxHUFIsIEpTQ2VsbDo6Y2xhc3NJbmZvT2Zmc2V0KCkpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1
c3RlZEltbVB0cigmSlNBcnJheTo6c19pbmZvKSkpOwogICAgICAgICAgICAgICAgIG1faml0LnN0
b3JlUHRyKGNlbGxHUFIsIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwog
ICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKLSAgICAgICAgICAgICAg
ICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291
cmNlKENlbGxJblJlZ2lzdGVyRmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWRO
b2RlKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQo
bm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKENlbGxJblJlZ2lzdGVyRmlsZSk7CiAgICAgICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaXNCeXRlQXJy
YXlQcmVkaWN0aW9uKHByZWRpY3RlZFR5cGUpKSB7CkBAIC0xNzg2LDE0ICsxNzk0LDE2IEBAIHZv
aWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgICAgICAgICAg
ICAgc3BlY3VsYXRpb25DaGVjayhCYWRUeXBlLCBKU1ZhbHVlU291cmNlOjp1bmJveGVkQ2VsbChj
ZWxsR1BSKSwgbm9kZS5jaGlsZDEoKSwgbV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpO
b3RFcXVhbCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoY2VsbEdQUiwgSlNDZWxsOjpjbGFzc0lu
Zm9PZmZzZXQoKSksIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKCZKU0J5dGVBcnJheTo6
c19pbmZvKSkpOwogICAgICAgICAgICAgICAgIG1faml0LnN0b3JlUHRyKGNlbGxHUFIsIEpJVENv
bXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICAgICAgICAgIG5vUmVz
dWx0KG1fY29tcGlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5j
ZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKENlbGxJblJlZ2lzdGVyRmls
ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAg
ICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVl
U291cmNlKENlbGxJblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaXNCb29sZWFuUHJlZGljdGlvbihwcmVkaWN0ZWRU
eXBlKSkgewogICAgICAgICAgICAgICAgIFNwZWN1bGF0ZUJvb2xlYW5PcGVyYW5kIHZhbHVlKHRo
aXMsIG5vZGUuY2hpbGQxKCkpOwogICAgICAgICAgICAgICAgIG1faml0LnN0b3JlMzIodmFsdWUu
Z3ByKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICAg
ICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZVNv
dXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKEJvb2xl
YW5JblJlZ2lzdGVyRmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQor
ICAgICAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5s
b2NhbCgpKSA9IFZhbHVlU291cmNlKEJvb2xlYW5JblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE4MDEsNyArMTgxMSw4
IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgbV9q
aXQuc3RvcmUzMih2YWx1ZS5wYXlsb2FkR1BSKCksIEpJVENvbXBpbGVyOjpwYXlsb2FkRm9yKG5v
ZGUubG9jYWwoKSkpOwogICAgICAgICBtX2ppdC5zdG9yZTMyKHZhbHVlLnRhZ0dQUigpLCBKSVRD
b21waWxlcjo6dGFnRm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICBub1Jlc3VsdChtX2NvbXBp
bGVJbmRleCk7Ci0gICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxv
Y2FsKCkpID0gVmFsdWVTb3VyY2UoVmFsdWVJblJlZ2lzdGVyRmlsZSk7CisgICAgICAgIGlmICgh
aXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgIHZhbHVlU291cmNlUmVmZXJlbmNlRm9yT3BlcmFu
ZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoVmFsdWVJblJlZ2lzdGVyRmlsZSk7CiAgICAg
ICAgIGJyZWFrOwogICAgIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdT
cGVjdWxhdGl2ZUpJVDY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCShyZXZpc2lvbiAxMDkwNjIpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xODA5LDMwICsxODA5LDM0IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9k
ZSYgbm9kZSkKICAgICB9CiAKICAgICBjYXNlIFNldExvY2FsOiB7Ci0gICAgICAgIC8vIFNldExv
Y2FsIGRvdWJsZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3JlZCBh
bmQKLSAgICAgICAgLy8gYXMgYSBzcGVjdWxhdGlvbiBwb2ludC4gU28gYmVmb3JlIHdlIHNwZWN1
bGF0ZSBtYWtlIHN1cmUgdGhhdCB3ZQotICAgICAgICAvLyBrbm93IHdoZXJlIHRoZSBjaGlsZCBv
ZiB0aGlzIG5vZGUgbmVlZHMgdG8gZ28gaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgLy8gcmVnaXN0
ZXIgZmlsZS4KLSAgICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7CisgICAgICAgIGJvb2wgaXNI
b2lzdGVkTm9kZSA9IChtX2NvbXBpbGVJbmRleCA+PSBtX2ppdC5ncmFwaCgpLm1fb3JpZ2luYWxT
aXplKTsKKworICAgICAgICBpZiAoIWlzSG9pc3RlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIFNl
dExvY2FsIGRvdWJsZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIGEgbm9kZSB3aWxsIGJlIHN0b3Jl
ZCBhbmQKKyAgICAgICAgICAgIC8vIGFzIGEgc3BlY3VsYXRpb24gcG9pbnQuIFNvIGJlZm9yZSB3
ZSBzcGVjdWxhdGUgbWFrZSBzdXJlIHRoYXQgd2UKKyAgICAgICAgICAgIC8vIGtub3cgd2hlcmUg
dGhlIGNoaWxkIG9mIHRoaXMgbm9kZSBuZWVkcyB0byBnbyBpbiB0aGUgdmlydHVhbAorICAgICAg
ICAgICAgLy8gcmVnaXN0ZXIgZmlsZS4KKyAgICAgICAgICAgIGNvbXBpbGVNb3ZIaW50KG5vZGUp
OwogICAgICAgICAKLSAgICAgICAgLy8gQXMgZmFyIGFzIE9TUiBpcyBjb25jZXJuZWQsIHdlJ3Jl
IG9uIHRoZSBieXRlY29kZSBpbmRleCBjb3JyZXNwb25kaW5nCi0gICAgICAgIC8vIHRvIHRoZSAq
bmV4dCogaW5zdHJ1Y3Rpb24sIHNpbmNlIHdlJ3ZlIGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKLSAg
ICAgICAgLy8gU2V0TG9jYWwgYW5kIHdoYXRldmVyIG90aGVyIERGRyBOb2RlcyBhcmUgYXNzb2Np
YXRlZCB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIGJ5dGVjb2RlIGluZGV4IGFzIHRoZSBTZXRM
b2NhbC4KLSAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNvZGVPcmln
aW4pOwotICAgICAgICBOb2RlJiBuZXh0Tm9kZSA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7Cisg
ICAgICAgICAgICAvLyBBcyBmYXIgYXMgT1NSIGlzIGNvbmNlcm5lZCwgd2UncmUgb24gdGhlIGJ5
dGVjb2RlIGluZGV4IGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHRvIHRoZSAqbmV4dCog
aW5zdHJ1Y3Rpb24sIHNpbmNlIHdlJ3ZlIGFscmVhZHkgImV4ZWN1dGVkIiB0aGUKKyAgICAgICAg
ICAgIC8vIFNldExvY2FsIGFuZCB3aGF0ZXZlciBvdGhlciBERkcgTm9kZXMgYXJlIGFzc29jaWF0
ZWQgd2l0aCB0aGUgc2FtZQorICAgICAgICAgICAgLy8gYnl0ZWNvZGUgaW5kZXggYXMgdGhlIFNl
dExvY2FsLgorICAgICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbkZvck9TUiA9PSBub2RlLmNv
ZGVPcmlnaW4pOworICAgICAgICAgICAgTm9kZSYgbmV4dE5vZGUgPSBhdChtX2NvbXBpbGVJbmRl
eCArIDEpOwogICAgICAgICAKLSAgICAgICAgLy8gT2RkbHksIGl0J3MgcG9zc2libGUgZm9yIHRo
ZSBieXRlY29kZSBpbmRleCBmb3IgdGhlIG5leHQgbm9kZSB0byBiZQotICAgICAgICAvLyBlcXVh
bCB0byBvdXJzLiBUaGlzIHdpbGwgaGFwcGVuIGZvciBvcF9wb3N0X2luYy4gQW5kLCBldmVuIG1v
cmUgb2RkbHksCi0gICAgICAgIC8vIHRoaXMgaXMganVzdCBmaW5lLiBPcmRpbmFyaWx5LCB0aGlz
IHdvdWxkbid0IGJlIGZpbmUsIHNpbmNlIGlmIHRoZQotICAgICAgICAvLyBuZXh0IG5vZGUgZmFp
bGVkIE9TUiB0aGVuIHdlJ2QgYmUgT1NSLWluZyB3aXRoIHRoaXMgU2V0TG9jYWwncyBsb2NhbAot
ICAgICAgICAvLyB2YXJpYWJsZSBhbHJlYWR5IHNldCBldmVuIHRob3VnaCBmcm9tIHRoZSBzdGFu
ZHBvaW50IG9mIHRoZSBvbGQgSklULAotICAgICAgICAvLyB0aGlzIFNldExvY2FsIHNob3VsZCBu
b3QgaGF2ZSBleGVjdXRlZC4gQnV0IGZvciBvcF9wb3N0X2luYywgaXQncyBqdXN0Ci0gICAgICAg
IC8vIGZpbmUsIGJlY2F1c2UgdGhpcyBTZXRMb2NhbCdzIGxvY2FsIChpLmUuIHRoZSBMSFMgaW4g
YSB4ID0geSsrCi0gICAgICAgIC8vIHN0YXRlbWVudCkgd291bGQgYmUgZGVhZCBhbnl3YXkgLSBz
byB0aGUgZmFjdCB0aGF0IERGRyB3b3VsZCBoYXZlCi0gICAgICAgIC8vIGFscmVhZHkgbWFkZSB0
aGUgYXNzaWdubWVudCwgYW5kIGJha2VkIGl0IGludG8gdGhlIHJlZ2lzdGVyIGZpbGUgZHVyaW5n
Ci0gICAgICAgIC8vIE9TUiBleGl0LCB3b3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUgb2xkIEpJ
VCBpbiBhbnkgd2F5LgotICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBuZXh0Tm9kZS5jb2Rl
T3JpZ2luOworICAgICAgICAgICAgLy8gT2RkbHksIGl0J3MgcG9zc2libGUgZm9yIHRoZSBieXRl
Y29kZSBpbmRleCBmb3IgdGhlIG5leHQgbm9kZSB0byBiZQorICAgICAgICAgICAgLy8gZXF1YWwg
dG8gb3Vycy4gVGhpcyB3aWxsIGhhcHBlbiBmb3Igb3BfcG9zdF9pbmMuIEFuZCwgZXZlbiBtb3Jl
IG9kZGx5LAorICAgICAgICAgICAgLy8gdGhpcyBpcyBqdXN0IGZpbmUuIE9yZGluYXJpbHksIHRo
aXMgd291bGRuJ3QgYmUgZmluZSwgc2luY2UgaWYgdGhlCisgICAgICAgICAgICAvLyBuZXh0IG5v
ZGUgZmFpbGVkIE9TUiB0aGVuIHdlJ2QgYmUgT1NSLWluZyB3aXRoIHRoaXMgU2V0TG9jYWwncyBs
b2NhbAorICAgICAgICAgICAgLy8gdmFyaWFibGUgYWxyZWFkeSBzZXQgZXZlbiB0aG91Z2ggZnJv
bSB0aGUgc3RhbmRwb2ludCBvZiB0aGUgb2xkIEpJVCwKKyAgICAgICAgICAgIC8vIHRoaXMgU2V0
TG9jYWwgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1dGVkLiBCdXQgZm9yIG9wX3Bvc3RfaW5jLCBpdCdz
IGp1c3QKKyAgICAgICAgICAgIC8vIGZpbmUsIGJlY2F1c2UgdGhpcyBTZXRMb2NhbCdzIGxvY2Fs
IChpLmUuIHRoZSBMSFMgaW4gYSB4ID0geSsrCisgICAgICAgICAgICAvLyBzdGF0ZW1lbnQpIHdv
dWxkIGJlIGRlYWQgYW55d2F5IC0gc28gdGhlIGZhY3QgdGhhdCBERkcgd291bGQgaGF2ZQorICAg
ICAgICAgICAgLy8gYWxyZWFkeSBtYWRlIHRoZSBhc3NpZ25tZW50LCBhbmQgYmFrZWQgaXQgaW50
byB0aGUgcmVnaXN0ZXIgZmlsZSBkdXJpbmcKKyAgICAgICAgICAgIC8vIE9TUiBleGl0LCB3b3Vs
ZCBub3QgYmUgdmlzaWJsZSB0byB0aGUgb2xkIEpJVCBpbiBhbnkgd2F5LgorICAgICAgICAgICAg
bV9jb2RlT3JpZ2luRm9yT1NSID0gbmV4dE5vZGUuY29kZU9yaWdpbjsKKyAgICAgICAgfQogICAg
ICAgICAKICAgICAgICAgaWYgKCFtX2ppdC5ncmFwaCgpLmlzQ2FwdHVyZWQobm9kZS5sb2NhbCgp
KSkgewogICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFibGVBY2Nlc3NEYXRhKCktPnNob3VsZFVz
ZURvdWJsZUZvcm1hdCgpKSB7CkBAIC0xODQyLDcgKzE4NDYsOCBAQCB2b2lkIFNwZWN1bGF0aXZl
SklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhh
dCBpdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mCiAgICAg
ICAgICAgICAgICAgLy8gdGhpcyBieXRlY29kZSB2YXJpYWJsZSBmcm9tIHJlZ2lzdGVycyBvciBv
dGhlciBsb2NhdGlvbnMgaW4gdGhlIHJlZ2lzdGVyIGZpbGUsCiAgICAgICAgICAgICAgICAgLy8g
YnV0IHRoYXQgaXQgaXMgc3RvcmVkIGFzIGEgZG91YmxlLgotICAgICAgICAgICAgICAgIHZhbHVl
U291cmNlUmVmZXJlbmNlRm9yT3BlcmFuZChub2RlLmxvY2FsKCkpID0gVmFsdWVTb3VyY2UoRG91
YmxlSW5SZWdpc3RlckZpbGUpOworICAgICAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkK
KyAgICAgICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUu
bG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShEb3VibGVJblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIApAQCAtMTg1MSw3ICsxODU2LDgg
QEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgICAgICAgICAg
ICAgIFNwZWN1bGF0ZUludGVnZXJPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwog
ICAgICAgICAgICAgICAgIG1faml0LnN0b3JlMzIodmFsdWUuZ3ByKCksIEpJVENvbXBpbGVyOjpw
YXlsb2FkRm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29t
cGlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJh
bmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKEludDMySW5SZWdpc3RlckZpbGUpOworICAg
ICAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgdmFs
dWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShJ
bnQzMkluUmVnaXN0ZXJGaWxlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIGlmIChpc0FycmF5UHJlZGljdGlvbihwcmVkaWN0ZWRUeXBlKSkgewpA
QCAtMTg2MSw3ICsxODY3LDggQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBu
b2RlKQogICAgICAgICAgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKEJhZFR5cGUsIEpTVmFs
dWVSZWdzKGNlbGxHUFIpLCBub2RlLmNoaWxkMSgpLCBtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3Nl
bWJsZXI6Ok5vdEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhjZWxsR1BSLCBKU0NlbGw6
OmNsYXNzSW5mb09mZnNldCgpKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIoJkpTQXJy
YXk6OnNfaW5mbykpKTsKICAgICAgICAgICAgICAgICBtX2ppdC5zdG9yZVB0cihjZWxsR1BSLCBK
SVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkpKTsKICAgICAgICAgICAgICAgICBu
b1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZl
cmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShDZWxsSW5SZWdpc3Rl
ckZpbGUpOworICAgICAgICAgICAgICAgIGlmICghaXNIb2lzdGVkTm9kZSkKKyAgICAgICAgICAg
ICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBW
YWx1ZVNvdXJjZShDZWxsSW5SZWdpc3RlckZpbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlzQnl0ZUFycmF5UHJlZGljdGlvbihwcmVk
aWN0ZWRUeXBlKSkgewpAQCAtMTg3MSwxNCArMTg3OCwxNiBAQCB2b2lkIFNwZWN1bGF0aXZlSklU
Ojpjb21waWxlKE5vZGUmIG5vZGUpCiAgICAgICAgICAgICAgICAgICAgIHNwZWN1bGF0aW9uQ2hl
Y2soQmFkVHlwZSwgSlNWYWx1ZVJlZ3MoY2VsbEdQUiksIG5vZGUuY2hpbGQxKCksIG1faml0LmJy
YW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNz
KGNlbGxHUFIsIEpTQ2VsbDo6Y2xhc3NJbmZvT2Zmc2V0KCkpLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1
c3RlZEltbVB0cigmSlNCeXRlQXJyYXk6OnNfaW5mbykpKTsKICAgICAgICAgICAgICAgICBtX2pp
dC5zdG9yZVB0cihjZWxsR1BSLCBKSVRDb21waWxlcjo6YWRkcmVzc0Zvcihub2RlLmxvY2FsKCkp
KTsKICAgICAgICAgICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Ci0gICAgICAgICAg
ICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1
ZVNvdXJjZShDZWxsSW5SZWdpc3RlckZpbGUpOworICAgICAgICAgICAgICAgIGlmICghaXNIb2lz
dGVkTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVy
YW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShDZWxsSW5SZWdpc3RlckZpbGUpOwogICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlzQm9v
bGVhblByZWRpY3Rpb24ocHJlZGljdGVkVHlwZSkpIHsKICAgICAgICAgICAgICAgICBTcGVjdWxh
dGVCb29sZWFuT3BlcmFuZCBib29sZWFuKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwogICAgICAgICAg
ICAgICAgIG1faml0LnN0b3JlUHRyKGJvb2xlYW4uZ3ByKCksIEpJVENvbXBpbGVyOjphZGRyZXNz
Rm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUlu
ZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZVNvdXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9k
ZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKEJvb2xlYW5JblJlZ2lzdGVyRmlsZSk7CisgICAgICAg
ICAgICAgICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZVNv
dXJjZVJlZmVyZW5jZUZvck9wZXJhbmQobm9kZS5sb2NhbCgpKSA9IFZhbHVlU291cmNlKEJvb2xl
YW5JblJlZ2lzdGVyRmlsZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9
CiAgICAgICAgIH0KQEAgLTE4ODcsNyArMTg5Niw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNv
bXBpbGUoTm9kZSYgbm9kZSkKICAgICAgICAgbV9qaXQuc3RvcmVQdHIodmFsdWUuZ3ByKCksIEpJ
VENvbXBpbGVyOjphZGRyZXNzRm9yKG5vZGUubG9jYWwoKSkpOwogICAgICAgICBub1Jlc3VsdCht
X2NvbXBpbGVJbmRleCk7CiAKLSAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VGb3JPcGVyYW5k
KG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShWYWx1ZUluUmVnaXN0ZXJGaWxlKTsKKyAgICAg
ICAgaWYgKCFpc0hvaXN0ZWROb2RlKQorICAgICAgICAgICAgdmFsdWVTb3VyY2VSZWZlcmVuY2VG
b3JPcGVyYW5kKG5vZGUubG9jYWwoKSkgPSBWYWx1ZVNvdXJjZShWYWx1ZUluUmVnaXN0ZXJGaWxl
KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkocmV2aXNpb24gMTA5MDYyKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTkxMCw3ICs5MTAsOCBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlTW92SGlu
dChOb2RlCiB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKEJhc2ljQmxvY2smIGJsb2NrKQog
ewogICAgIEFTU0VSVChtX2NvbXBpbGVPa2F5KTsKLSAgICBBU1NFUlQobV9jb21waWxlSW5kZXgg
PT0gYmxvY2suYmVnaW4pOworICAgIC8vIEFTU0VSVChtX2NvbXBpbGVJbmRleCA9PSBibG9jay5i
ZWdpbik7CisgICAgbV9jb21waWxlSW5kZXggPSBibG9jay5iZWdpbjsKICAgICAKICAgICBpZiAo
IWJsb2NrLmlzUmVhY2hhYmxlKSB7CiAgICAgICAgIG1fY29tcGlsZUluZGV4ID0gYmxvY2suZW5k
OwpAQCAtOTQ2LDcgKzk0Nyw4IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNC
bG9jayYKICAgICB9CiAgICAgCiAgICAgbV9sYXN0U2V0T3BlcmFuZCA9IHN0ZDo6bnVtZXJpY19s
aW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgbV9jb2RlT3JpZ2luRm9yT1NSID0gQ29kZU9yaWdpbigp
OworICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IGF0KGJsb2NrLmVuZCAtIDEpLmNvZGVPcmlnaW47
IC8vIEluaXRpYWxpemUgaXQgd2l0aCB0aGUgbGFzdCBub2RlJ3Mgb3JpZ2luIGluIHRoaXMgYmxv
Y2suCisgICAgYm9vbCBibG9ja0NvbnRhaW5zSG9pc3RlZE5vZGVzID0gKG1fY29tcGlsZUluZGV4
ID49IG1faml0LmdyYXBoKCkubV9vcmlnaW5hbFNpemUpOwogICAgIAogICAgIGlmIChERkdfRU5B
QkxFX0VER0VfQ09ERV9WRVJJRklDQVRJT04pIHsKICAgICAgICAgSklUQ29tcGlsZXI6Okp1bXAg
dmVyaWZpY2F0aW9uU3VjY2VlZGVkID0KQEAgLTk1NywzMiArOTU5LDM2IEBAIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGUoQmFzaWNCbG9jayYKIAogICAgIGZvciAoOyBtX2NvbXBpbGVJbmRl
eCA8IGJsb2NrLmVuZDsgKyttX2NvbXBpbGVJbmRleCkgewogICAgICAgICBOb2RlJiBub2RlID0g
YXQobV9jb21waWxlSW5kZXgpOwotICAgICAgICBtX2NvZGVPcmlnaW5Gb3JPU1IgPSBub2RlLmNv
ZGVPcmlnaW47CisgICAgICAgIGlmICghYmxvY2tDb250YWluc0hvaXN0ZWROb2RlcykKKyAgICAg
ICAgICAgIG1fY29kZU9yaWdpbkZvck9TUiA9IG5vZGUuY29kZU9yaWdpbjsKKwogICAgICAgICBp
ZiAoIW5vZGUuc2hvdWxkR2VuZXJhdGUoKSkgewogI2lmIERGR19FTkFCTEUoREVCVUdfVkVSQk9T
RSkKICAgICAgICAgICAgIGRhdGFMb2coIlNwZWN1bGF0aXZlSklUIHNraXBwaW5nIE5vZGUgQCVk
IChiYyMldSkgYXQgSklUIG9mZnNldCAweCV4ICAgICAiLCAoaW50KW1fY29tcGlsZUluZGV4LCBu
b2RlLmNvZGVPcmlnaW4uYnl0ZWNvZGVJbmRleCwgbV9qaXQuZGVidWdPZmZzZXQoKSk7CiAjZW5k
aWYKLSAgICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkgewotICAgICAgICAgICAgY2FzZSBTZXRM
b2NhbDoKLSAgICAgICAgICAgICAgICBjb21waWxlTW92SGludChub2RlKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJbmxpbmVTdGFydDogewotICAgICAgICAg
ICAgICAgIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gbm9kZS5jb2RlT3JpZ2lu
LmlubGluZUNhbGxGcmFtZTsKLSAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudEluY2x1
ZGluZ1RoaXMgPSBpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50cy5zaXplKCk7Ci0gICAgICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpczsgKytp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIFZhbHVlUmVjb3ZlcnkgcmVjb3ZlcnkgPSBjb21wdXRl
VmFsdWVSZWNvdmVyeUZvcihtX3ZhcmlhYmxlc1tpbmxpbmVDYWxsRnJhbWUtPnN0YWNrT2Zmc2V0
ICsgQ2FsbEZyYW1lOjphcmd1bWVudE9mZnNldEluY2x1ZGluZ1RoaXMoaSldKTsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gVGhlIHJlY292ZXJ5IGNhbm5vdCBwb2ludCB0byByZWdpc3RlcnMsIHNp
bmNlIHRoZSBjYWxsIGZyYW1lIHJlaWZpY2F0aW9uIGlzbid0Ci0gICAgICAgICAgICAgICAgICAg
IC8vIGFzIHNtYXJ0IGFzIE9TUiwgc28gaXQgY2FuJ3QgaGFuZGxlIHRoYXQuIFRoZSBleGNlcHRp
b24gaXMgdGhlIHRoaXMgYXJndW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdl
IGRvbid0IHJlYWxseSBuZWVkIHRvIGJlIGFibGUgdG8gcmVjb3Zlci4KLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKCFpIHx8ICFyZWNvdmVyeS5pc0luUmVnaXN0ZXJzKCkpOwotICAgICAgICAg
ICAgICAgICAgICBpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50c1tpXSA9IHJlY292ZXJ5OworICAg
ICAgICAgICAgaWYgKCFibG9ja0NvbnRhaW5zSG9pc3RlZE5vZGVzKSB7CisgICAgICAgICAgICAg
ICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRMb2NhbDoKKyAg
ICAgICAgICAgICAgICAgICAgY29tcGlsZU1vdkhpbnQobm9kZSk7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVTdGFydDogeworICAgICAg
ICAgICAgICAgICAgICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9IG5vZGUuY29k
ZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWU7CisgICAgICAgICAgICAgICAgICAgIGludCBhcmd1bWVu
dENvdW50SW5jbHVkaW5nVGhpcyA9IGlubGluZUNhbGxGcmFtZS0+YXJndW1lbnRzLnNpemUoKTsK
KyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlY292ZXJ5
IHJlY292ZXJ5ID0gY29tcHV0ZVZhbHVlUmVjb3ZlcnlGb3IobV92YXJpYWJsZXNbaW5saW5lQ2Fs
bEZyYW1lLT5zdGFja09mZnNldCArIENhbGxGcmFtZTo6YXJndW1lbnRPZmZzZXRJbmNsdWRpbmdU
aGlzKGkpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjb3ZlcnkgY2Fubm90
IHBvaW50IHRvIHJlZ2lzdGVycywgc2luY2UgdGhlIGNhbGwgZnJhbWUgcmVpZmljYXRpb24gaXNu
J3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHNtYXJ0IGFzIE9TUiwgc28gaXQgY2Fu
J3QgaGFuZGxlIHRoYXQuIFRoZSBleGNlcHRpb24gaXMgdGhlIHRoaXMgYXJndW1lbnQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBiZSBh
YmxlIHRvIHJlY292ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIWkgfHwgIXJl
Y292ZXJ5LmlzSW5SZWdpc3RlcnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVD
YWxsRnJhbWUtPmFyZ3VtZW50c1tpXSA9IHJlY292ZXJ5OworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgCkBAIC0xNTQyLDIwICsx
NTQ4LDIyIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVVSW50MzJUb051bWIKICAgICAv
LyB0byBkbyB0aGlzIGJlY2F1c2UgYnkgdGhpcyBwb2ludCwgdGhlIG9yaWdpbmFsIHZhbHVlcyBu
ZWNlc3NhcnkgdG8gY29tcGlsZSB3aGF0ZXZlcgogICAgIC8vIG9wZXJhdGlvbiB0aGUgVUludDMy
VG9OdW1iZXIgb3JpZ2luYXRlZCBmcm9tIG1pZ2h0IGJlIGRlYWQuCiAgICAgc3BlY3VsYXRpb25D
aGVjayhPdmVyZmxvdywgSlNWYWx1ZVJlZ3MoKSwgTm9Ob2RlLCBtX2ppdC5icmFuY2gzMihNYWNy
b0Fzc2VtYmxlcjo6TGVzc1RoYW4sIG9wMS5ncHIoKSwgVHJ1c3RlZEltbTMyKDApKSk7CisgCisg
ICAgaWYgKG1fY29tcGlsZUluZGV4IDwgbV9qaXQuZ3JhcGgoKS5tX29yaWdpbmFsU2l6ZSkgewor
ICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gZG8gcm9sbCBmb3J3YXJkLgorICAgICAgICBB
U1NFUlQoYXQobV9jb21waWxlSW5kZXggKyAxKS5vcCA9PSBTZXRMb2NhbCk7CisgICAgICAgIEFT
U0VSVChhdChtX2NvbXBpbGVJbmRleCArIDEpLmNvZGVPcmlnaW4gPT0gbm9kZS5jb2RlT3JpZ2lu
KTsKKyAgICAgICAgQVNTRVJUKGF0KG1fY29tcGlsZUluZGV4ICsgMikuY29kZU9yaWdpbiAhPSBu
b2RlLmNvZGVPcmlnaW4pOworICAgICAgICAKKyAgICAgICAgLy8gTm93IGRvIHRoZSBtYWdpYy4K
KyAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1faml0LmNvZGVCbG9jaygpLT5sYXN0T1NSRXhpdCgp
OworICAgICAgICBOb2RlJiBzZXRMb2NhbCA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7CisgICAg
ICAgIGV4aXQubV9jb2RlT3JpZ2luID0gYXQobV9jb21waWxlSW5kZXggKyAyKS5jb2RlT3JpZ2lu
OworICAgICAgICBleGl0Lm1fbGFzdFNldE9wZXJhbmQgPSBzZXRMb2NhbC5sb2NhbCgpOwogICAg
ICAgICAKLSAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gZG8gcm9sbCBmb3J3YXJkLgotICAgIEFT
U0VSVChhdChtX2NvbXBpbGVJbmRleCArIDEpLm9wID09IFNldExvY2FsKTsKLSAgICBBU1NFUlQo
YXQobV9jb21waWxlSW5kZXggKyAxKS5jb2RlT3JpZ2luID09IG5vZGUuY29kZU9yaWdpbik7Ci0g
ICAgQVNTRVJUKGF0KG1fY29tcGlsZUluZGV4ICsgMikuY29kZU9yaWdpbiAhPSBub2RlLmNvZGVP
cmlnaW4pOwotICAgICAgICAKLSAgICAvLyBOb3cgZG8gdGhlIG1hZ2ljLgotICAgIE9TUkV4aXQm
IGV4aXQgPSBtX2ppdC5jb2RlQmxvY2soKS0+bGFzdE9TUkV4aXQoKTsKLSAgICBOb2RlJiBzZXRM
b2NhbCA9IGF0KG1fY29tcGlsZUluZGV4ICsgMSk7Ci0gICAgZXhpdC5tX2NvZGVPcmlnaW4gPSBh
dChtX2NvbXBpbGVJbmRleCArIDIpLmNvZGVPcmlnaW47Ci0gICAgZXhpdC5tX2xhc3RTZXRPcGVy
YW5kID0gc2V0TG9jYWwubG9jYWwoKTsKLSAgICAgICAgCi0gICAgLy8gQ3JlYXRlIHRoZSB2YWx1
ZSByZWNvdmVyeSwgYW5kIHN0dWZmIGl0IGludG8gdGhlIHJpZ2h0IHBsYWNlLgotICAgIGV4aXQu
dmFsdWVSZWNvdmVyeUZvck9wZXJhbmQoc2V0TG9jYWwubG9jYWwoKSkgPSBWYWx1ZVJlY292ZXJ5
Ojp1aW50MzJJbkdQUihvcDEuZ3ByKCkpOworICAgICAgICAvLyBDcmVhdGUgdGhlIHZhbHVlIHJl
Y292ZXJ5LCBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcmlnaHQgcGxhY2UuCisgICAgICAgIGV4aXQu
dmFsdWVSZWNvdmVyeUZvck9wZXJhbmQoc2V0TG9jYWwubG9jYWwoKSkgPSBWYWx1ZVJlY292ZXJ5
Ojp1aW50MzJJbkdQUihvcDEuZ3ByKCkpOworICAgIH0KIAogICAgIG1faml0Lm1vdmUob3AxLmdw
cigpLCByZXN1bHQuZ3ByKCkpOwogICAgIGludGVnZXJSZXN1bHQocmVzdWx0LmdwcigpLCBtX2Nv
bXBpbGVJbmRleCwgb3AxLmZvcm1hdCgpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHVmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZpcnR1YWxSZWdpc3RlckFsbG9jYXRpb25QaGFz
ZS5jcHAJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
VmlydHVhbFJlZ2lzdGVyQWxsb2NhdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgs
OCArNDgsMTEgQEAgcHVibGljOgogICAgICAgICBkYXRhTG9nKCJcbiIpOwogI2VuZGlmCiAgICAg
ICAgIFNjb3JlQm9hcmQgc2NvcmVCb2FyZChtX2dyYXBoLCBtX2dyYXBoLm1fcHJlc2VydmVkVmFy
cyk7Ci0gICAgICAgIHVuc2lnbmVkIHNpemVFeGNsdWRpbmdQaGlOb2RlcyA9IG1fZ3JhcGgubV9i
bG9ja3MubGFzdCgpLT5lbmQ7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZUV4
Y2x1ZGluZ1BoaU5vZGVzOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X2dyYXBoLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBwaGkgbm9kZXMK
KyAgICAgICAgICAgIGlmIChpID49IG1fZ3JhcGgubV9ibG9ja3MubGFzdCgpLT5lbmQgJiYgaSA8
IG1fZ3JhcGgubV9vcmlnaW5hbFNpemUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKICAg
ICAgICAgICAgIE5vZGUmIG5vZGUgPSBtX2dyYXBoW2ldOwogICAgICAgICAKICAgICAgICAgICAg
IGlmICghbm9kZS5zaG91bGRHZW5lcmF0ZSgpIHx8IG5vZGUub3AgPT0gUGhpIHx8IG5vZGUub3Ag
PT0gRmx1c2gpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJw
cmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRl
ci9JbnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9pbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4ODUs
NiArMzg4NSwxMSBAQCBza2lwX2lkX2N1c3RvbV9zZWxmOgogICAgICAgICB2UEMgKz0gT1BDT0RF
X0xFTkdUSChvcF9sb29wX2hpbnQpOwogICAgICAgICBORVhUX0lOU1RSVUNUSU9OKCk7CiAgICAg
fQorICAgIERFRklORV9PUENPREUob3BfbG9vcF9wcmVoZWFkZXIpIHsKKyAgICAgICAgLy8gVGhp
cyBpcyBhIG5vLW9wIHVubGVzcyB3ZSBpbnRlbmQgb24gZG9pbmcgT1NSIGZyb20gdGhlIGludGVy
cHJldGVyLgorICAgICAgICB2UEMgKz0gT1BDT0RFX0xFTkdUSChvcF9sb29wX3ByZWhlYWRlcik7
CisgICAgICAgIE5FWFRfSU5TVFJVQ1RJT04oKTsKKyAgICB9CiAgICAgREVGSU5FX09QQ09ERShv
cF9sb29wX2lmX3RydWUpIHsKICAgICAgICAgLyogbG9vcF9pZl90cnVlIGNvbmQocikgdGFyZ2V0
KG9mZnNldCkKICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAkocmV2
aXNpb24gMTA5MDYyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDEsOCArMTAxLDEwIEBAIHZvaWQgSklUOjplbWl0T3B0aW1pemF0aW9u
Q2hlY2soT3B0aW1pemEKICAgICAKICAgICBKdW1wIHNraXBPcHRpbWl6ZSA9IGJyYW5jaEFkZDMy
KFNpZ25lZCwgVHJ1c3RlZEltbTMyKGtpbmQgPT0gTG9vcE9wdGltaXphdGlvbkNoZWNrID8gT3B0
aW9uczo6ZXhlY3V0aW9uQ291bnRlckluY3JlbWVudEZvckxvb3AgOiBPcHRpb25zOjpleGVjdXRp
b25Db3VudGVySW5jcmVtZW50Rm9yUmV0dXJuKSwgQWJzb2x1dGVBZGRyZXNzKG1fY29kZUJsb2Nr
LT5hZGRyZXNzT2ZKSVRFeGVjdXRlQ291bnRlcigpKSk7CiAgICAgSklUU3R1YkNhbGwgc3R1YkNh
bGwodGhpcywga2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2sgPyBjdGlfb3B0aW1pemVfZnJv
bV9sb29wIDogY3RpX29wdGltaXplX2Zyb21fcmV0KTsKLSAgICBpZiAoa2luZCA9PSBMb29wT3B0
aW1pemF0aW9uQ2hlY2spCi0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKG1fYnl0
ZWNvZGVPZmZzZXQpKTsKKyAgICBpZiAoa2luZCA9PSBMb29wT3B0aW1pemF0aW9uQ2hlY2spIHsK
KyAgICAgICAgSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY29kZUJsb2NrLT5p
bnN0cnVjdGlvbnMoKS5iZWdpbigpICsgbV9ieXRlY29kZU9mZnNldDsKKyAgICAgICAgc3R1YkNh
bGwuYWRkQXJndW1lbnQoSW1tMzIobV9ieXRlY29kZU9mZnNldCArIGN1cnJlbnRJbnN0cnVjdGlv
blsxXS51Lm9wZXJhbmQpKTsKKyAgICB9CiAgICAgc3R1YkNhbGwuY2FsbCgpOwogICAgIHNraXBP
cHRpbWl6ZS5saW5rKHRoaXMpOwogfQpAQCAtMjg3LDYgKzI4OSw3IEBAIHZvaWQgSklUOjpwcml2
YXRlQ29tcGlsZU1haW5QYXNzKCkKICAgICAgICAgREVGSU5FX09QKG9wX2p0cnVlKQogICAgICAg
ICBERUZJTkVfT1Aob3BfbG9vcCkKICAgICAgICAgREVGSU5FX09QKG9wX2xvb3BfaGludCkKKyAg
ICAgICAgREVGSU5FX09QKG9wX2xvb3BfcHJlaGVhZGVyKQogICAgICAgICBERUZJTkVfT1Aob3Bf
bG9vcF9pZl9sZXNzKQogICAgICAgICBERUZJTkVfT1Aob3BfbG9vcF9pZl9sZXNzZXEpCiAgICAg
ICAgIERFRklORV9PUChvcF9sb29wX2lmX2dyZWF0ZXIpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQv
SklULmgJKHJldmlzaW9uIDEwOTA2MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklU
LmgJKHdvcmtpbmcgY29weSkKQEAgLTgyOCw2ICs4MjgsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAg
ICAgICAgdm9pZCBlbWl0X29wX2p0cnVlKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1p
dF9vcF9sb29wKEluc3RydWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2hpbnQo
SW5zdHJ1Y3Rpb24qKTsKKyAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3Ry
dWN0aW9uKik7CiAgICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2xlc3MoSW5zdHJ1Y3Rpb24q
KTsKICAgICAgICAgdm9pZCBlbWl0X29wX2xvb3BfaWZfbGVzc2VxKEluc3RydWN0aW9uKik7CiAg
ICAgICAgIHZvaWQgZW1pdF9vcF9sb29wX2lmX2dyZWF0ZXIoSW5zdHJ1Y3Rpb24qKTsKQEAgLTEx
MDgsNiArMTEwOSwxMCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgZW1pdE9wdGltaXphdGlv
bkNoZWNrKExvb3BPcHRpbWl6YXRpb25DaGVjayk7CiAgICAgfQogCisgICAgaW5saW5lIHZvaWQg
SklUOjplbWl0X29wX2xvb3BfcHJlaGVhZGVyKEluc3RydWN0aW9uKikKKyAgICB7CisgICAgfQor
CiAgICAgaW5saW5lIHZvaWQgSklUOjplbWl0X29wX2xvb3BfaWZfdHJ1ZShJbnN0cnVjdGlvbiog
Y3VycmVudEluc3RydWN0aW9uKQogICAgIHsKICAgICAgICAgZW1pdFRpbWVvdXRDaGVjaygpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>