<?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>159391</bug_id>
          
          <creation_ts>2016-07-03 18:22:10 -0700</creation_ts>
          <short_desc>B3 should support multiple entrypoints</short_desc>
          <delta_ts>2016-07-24 13:35:36 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=151141</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>saam</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1207543</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-03 18:22:10 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1207546</commentid>
    <comment_count>1</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-03 19:40:02 -0700</bug_when>
    <thetext>This is going to grind really bad with PolyJump and the whole idea of non-cloneable code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1207552</commentid>
    <comment_count>2</comment_count>
      <attachid>282674</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-03 20:58:06 -0700</bug_when>
    <thetext>Created attachment 282674
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1212645</commentid>
    <comment_count>3</comment_count>
      <attachid>284081</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-19 20:06:20 -0700</bug_when>
    <thetext>Created attachment 284081
rebased and improved</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1212655</commentid>
    <comment_count>4</comment_count>
      <attachid>284084</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-19 22:12:35 -0700</bug_when>
    <thetext>Created attachment 284084
it&apos;s starting to work!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1212658</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-07-19 22:14:24 -0700</bug_when>
    <thetext>Attachment 284084 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirOptimizeBlockOrder.cpp:87:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12434:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12435:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12436:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12437:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12438:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12439:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:73:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 8 in 31 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1212863</commentid>
    <comment_count>6</comment_count>
      <attachid>284143</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-20 13:29:32 -0700</bug_when>
    <thetext>Created attachment 284143
works like a charm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1212864</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-07-20 13:30:51 -0700</bug_when>
    <thetext>Attachment 284143 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirOptimizeBlockOrder.cpp:87:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12444:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12445:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12446:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12447:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12448:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12449:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:73:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 8 in 32 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213331</commentid>
    <comment_count>8</comment_count>
      <attachid>284262</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-21 14:33:34 -0700</bug_when>
    <thetext>Created attachment 284262
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213332</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-07-21 14:35:36 -0700</bug_when>
    <thetext>Attachment 284262 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirOptimizeBlockOrder.cpp:87:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12444:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12445:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12446:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12447:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12448:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12449:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12725:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12726:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12727:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12729:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12730:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12731:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:73:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 14 in 33 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213812</commentid>
    <comment_count>10</comment_count>
      <attachid>284262</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-22 19:01:19 -0700</bug_when>
    <thetext>Comment on attachment 284262
the patch

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

Still looking at the code. Just a few quick comments. I&apos;ll finish reviewing later tonight or tomorrow.

&gt; Source/JavaScriptCore/ChangeLog:8
&gt; +        This teaches B3 how to compile procedures with multiple entrypoints in the best way ever.

I agree that this is a very elegant way to think about this problem.

&gt; Source/JavaScriptCore/ChangeLog:40
&gt; +        Usually, you would use this by creating an EntrySwitch in the root block, but you don&apos;t
&gt; +        have to do that. Just remember that the code before EntrySwitch gets cloned for each
&gt; +        entrypoint. We allow cloning of an arbitrarily large amount of code because restricting it,
&gt; +        and so restricing the placement of EntrySwitches, would be unelegant. It would be hard to
&gt; +        preserve this invariant. For example we wouldn&apos;t be able to lower any value before an
&gt; +        EntrySwitch to a control flow diamond.

How does the algorithm react in cases where the cloned code preceding some arbitrary EntrySwitch has an EntrySwitch itself?
Will this lead to exponential blow up as we recursively clone? What happens with a loop? I&apos;m just curious about an explanation here. Still trying to grok the algorithm.

&gt; Source/JavaScriptCore/b3/B3MoveConstants.cpp:65
&gt; +                return key.opcode() == Const32 || key.opcode() == Const64 || key.opcode() == ArgumentReg;

Why is this legal? Will this have effects on register allocation?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213813</commentid>
    <comment_count>11</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-22 19:33:45 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Comment on attachment 284262 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; 
&gt; Still looking at the code. Just a few quick comments. I&apos;ll finish reviewing
&gt; later tonight or tomorrow.
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:8
&gt; &gt; +        This teaches B3 how to compile procedures with multiple entrypoints in the best way ever.
&gt; 
&gt; I agree that this is a very elegant way to think about this problem.
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:40
&gt; &gt; +        Usually, you would use this by creating an EntrySwitch in the root block, but you don&apos;t
&gt; &gt; +        have to do that. Just remember that the code before EntrySwitch gets cloned for each
&gt; &gt; +        entrypoint. We allow cloning of an arbitrarily large amount of code because restricting it,
&gt; &gt; +        and so restricing the placement of EntrySwitches, would be unelegant. It would be hard to
&gt; &gt; +        preserve this invariant. For example we wouldn&apos;t be able to lower any value before an
&gt; &gt; +        EntrySwitch to a control flow diamond.
&gt; 
&gt; How does the algorithm react in cases where the cloned code preceding some
&gt; arbitrary EntrySwitch has an EntrySwitch itself?

I should add a test!  This is meant to work gracefully and efficiently.

Any block with an EntrySwitch is guaranteed to be cloned because it&apos;s in the backwards closure of itself.  If there is some EntrySwitch in front of it, then this does not change its membership in the set of cloned blocks.  Note that it&apos;s really best to reason about the algorithm in terms of a set of cloned blocks.  If a block belongs to the set, it will be cloned for each entrypoint.  If it doesn&apos;t, it won&apos;t be cloned.  It&apos;s impossible for the algorithm to clone a block more than once per entrypoint.  The number of EntrySwitches does not affect the number of clones, because the number of clones is just determined by the number of entrypoints.

The cloning algorithm applies two separate rules to the successors of blocks after cloning them.  It applies these rules in this order:

1) For each successor S: if S is a cloned block, then repoint it to its version in this clone.  This means that the EntrySwitch will have all of its successors repointed into the clone.

2) If the terminal is an EntrySwitch, replace it with a Jump to the successor that corresponds to the current clone.

So, each EntrySwitch turns into a Jump.  In your test, this Jump could lead you to a block that has another EntrySwitch, which will also turn into a Jump.  If that EntrySwitch really is the last one, then it will jump out of cloned code and into common code.  Also, it&apos;s possible for one successor of EntrySwitch to lead to another EntrySwitch while another does not.  So, depending on which clone we&apos;re talking about, that EntrySwitch could either jump to cloned code or common code.

&gt; Will this lead to exponential blow up as we recursively clone? 

No.  We create clones per entrypoint, not per EntrySwitch.

&gt; What happens with a loop? 

In the loop test in testb3, every block gets cloned, because the only common code is a basic block that does a Return and that gets tail-duped.  It turns out that for that test, cloning everything is optimal in space and time (space because we replace a jump to a ret with a jump, and time because fewer jumps).

In general, the exit block(s) of the loop that contains EnrtySwitch would not get cloned if they were large enough to avoid tail duplication (which is a very low bar to meet) and if they did not lead to another EntrySwitch.

I&apos;m going to make a strong claim about this algorithm: it does minimal cloning under the precondition that all EntrySwitches must turn into unconditional jumps.  A piece of code gets cloned only if the Entry variable would be live in that code, and we encode the value of the Entry variable as the index of the clone.

&gt; I&apos;m just curious about an explanation here. Still trying to
&gt; grok the algorithm.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3MoveConstants.cpp:65
&gt; &gt; +                return key.opcode() == Const32 || key.opcode() == Const64 || key.opcode() == ArgumentReg;
&gt; 
&gt; Why is this legal? Will this have effects on register allocation?

Each ArgumentReg for some register will always evaluate to the same value.  For example:

Block #0:
    @x = ArgumentReg(%rdi)
...
Block #42:
    @y = ArgumentReg(%rdi)

We are guaranteed that @x == @y.  This is because ArgumentReg&apos;s semantics are: it gives you the value that the register would have had just before execution of the function&apos;s prologue.

Therefore, you can hoist ArgumentReg as if it was a constant.  That&apos;s because it is constant throughout any execution of the Procedure!

It turns out that we need to do *something* to make ArgumentReg&apos;s work with EntrySwitch, since the instruction selector will place code in the prologue for each ArgumentReg Value in the Procedure.  If there are duplicate ArgumentRegs, that means that the prologue gets really nasty.  Air doesn&apos;t have the power to deduplicate them.  When writing canonical code that uses EntrySwitch, you get into the habit of just creating an empty root block that ends in an EntrySwitch, and then creating the actual entrypoints as successors to that.  When you do this, you invariably end up creating duplicate ArgumentReg&apos;s.  Without this optimization, this would always lead to terrible code in the prologue.  Because EntrySwitch works by duplicating everything before the EntrySwitch, that means that the terrible code in the prologue gets duplicated for each entrypoint, which then looks even nastier.  Basically you get O(n^2) blow-up, where each entrypoint executes code that is meant to set up the arguments for every single other entrypoint.  With this optimization, everything basically works: you get only one ArgumentReg per register in the prologue.  This code does get duplicated, which might be moderately janky if one entrypoint uses argument registers and another doesn&apos;t - the one that doesn&apos;t would have to execute code to do things to argument registers that it isn&apos;t going to use.

But I don&apos;t think this will be an issue for us.  We will of course have argument registers in FTL soon.  But our goal is to have one entrypoint that is legitimately hot (the entrypoint that corresponds to calling the function) and a bunch of additional entrypoints that will all be cold (even if you throw often, the time spent executing argument reg code in the prologue will be the least of your worries).

If we do ever find this to be a problem, then we can fix it by moving the EntrySwitch lowering to before register allocation.  I doubt we will need to do this anytime soon.  It&apos;s just an interesting shortcoming of this approach.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213815</commentid>
    <comment_count>12</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-22 19:46:28 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; Comment on attachment 284262 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; &gt; 
&gt; &gt; Still looking at the code. Just a few quick comments. I&apos;ll finish reviewing
&gt; &gt; later tonight or tomorrow.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ChangeLog:8
&gt; &gt; &gt; +        This teaches B3 how to compile procedures with multiple entrypoints in the best way ever.
&gt; &gt; 
&gt; &gt; I agree that this is a very elegant way to think about this problem.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ChangeLog:40
&gt; &gt; &gt; +        Usually, you would use this by creating an EntrySwitch in the root block, but you don&apos;t
&gt; &gt; &gt; +        have to do that. Just remember that the code before EntrySwitch gets cloned for each
&gt; &gt; &gt; +        entrypoint. We allow cloning of an arbitrarily large amount of code because restricting it,
&gt; &gt; &gt; +        and so restricing the placement of EntrySwitches, would be unelegant. It would be hard to
&gt; &gt; &gt; +        preserve this invariant. For example we wouldn&apos;t be able to lower any value before an
&gt; &gt; &gt; +        EntrySwitch to a control flow diamond.
&gt; &gt; 
&gt; &gt; How does the algorithm react in cases where the cloned code preceding some
&gt; &gt; arbitrary EntrySwitch has an EntrySwitch itself?
&gt; 
&gt; I should add a test!  This is meant to work gracefully and efficiently.
&gt; 
&gt; Any block with an EntrySwitch is guaranteed to be cloned because it&apos;s in the
&gt; backwards closure of itself.  If there is some EntrySwitch in front of it,
&gt; then this does not change its membership in the set of cloned blocks.  Note
&gt; that it&apos;s really best to reason about the algorithm in terms of a set of
&gt; cloned blocks.  If a block belongs to the set, it will be cloned for each
&gt; entrypoint.  If it doesn&apos;t, it won&apos;t be cloned.  It&apos;s impossible for the
&gt; algorithm to clone a block more than once per entrypoint.  The number of
&gt; EntrySwitches does not affect the number of clones, because the number of
&gt; clones is just determined by the number of entrypoints.
&gt; 
&gt; The cloning algorithm applies two separate rules to the successors of blocks
&gt; after cloning them.  It applies these rules in this order:
&gt; 
&gt; 1) For each successor S: if S is a cloned block, then repoint it to its
&gt; version in this clone.  This means that the EntrySwitch will have all of its
&gt; successors repointed into the clone.
&gt; 
&gt; 2) If the terminal is an EntrySwitch, replace it with a Jump to the
&gt; successor that corresponds to the current clone.
&gt; 
&gt; So, each EntrySwitch turns into a Jump.  In your test, this Jump could lead
&gt; you to a block that has another EntrySwitch, which will also turn into a
&gt; Jump.  If that EntrySwitch really is the last one, then it will jump out of
&gt; cloned code and into common code.  Also, it&apos;s possible for one successor of
&gt; EntrySwitch to lead to another EntrySwitch while another does not.  So,
&gt; depending on which clone we&apos;re talking about, that EntrySwitch could either
&gt; jump to cloned code or common code.
&gt; 
&gt; &gt; Will this lead to exponential blow up as we recursively clone? 
&gt; 
&gt; No.  We create clones per entrypoint, not per EntrySwitch.
&gt; 
&gt; &gt; What happens with a loop? 
&gt; 
&gt; In the loop test in testb3, every block gets cloned, because the only common
&gt; code is a basic block that does a Return and that gets tail-duped.  It turns
&gt; out that for that test, cloning everything is optimal in space and time
&gt; (space because we replace a jump to a ret with a jump, and time because
&gt; fewer jumps).
&gt; 
&gt; In general, the exit block(s) of the loop that contains EnrtySwitch would
&gt; not get cloned if they were large enough to avoid tail duplication (which is
&gt; a very low bar to meet) and if they did not lead to another EntrySwitch.
&gt; 
&gt; I&apos;m going to make a strong claim about this algorithm: it does minimal
&gt; cloning under the precondition that all EntrySwitches must turn into
&gt; unconditional jumps.  A piece of code gets cloned only if the Entry variable
&gt; would be live in that code, and we encode the value of the Entry variable as
&gt; the index of the clone.
&gt; 
&gt; &gt; I&apos;m just curious about an explanation here. Still trying to
&gt; &gt; grok the algorithm.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3MoveConstants.cpp:65
&gt; &gt; &gt; +                return key.opcode() == Const32 || key.opcode() == Const64 || key.opcode() == ArgumentReg;
&gt; &gt; 
&gt; &gt; Why is this legal? Will this have effects on register allocation?
&gt; 
&gt; Each ArgumentReg for some register will always evaluate to the same value. 
&gt; For example:
&gt; 
&gt; Block #0:
&gt;     @x = ArgumentReg(%rdi)
&gt; ...
&gt; Block #42:
&gt;     @y = ArgumentReg(%rdi)
&gt; 
&gt; We are guaranteed that @x == @y.  This is because ArgumentReg&apos;s semantics
&gt; are: it gives you the value that the register would have had just before
&gt; execution of the function&apos;s prologue.
&gt; 
&gt; Therefore, you can hoist ArgumentReg as if it was a constant.  That&apos;s
&gt; because it is constant throughout any execution of the Procedure!
&gt; 
&gt; It turns out that we need to do *something* to make ArgumentReg&apos;s work with
&gt; EntrySwitch, since the instruction selector will place code in the prologue
&gt; for each ArgumentReg Value in the Procedure.  If there are duplicate
&gt; ArgumentRegs, that means that the prologue gets really nasty.  Air doesn&apos;t
&gt; have the power to deduplicate them.  When writing canonical code that uses
&gt; EntrySwitch, you get into the habit of just creating an empty root block
&gt; that ends in an EntrySwitch, and then creating the actual entrypoints as
&gt; successors to that.  When you do this, you invariably end up creating
&gt; duplicate ArgumentReg&apos;s.  Without this optimization, this would always lead
&gt; to terrible code in the prologue.  Because EntrySwitch works by duplicating
&gt; everything before the EntrySwitch, that means that the terrible code in the
&gt; prologue gets duplicated for each entrypoint, which then looks even nastier.
&gt; Basically you get O(n^2) blow-up, where each entrypoint executes code that
&gt; is meant to set up the arguments for every single other entrypoint.  With
&gt; this optimization, everything basically works: you get only one ArgumentReg
&gt; per register in the prologue.  This code does get duplicated, which might be
&gt; moderately janky if one entrypoint uses argument registers and another
&gt; doesn&apos;t - the one that doesn&apos;t would have to execute code to do things to
&gt; argument registers that it isn&apos;t going to use.
&gt; 
&gt; But I don&apos;t think this will be an issue for us.  We will of course have
&gt; argument registers in FTL soon.  But our goal is to have one entrypoint that
&gt; is legitimately hot (the entrypoint that corresponds to calling the
&gt; function) and a bunch of additional entrypoints that will all be cold (even
&gt; if you throw often, the time spent executing argument reg code in the
&gt; prologue will be the least of your worries).
&gt; 
&gt; If we do ever find this to be a problem, then we can fix it by moving the
&gt; EntrySwitch lowering to before register allocation.  I doubt we will need to
&gt; do this anytime soon.  It&apos;s just an interesting shortcoming of this approach.

Actually, I thought through this some more.  Yes, we will end up with some entrypoints having effectively dead instructions to shuffle argument registers that they don&apos;t use.  But that will be the *only* bad thing that happens.  As such, we could fix this by doing a really basic DCE after EntrySwitch lowering.  We have the power to do DCE in Air even after regalloc.

Here&apos;s a fun example of what will happen in FTL, once we have EntrySwitch and we are using it for catch, and we have register-based calling.  Say that we have a function that has one catch and takes one argument register (maybe this).  Initially our code might look like this.

Block #0:
    EntrySwitch()
  Successors: #1, #2
Block #1: // this is the entrypoint for normal calls
    @arg = ArgumentReg(%rdi) // get this
    Jump()
  Successors: ...
Block #2: // this is the catch block
    @arg2 = Load(things) // load the value of the argument from the OSR entry buffer
    Jump()
  Successors: ...
Block #42: // this is a merge between paths from catch and other paths
    @arg3 = Phi(...) // this merges @arg with @arg2

Then ArgumentReg hoisting will do this:

Block #0:
    @arg = ArgumentReg(%rdi) // get this
    EntrySwitch()
  Successors: #1, #2
Block #1: // this is the entrypoint for normal calls
    Jump()
  Successors: ...
Block #2: // this is the catch block
    // Note that @arg is available here, but it&apos;s dead. We won&apos;t use it, since we use
    // @arg2 instead.
    @arg2 = Load(things) // load the value of the argument from the OSR entry buffer
    Jump()
  Successors: ...
Block #42: // this is a merge between paths from catch and other paths
    @arg3 = Phi(...) // this merges @arg with @arg2

Then when we lower to Air and lower EntrySwitch we will get:

Block #0: // This is now the real entrypoint for normal calls
    Move %rdi, %argreg // %argreg is some register we picked to hold the value of @arg
    ...
Block #1: // This is the entrypoint for catch
    Move %rdi, %argreg // Dead move of the argument
    // %argreg is available for use in this code until Block #42.  it&apos;s not live right now.
    Move (some address), %arg2reg // %arg2reg is the register for @arg2

It may be that we will coalesce %argreg and %arg2reg because they both merge at @arg3 in #42, or we may use different registers because that relieves register pressure.  It may also be that in the catch entrypoint, we use %argreg for something unrelated to the argument.  The move into %argreg in the catch entrypoint is just a dead goof in this case.

On the other hand, if the catch entrypoint did use ArgumentReg(%rdi), then it would force the register allocator to use the same register for that argument along both entrypoints.  That&apos;s not great (forcing the register allocator to do anything is not great) but it&apos;s probably harmless.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213952</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-23 14:52:16 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; Comment on attachment 284262 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; &gt; 
&gt; &gt; Still looking at the code. Just a few quick comments. I&apos;ll finish reviewing
&gt; &gt; later tonight or tomorrow.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ChangeLog:8
&gt; &gt; &gt; +        This teaches B3 how to compile procedures with multiple entrypoints in the best way ever.
&gt; &gt; 
&gt; &gt; I agree that this is a very elegant way to think about this problem.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ChangeLog:40
&gt; &gt; &gt; +        Usually, you would use this by creating an EntrySwitch in the root block, but you don&apos;t
&gt; &gt; &gt; +        have to do that. Just remember that the code before EntrySwitch gets cloned for each
&gt; &gt; &gt; +        entrypoint. We allow cloning of an arbitrarily large amount of code because restricting it,
&gt; &gt; &gt; +        and so restricing the placement of EntrySwitches, would be unelegant. It would be hard to
&gt; &gt; &gt; +        preserve this invariant. For example we wouldn&apos;t be able to lower any value before an
&gt; &gt; &gt; +        EntrySwitch to a control flow diamond.
&gt; &gt; 
&gt; &gt; How does the algorithm react in cases where the cloned code preceding some
&gt; &gt; arbitrary EntrySwitch has an EntrySwitch itself?
&gt; 
&gt; I should add a test!  This is meant to work gracefully and efficiently.
&gt; 
&gt; Any block with an EntrySwitch is guaranteed to be cloned because it&apos;s in the
&gt; backwards closure of itself.  If there is some EntrySwitch in front of it,
&gt; then this does not change its membership in the set of cloned blocks.  Note
&gt; that it&apos;s really best to reason about the algorithm in terms of a set of
&gt; cloned blocks.  If a block belongs to the set, it will be cloned for each
&gt; entrypoint.  If it doesn&apos;t, it won&apos;t be cloned.  It&apos;s impossible for the
&gt; algorithm to clone a block more than once per entrypoint.  The number of
&gt; EntrySwitches does not affect the number of clones, because the number of
&gt; clones is just determined by the number of entry points.

I realized last night that my mental model for this was completely off. I&apos;m not quite sure what I was thinking before.
I now realize that each EntrySwitch operates over the same EntryVariables. I used to think that each EntrySwitch operated
over its own EntryVariable (which I&apos;m not quite sure what that even means). So, if a graph has N blocks with K entry switches each with M entry variables,
my old thinking is that we could end up with a graph of O(N^M) blocks. But in your model, I believed it&apos;s O(N*M). I now understand
the idea better, and it sense.

&gt; 
&gt; The cloning algorithm applies two separate rules to the successors of blocks
&gt; after cloning them.  It applies these rules in this order:
&gt; 
&gt; 1) For each successor S: if S is a cloned block, then repoint it to its
&gt; version in this clone.  This means that the EntrySwitch will have all of its
&gt; successors repointed into the clone.
&gt; 
&gt; 2) If the terminal is an EntrySwitch, replace it with a Jump to the
&gt; successor that corresponds to the current clone.
&gt; 
&gt; So, each EntrySwitch turns into a Jump.  In your test, this Jump could lead
&gt; you to a block that has another EntrySwitch, which will also turn into a
&gt; Jump.  If that EntrySwitch really is the last one, then it will jump out of
&gt; cloned code and into common code.  Also, it&apos;s possible for one successor of
&gt; EntrySwitch to lead to another EntrySwitch while another does not.  So,
&gt; depending on which clone we&apos;re talking about, that EntrySwitch could either
&gt; jump to cloned code or common code.
&gt; 
&gt; &gt; Will this lead to exponential blow up as we recursively clone? 
&gt; 
&gt; No.  We create clones per entrypoint, not per EntrySwitch.
&gt; 
&gt; &gt; What happens with a loop? 
&gt; 
&gt; In the loop test in testb3, every block gets cloned, because the only common
&gt; code is a basic block that does a Return and that gets tail-duped.  It turns
&gt; out that for that test, cloning everything is optimal in space and time
&gt; (space because we replace a jump to a ret with a jump, and time because
&gt; fewer jumps).
&gt; 
&gt; In general, the exit block(s) of the loop that contains EnrtySwitch would
&gt; not get cloned if they were large enough to avoid tail duplication (which is
&gt; a very low bar to meet) and if they did not lead to another EntrySwitch.
&gt; 
&gt; I&apos;m going to make a strong claim about this algorithm: it does minimal
&gt; cloning under the precondition that all EntrySwitches must turn into
&gt; unconditional jumps.  A piece of code gets cloned only if the Entry variable
&gt; would be live in that code, and we encode the value of the Entry variable as
&gt; the index of the clone.
&gt; 
&gt; &gt; I&apos;m just curious about an explanation here. Still trying to
&gt; &gt; grok the algorithm.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3MoveConstants.cpp:65
&gt; &gt; &gt; +                return key.opcode() == Const32 || key.opcode() == Const64 || key.opcode() == ArgumentReg;
&gt; &gt; 
&gt; &gt; Why is this legal? Will this have effects on register allocation?
&gt; 
&gt; Each ArgumentReg for some register will always evaluate to the same value. 
&gt; For example:
&gt; 
&gt; Block #0:
&gt;     @x = ArgumentReg(%rdi)
&gt; ...
&gt; Block #42:
&gt;     @y = ArgumentReg(%rdi)
&gt; 
&gt; We are guaranteed that @x == @y.  This is because ArgumentReg&apos;s semantics
&gt; are: it gives you the value that the register would have had just before
&gt; execution of the function&apos;s prologue.
&gt; 
&gt; Therefore, you can hoist ArgumentReg as if it was a constant.  That&apos;s
&gt; because it is constant throughout any execution of the Procedure!
&gt; 
&gt; It turns out that we need to do *something* to make ArgumentReg&apos;s work with
&gt; EntrySwitch, since the instruction selector will place code in the prologue
&gt; for each ArgumentReg Value in the Procedure.  If there are duplicate
&gt; ArgumentRegs, that means that the prologue gets really nasty.  Air doesn&apos;t
&gt; have the power to deduplicate them.  When writing canonical code that uses
&gt; EntrySwitch, you get into the habit of just creating an empty root block
&gt; that ends in an EntrySwitch, and then creating the actual entrypoints as
&gt; successors to that.  When you do this, you invariably end up creating
&gt; duplicate ArgumentReg&apos;s.  Without this optimization, this would always lead
&gt; to terrible code in the prologue.  Because EntrySwitch works by duplicating
&gt; everything before the EntrySwitch, that means that the terrible code in the
&gt; prologue gets duplicated for each entrypoint, which then looks even nastier.
&gt; Basically you get O(n^2) blow-up, where each entrypoint executes code that
&gt; is meant to set up the arguments for every single other entrypoint.  With
&gt; this optimization, everything basically works: you get only one ArgumentReg
&gt; per register in the prologue.  This code does get duplicated, which might be
&gt; moderately janky if one entrypoint uses argument registers and another
&gt; doesn&apos;t - the one that doesn&apos;t would have to execute code to do things to
&gt; argument registers that it isn&apos;t going to use.
&gt; 
&gt; But I don&apos;t think this will be an issue for us.  We will of course have
&gt; argument registers in FTL soon.  But our goal is to have one entrypoint that
&gt; is legitimately hot (the entrypoint that corresponds to calling the
&gt; function) and a bunch of additional entrypoints that will all be cold (even
&gt; if you throw often, the time spent executing argument reg code in the
&gt; prologue will be the least of your worries).
&gt; 
&gt; If we do ever find this to be a problem, then we can fix it by moving the
&gt; EntrySwitch lowering to before register allocation.  I doubt we will need to
&gt; do this anytime soon.  It&apos;s just an interesting shortcoming of this approach.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213972</commentid>
    <comment_count>14</comment_count>
      <attachid>284262</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-23 15:59:33 -0700</bug_when>
    <thetext>Comment on attachment 284262
the patch

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

Almost done reviewing, will finish a bit later, gotta go do something right now.

&gt; Source/JavaScriptCore/b3/air/AirCode.h:126
&gt; +    const Vector&lt;FrequentedBlock&gt; entrypoints() const { return m_entrypoints; }

Do you mean to be copying the entry points here?
Or did you mean &quot;const Vector&lt;FrequentedBlock&gt;&amp; entrypoints() ...&quot;?
Maybe we can get rid of this? Doesn&apos;t look like it&apos;s used.

&gt; Source/JavaScriptCore/b3/air/AirCode.h:130
&gt; +    // This is for use by lowerEntrySwitch().

&quot;for use by&quot; =&gt; &quot;used by&quot; or something similar.

&gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);

IMO, the contract here should be that we don&apos;t do forwarding here. It seems weird if somebody passed in an lvalue reference here and then we copied the vector.
I also think this would be easier to read if you just wrote is as:
void setEntrypointLabels(Vector&lt;CCallHelpers::Label&gt;&amp;&amp; vector) { m_entrypointLabels = WTFMove(vector); }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213976</commentid>
    <comment_count>15</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-23 16:21:05 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Comment on attachment 284262 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; 
&gt; Almost done reviewing, will finish a bit later, gotta go do something right
&gt; now.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCode.h:126
&gt; &gt; +    const Vector&lt;FrequentedBlock&gt; entrypoints() const { return m_entrypoints; }
&gt; 
&gt; Do you mean to be copying the entry points here?
&gt; Or did you mean &quot;const Vector&lt;FrequentedBlock&gt;&amp; entrypoints() ...&quot;?
&gt; Maybe we can get rid of this? Doesn&apos;t look like it&apos;s used.

Yeah, it was meant to be &amp;.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCode.h:130
&gt; &gt; +    // This is for use by lowerEntrySwitch().
&gt; 
&gt; &quot;for use by&quot; =&gt; &quot;used by&quot; or something similar.

I changed it.  However, &quot;for use by&quot; to me meant that it&apos;s intended to be used by that phase, while &quot;used by&quot; is just a statement of fact that it&apos;s used by that phase.  I want to make clear that it&apos;s intended only to be used by that phase.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt; &gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);
&gt; 
&gt; IMO, the contract here should be that we don&apos;t do forwarding here. 

This is a setter.  I&apos;ve been adopting the philosophy that setters should do forwarding unless there is some really compelling reason not prohibit it.

&gt; It seems
&gt; weird if somebody passed in an lvalue reference here and then we copied the
&gt; vector.

We wouldn&apos;t copy the vector in that case.  This is a setter.  If you want to move the vector, you call this with setEntrypoints(WTFMove(things)).  The syntax is a small price to pay for giving the caller some flexibility.

&gt; I also think this would be easier to read if you just wrote is as:
&gt; void setEntrypointLabels(Vector&lt;CCallHelpers::Label&gt;&amp;&amp; vector) {
&gt; m_entrypointLabels = WTFMove(vector); }

I guess I don&apos;t find the current version that hard to read.  Throughout Air, we try to do perfect forwarding whenever we can, rather than requiring either move or copy semantics.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1213977</commentid>
    <comment_count>16</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-23 16:22:06 -0700</bug_when>
    <thetext>
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt; &gt; &gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);
&gt; &gt; 
&gt; &gt; IMO, the contract here should be that we don&apos;t do forwarding here. 
&gt; 
&gt; This is a setter.  I&apos;ve been adopting the philosophy that setters should do
&gt; forwarding unless there is some really compelling reason not prohibit it.
&gt; 
&gt; &gt; It seems
&gt; &gt; weird if somebody passed in an lvalue reference here and then we copied the
&gt; &gt; vector.
&gt; 
&gt; We wouldn&apos;t copy the vector in that case.  This is a setter.  If you want to
&gt; move the vector, you call this with setEntrypoints(WTFMove(things)).  The
&gt; syntax is a small price to pay for giving the caller some flexibility.

Sorry, we *would* copy the vector in that case, and that&apos;s fine, since that&apos;s consistent with how setters work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214026</commentid>
    <comment_count>17</comment_count>
      <attachid>284262</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-23 23:42:58 -0700</bug_when>
    <thetext>Comment on attachment 284262
the patch

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

r=me

&gt; Source/JavaScriptCore/b3/B3Opcode.h:220
&gt; +    // Multiple entrypoint are supported via the EntrySwitch operation. Place this in the root

Typo: entrypoint =&gt; entrypoints

&gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:130
&gt;&gt;&gt; +    // This is for use by lowerEntrySwitch().
&gt;&gt; 
&gt;&gt; &quot;for use by&quot; =&gt; &quot;used by&quot; or something similar.
&gt; 
&gt; I changed it.  However, &quot;for use by&quot; to me meant that it&apos;s intended to be used by that phase, while &quot;used by&quot; is just a statement of fact that it&apos;s used by that phase.  I want to make clear that it&apos;s intended only to be used by that phase.

Ok. You can keep that, I don&apos;t have a strong opinion either way. It just read a bit weirdly to me.

&gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt;&gt;&gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);
&gt;&gt; 
&gt;&gt; IMO, the contract here should be that we don&apos;t do forwarding here. It seems weird if somebody passed in an lvalue reference here and then we copied the vector.
&gt;&gt; I also think this would be easier to read if you just wrote is as:
&gt;&gt; void setEntrypointLabels(Vector&lt;CCallHelpers::Label&gt;&amp;&amp; vector) { m_entrypointLabels = WTFMove(vector); }
&gt; 
&gt; This is a setter.  I&apos;ve been adopting the philosophy that setters should do forwarding unless there is some really compelling reason not prohibit it.

I was just thinking about this form the perspective that it&apos;d be wrong for somebody to call this with an lvalue reference, and then start mutating the lvalue reference afterwards, and not the m_entrypountLabels vector. I don&apos;t think enforcing move semantics, like I suggested, prevents this from happening though. And this problem exists with many setter APIs. So it&apos;s not really a big deal implementing it either way.

&gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:52
&gt; +        Vector&lt;FrequentedBlock&gt; entrypoints(code.proc().numEntrypoints(), FrequentedBlock(code[0]));

Should we assert that this is 1 here?

&gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:60
&gt; +    RELEASE_ASSERT(worklist.saw(code[0]));

So we&apos;re guaranteed here to have removed any unreachable blocks before this phase runs?
I&apos;m not sure if you have a test for this, but can you add one?

&gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:77
&gt; +        block-&gt;last().opcode = Jump;

Out of curiosity, is all that&apos;s needed in Air to change a node is to replace its opcode? Or is this just because both EntrySwitch and Jump are terminals?

&gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:83
&gt; +    Vector&lt;FrequentedBlock&gt; entrypoints;

Is it worth having this pre-allocate code.proc().numEntrypoints() entries?

&gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:85
&gt; +    IndexMap&lt;BasicBlock, BasicBlock*&gt; map(code.size());

Suggestion: maybe call this &quot;clonedBlocks&quot; or something similar?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214055</commentid>
    <comment_count>18</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-24 10:45:32 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Comment on attachment 284262 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:220
&gt; &gt; +    // Multiple entrypoint are supported via the EntrySwitch operation. Place this in the root
&gt; 
&gt; Typo: entrypoint =&gt; entrypoints

Fixed.

&gt; 
&gt; &gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:130
&gt; &gt;&gt;&gt; +    // This is for use by lowerEntrySwitch().
&gt; &gt;&gt; 
&gt; &gt;&gt; &quot;for use by&quot; =&gt; &quot;used by&quot; or something similar.
&gt; &gt; 
&gt; &gt; I changed it.  However, &quot;for use by&quot; to me meant that it&apos;s intended to be used by that phase, while &quot;used by&quot; is just a statement of fact that it&apos;s used by that phase.  I want to make clear that it&apos;s intended only to be used by that phase.
&gt; 
&gt; Ok. You can keep that, I don&apos;t have a strong opinion either way. It just
&gt; read a bit weirdly to me.

I left it as &quot;used by&quot;. I don&apos;t have a strong opinion either.

&gt; 
&gt; &gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt; &gt;&gt;&gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);
&gt; &gt;&gt; 
&gt; &gt;&gt; IMO, the contract here should be that we don&apos;t do forwarding here. It seems weird if somebody passed in an lvalue reference here and then we copied the vector.
&gt; &gt;&gt; I also think this would be easier to read if you just wrote is as:
&gt; &gt;&gt; void setEntrypointLabels(Vector&lt;CCallHelpers::Label&gt;&amp;&amp; vector) { m_entrypointLabels = WTFMove(vector); }
&gt; &gt; 
&gt; &gt; This is a setter.  I&apos;ve been adopting the philosophy that setters should do forwarding unless there is some really compelling reason not prohibit it.
&gt; 
&gt; I was just thinking about this form the perspective that it&apos;d be wrong for
&gt; somebody to call this with an lvalue reference, and then start mutating the
&gt; lvalue reference afterwards, and not the m_entrypountLabels vector. I don&apos;t
&gt; think enforcing move semantics, like I suggested, prevents this from
&gt; happening though. And this problem exists with many setter APIs. So it&apos;s not
&gt; really a big deal implementing it either way.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:52
&gt; &gt; +        Vector&lt;FrequentedBlock&gt; entrypoints(code.proc().numEntrypoints(), FrequentedBlock(code[0]));
&gt; 
&gt; Should we assert that this is 1 here?

No.  You could have code where the EntrySwitch was optimized out for some reason.  For example, the code leading up to the EntrySwitch might become unreachable, or all of the successors of the EntrySwitch might be merged together.  We merge identical successors in strength reduction.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:60
&gt; &gt; +    RELEASE_ASSERT(worklist.saw(code[0]));
&gt; 
&gt; So we&apos;re guaranteed here to have removed any unreachable blocks before this
&gt; phase runs?

Yes.

&gt; I&apos;m not sure if you have a test for this, but can you add one?

Not sure what to test for. :-)  I don&apos;t want to create a test that always asserts, since that would just crash testb3.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:77
&gt; &gt; +        block-&gt;last().opcode = Jump;
&gt; 
&gt; Out of curiosity, is all that&apos;s needed in Air to change a node is to replace
&gt; its opcode? Or is this just because both EntrySwitch and Jump are terminals?

Just the opcode and the args.  Since neither EntrySwitch nor Jump have any args, you can change one to the other by just changing the opcode.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:83
&gt; &gt; +    Vector&lt;FrequentedBlock&gt; entrypoints;
&gt; 
&gt; Is it worth having this pre-allocate code.proc().numEntrypoints() entries?

I usually don&apos;t end up adding code to preallocate unless the vector is hot.  This one isn&apos;t.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:85
&gt; &gt; +    IndexMap&lt;BasicBlock, BasicBlock*&gt; map(code.size());
&gt; 
&gt; Suggestion: maybe call this &quot;clonedBlocks&quot; or something similar?

I don&apos;t like that any better than &quot;map&quot;.  In code that does graph cloning I always look for a mapping from original to clone, which is necessary for rewiring the graph edges.  So, I called this &quot;map&quot; so that I&apos;ll always be able to easily find that mapping.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214060</commentid>
    <comment_count>19</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-24 10:57:52 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; Comment on attachment 284262 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=284262&amp;action=review
&gt; &gt; 
&gt; &gt; r=me
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/B3Opcode.h:220
&gt; &gt; &gt; +    // Multiple entrypoint are supported via the EntrySwitch operation. Place this in the root
&gt; &gt; 
&gt; &gt; Typo: entrypoint =&gt; entrypoints
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt; 
&gt; &gt; &gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:130
&gt; &gt; &gt;&gt;&gt; +    // This is for use by lowerEntrySwitch().
&gt; &gt; &gt;&gt; 
&gt; &gt; &gt;&gt; &quot;for use by&quot; =&gt; &quot;used by&quot; or something similar.
&gt; &gt; &gt; 
&gt; &gt; &gt; I changed it.  However, &quot;for use by&quot; to me meant that it&apos;s intended to be used by that phase, while &quot;used by&quot; is just a statement of fact that it&apos;s used by that phase.  I want to make clear that it&apos;s intended only to be used by that phase.
&gt; &gt; 
&gt; &gt; Ok. You can keep that, I don&apos;t have a strong opinion either way. It just
&gt; &gt; read a bit weirdly to me.
&gt; 
&gt; I left it as &quot;used by&quot;. I don&apos;t have a strong opinion either.
&gt; 
&gt; &gt; 
&gt; &gt; &gt;&gt;&gt; Source/JavaScriptCore/b3/air/AirCode.h:146
&gt; &gt; &gt;&gt;&gt; +        m_entrypointLabels = std::forward&lt;Vector&gt;(vector);
&gt; &gt; &gt;&gt; 
&gt; &gt; &gt;&gt; IMO, the contract here should be that we don&apos;t do forwarding here. It seems weird if somebody passed in an lvalue reference here and then we copied the vector.
&gt; &gt; &gt;&gt; I also think this would be easier to read if you just wrote is as:
&gt; &gt; &gt;&gt; void setEntrypointLabels(Vector&lt;CCallHelpers::Label&gt;&amp;&amp; vector) { m_entrypointLabels = WTFMove(vector); }
&gt; &gt; &gt; 
&gt; &gt; &gt; This is a setter.  I&apos;ve been adopting the philosophy that setters should do forwarding unless there is some really compelling reason not prohibit it.
&gt; &gt; 
&gt; &gt; I was just thinking about this form the perspective that it&apos;d be wrong for
&gt; &gt; somebody to call this with an lvalue reference, and then start mutating the
&gt; &gt; lvalue reference afterwards, and not the m_entrypountLabels vector. I don&apos;t
&gt; &gt; think enforcing move semantics, like I suggested, prevents this from
&gt; &gt; happening though. And this problem exists with many setter APIs. So it&apos;s not
&gt; &gt; really a big deal implementing it either way.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:52
&gt; &gt; &gt; +        Vector&lt;FrequentedBlock&gt; entrypoints(code.proc().numEntrypoints(), FrequentedBlock(code[0]));
&gt; &gt; 
&gt; &gt; Should we assert that this is 1 here?
&gt; 
&gt; No.  You could have code where the EntrySwitch was optimized out for some
&gt; reason.  For example, the code leading up to the EntrySwitch might become
&gt; unreachable, or all of the successors of the EntrySwitch might be merged
&gt; together.  We merge identical successors in strength reduction.
Interesting! I wasn&apos;t thinking about that. If you don&apos;t already have a test that does this, maybe you can add one that asserts that all entry points are the same executable address?

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:60
&gt; &gt; &gt; +    RELEASE_ASSERT(worklist.saw(code[0]));
&gt; &gt; 
&gt; &gt; So we&apos;re guaranteed here to have removed any unreachable blocks before this
&gt; &gt; phase runs?
&gt; 
&gt; Yes.
&gt; 
&gt; &gt; I&apos;m not sure if you have a test for this, but can you add one?
&gt; 
&gt; Not sure what to test for. :-)  I don&apos;t want to create a test that always
&gt; asserts, since that would just crash testb3.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:77
&gt; &gt; &gt; +        block-&gt;last().opcode = Jump;
&gt; &gt; 
&gt; &gt; Out of curiosity, is all that&apos;s needed in Air to change a node is to replace
&gt; &gt; its opcode? Or is this just because both EntrySwitch and Jump are terminals?
&gt; 
&gt; Just the opcode and the args.  Since neither EntrySwitch nor Jump have any
&gt; args, you can change one to the other by just changing the opcode.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:83
&gt; &gt; &gt; +    Vector&lt;FrequentedBlock&gt; entrypoints;
&gt; &gt; 
&gt; &gt; Is it worth having this pre-allocate code.proc().numEntrypoints() entries?
&gt; 
&gt; I usually don&apos;t end up adding code to preallocate unless the vector is hot. 
&gt; This one isn&apos;t.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:85
&gt; &gt; &gt; +    IndexMap&lt;BasicBlock, BasicBlock*&gt; map(code.size());
&gt; &gt; 
&gt; &gt; Suggestion: maybe call this &quot;clonedBlocks&quot; or something similar?
&gt; 
&gt; I don&apos;t like that any better than &quot;map&quot;.  In code that does graph cloning I
&gt; always look for a mapping from original to clone, which is necessary for
&gt; rewiring the graph edges.  So, I called this &quot;map&quot; so that I&apos;ll always be
&gt; able to easily find that mapping.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214061</commentid>
    <comment_count>20</comment_count>
      <attachid>284448</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-24 11:04:51 -0700</bug_when>
    <thetext>Created attachment 284448
the patch

Addressed Saam&apos;s comments and also added changes to the B3 docs, which need review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214063</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-07-24 11:07:08 -0700</bug_when>
    <thetext>Attachment 284448 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirOptimizeBlockOrder.cpp:87:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12464:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12465:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12466:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12467:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12468:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12469:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12745:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12746:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12747:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12749:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12750:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:12751:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:73:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 14 in 35 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214064</commentid>
    <comment_count>22</comment_count>
      <attachid>284448</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-07-24 11:10:35 -0700</bug_when>
    <thetext>Comment on attachment 284448
the patch

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

r=me on doc changes

&gt; Websites/webkit.org/docs/b3/intermediate-representation.html:580
&gt; +        &lt;p&gt;This is the canonical way to use EntrySwitch, however the semantics are flexible enough
&gt; +          to allow its use anywhere in the control flow graph. This ensures that EntrySwitch works
&gt; +          even when B3 does transformations that move code above the EntrySwitch.&lt;/p&gt;

Maybe it&apos;s also worth saying that b3 allows an arbitrary numbers of entry switches in the CFG.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214066</commentid>
    <comment_count>23</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-24 11:16:43 -0700</bug_when>
    <thetext>
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirLowerEntrySwitch.cpp:52
&gt; &gt; &gt; &gt; +        Vector&lt;FrequentedBlock&gt; entrypoints(code.proc().numEntrypoints(), FrequentedBlock(code[0]));
&gt; &gt; &gt; 
&gt; &gt; &gt; Should we assert that this is 1 here?
&gt; &gt; 
&gt; &gt; No.  You could have code where the EntrySwitch was optimized out for some
&gt; &gt; reason.  For example, the code leading up to the EntrySwitch might become
&gt; &gt; unreachable, or all of the successors of the EntrySwitch might be merged
&gt; &gt; together.  We merge identical successors in strength reduction.
&gt; Interesting! I wasn&apos;t thinking about that. If you don&apos;t already have a test
&gt; that does this, maybe you can add one that asserts that all entry points are
&gt; the same executable address?

I added such a test.  I didn&apos;t assert that everything points to the same executable
address, since I&apos;m not sure it&apos;s meaningful to actually guarantee that.  I just test that the code does the same thing when called from any entrypoint.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214067</commentid>
    <comment_count>24</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-24 11:17:38 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; Comment on attachment 284448 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=284448&amp;action=review
&gt; 
&gt; r=me on doc changes
&gt; 
&gt; &gt; Websites/webkit.org/docs/b3/intermediate-representation.html:580
&gt; &gt; +        &lt;p&gt;This is the canonical way to use EntrySwitch, however the semantics are flexible enough
&gt; &gt; +          to allow its use anywhere in the control flow graph. This ensures that EntrySwitch works
&gt; &gt; +          even when B3 does transformations that move code above the EntrySwitch.&lt;/p&gt;
&gt; 
&gt; Maybe it&apos;s also worth saying that b3 allows an arbitrary numbers of entry
&gt; switches in the CFG.

Added!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1214078</commentid>
    <comment_count>25</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-07-24 13:35:36 -0700</bug_when>
    <thetext>Landed in https://trac.webkit.org/changeset/203670</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>282674</attachid>
            <date>2016-07-03 20:58:06 -0700</date>
            <delta_ts>2016-07-19 20:06:20 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>27972</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCShy
ZXZpc2lvbiAyMDI3OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2Nr
VXRpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtODYsMTQgKzg2LDE4IEBAIHZvaWQgdXBkYXRlUHJl
ZGVjZXNzb3JzQWZ0ZXIoQmFzaWNCbG9jayoKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNC
bG9jaz4KLXZvaWQgcmVjb21wdXRlUHJlZGVjZXNzb3JzKFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8
QmFzaWNCbG9jaz4+JiBibG9ja3MpCit2b2lkIGNsZWFyUHJlZGVjZXNzb3JzKFZlY3RvcjxzdGQ6
OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCiB7Ci0gICAgLy8gQ2xlYXIgYWxsIHBy
ZWRlY2Vzc29yIGxpc3RzIGZpcnN0LgogICAgIGZvciAoYXV0byYgYmxvY2sgOiBibG9ja3MpIHsK
ICAgICAgICAgaWYgKGJsb2NrKQogICAgICAgICAgICAgYmxvY2stPnByZWRlY2Vzc29ycygpLnJl
c2l6ZSgwKTsKICAgICB9Cit9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljQmxvY2s+Cit2b2lk
IHJlY29tcHV0ZVByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+
PiYgYmxvY2tzKQoreworICAgIGNsZWFyUHJlZGVjZXNzb3JzKGJsb2Nrcyk7CiAgICAgdXBkYXRl
UHJlZGVjZXNzb3JzQWZ0ZXIoYmxvY2tzWzBdLmdldCgpKTsKIH0KIApJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzQ29udHJvbFZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCShyZXZpc2lvbiAyMDI3OTUpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9sVmFsdWUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNiw2ICszNiwxMiBAQCBDb250cm9sVmFsdWU6On5Db250cm9sVmFsdWUoKQogewog
fQogCit2b2lkIENvbnRyb2xWYWx1ZTo6YXBwZW5kU3VjY2Vzc29yKGNvbnN0IEZyZXF1ZW50ZWRC
bG9jayYgYmxvY2spCit7CisgICAgUkVMRUFTRV9BU1NFUlQob3Bjb2RlKCkgPT0gRW50cnlTd2l0
Y2gpOworICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQoYmxvY2spOworfQorCiBib29sIENvbnRyb2xW
YWx1ZTo6cmVwbGFjZVN1Y2Nlc3NvcihCYXNpY0Jsb2NrKiBmcm9tLCBCYXNpY0Jsb2NrKiB0bykK
IHsKICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwpAQCAtOTAsNiArOTYsMzggQEAgVmFsdWUqIENv
bnRyb2xWYWx1ZTo6Y2xvbmVJbXBsKCkgY29uc3QKICAgICByZXR1cm4gbmV3IENvbnRyb2xWYWx1
ZSgqdGhpcyk7CiB9CiAKK0NvbnRyb2xWYWx1ZTo6Q29udHJvbFZhbHVlKE9wY29kZSBvcGNvZGUs
IE9yaWdpbiBvcmlnaW4pCisgICAgOiBWYWx1ZShDaGVja2VkT3Bjb2RlLCBvcGNvZGUsIFZvaWQs
IG9yaWdpbikKK3sKKyAgICBBU1NFUlQob3Bjb2RlID09IE9vcHMgfHwgb3Bjb2RlID09IEVudHJ5
U3dpdGNoKTsKK30KKworLy8gVXNlIHRoaXMgZm9yIFJldHVybi4KK0NvbnRyb2xWYWx1ZTo6Q29u
dHJvbFZhbHVlKE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCisg
ICAgOiBWYWx1ZShDaGVja2VkT3Bjb2RlLCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcmVzdWx0KQor
eworICAgIEFTU0VSVChvcGNvZGUgPT0gUmV0dXJuKTsKK30KKworLy8gVXNlIHRoaXMgZm9yIEp1
bXAgb3IgRW50cnlTd2l0Y2guCitDb250cm9sVmFsdWU6OkNvbnRyb2xWYWx1ZShPcGNvZGUgb3Bj
b2RlLCBPcmlnaW4gb3JpZ2luLCBjb25zdCBGcmVxdWVudGVkQmxvY2smIHRhcmdldCkKKyAgICA6
IFZhbHVlKENoZWNrZWRPcGNvZGUsIG9wY29kZSwgVm9pZCwgb3JpZ2luKQoreworICAgIEFTU0VS
VChvcGNvZGUgPT0gSnVtcCB8fCBvcGNvZGUgPT0gRW50cnlTd2l0Y2gpOworICAgIG1fc3VjY2Vz
c29ycy5hcHBlbmQodGFyZ2V0KTsKK30KKworLy8gVXNlIHRoaXMgZm9yIEJyYW5jaC4KK0NvbnRy
b2xWYWx1ZTo6Q29udHJvbFZhbHVlKAorICAgIE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4s
IFZhbHVlKiBwcmVkaWNhdGUsCisgICAgY29uc3QgRnJlcXVlbnRlZEJsb2NrJiB5ZXMsIGNvbnN0
IEZyZXF1ZW50ZWRCbG9jayYgbm8pCisgICAgOiBWYWx1ZShDaGVja2VkT3Bjb2RlLCBvcGNvZGUs
IFZvaWQsIG9yaWdpbiwgcHJlZGljYXRlKQoreworICAgIEFTU0VSVChvcGNvZGUgPT0gQnJhbmNo
KTsKKyAgICBtX3N1Y2Nlc3NvcnMuYXBwZW5kKHllcyk7CisgICAgbV9zdWNjZXNzb3JzLmFwcGVu
ZChubyk7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwogCiAjZW5kaWYgLy8gRU5BQkxF
KEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbnRyb2xWYWx1ZS5o
CShyZXZpc2lvbiAyMDI3OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb250cm9s
VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsNyBAQCBwdWJsaWM6CiAgICAgICAg
IGNhc2UgQnJhbmNoOgogICAgICAgICBjYXNlIFJldHVybjoKICAgICAgICAgY2FzZSBPb3BzOgor
ICAgICAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
ICAgIGNhc2UgU3dpdGNoOiAKICAgICAgICAgICAgIC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIFN3
aXRjaFZhbHVlIGlzIGEgc3ViY2xhc3Mgb2YgQ29udHJvbFZhbHVlLCBzbyB3ZSB3YW50CkBAIC03
Niw2ICs3Nyw5IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIFN1Y2Nlc3NvckNvbGxlY3Rpb248
Y29uc3QgQmFzaWNCbG9jaywgY29uc3QgU3VjY2Vzc29yTGlzdD4oc3VjY2Vzc29ycygpKTsKICAg
ICB9CiAKKyAgICAvLyBPbmx5IHZhbGlkIGZvciBFbnRyeVN3aXRjaC4KKyAgICB2b2lkIGFwcGVu
ZFN1Y2Nlc3Nvcihjb25zdCBGcmVxdWVudGVkQmxvY2smKTsKKwogICAgIGJvb2wgcmVwbGFjZVN1
Y2Nlc3NvcihCYXNpY0Jsb2NrKiBmcm9tLCBCYXNpY0Jsb2NrKiB0byk7CiAKICAgICBjb25zdCBG
cmVxdWVudGVkQmxvY2smIHRha2VuKCkgY29uc3QKQEAgLTEyMSwzOCArMTI1LDE5IEBAIHByb3Rl
Y3RlZDoKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFByb2NlZHVyZTsKIAotICAgIC8vIFVz
ZSB0aGlzIGZvciBPb3BzLgotICAgIENvbnRyb2xWYWx1ZShPcGNvZGUgb3Bjb2RlLCBPcmlnaW4g
b3JpZ2luKQotICAgICAgICA6IFZhbHVlKENoZWNrZWRPcGNvZGUsIG9wY29kZSwgVm9pZCwgb3Jp
Z2luKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBPb3BzKTsKLSAgICB9CisgICAg
Ly8gVXNlIHRoaXMgZm9yIE9vcHMgb3IgRW50cnlTd2l0Y2guCisgICAgQ29udHJvbFZhbHVlKE9w
Y29kZSwgT3JpZ2luKTsKIAogICAgIC8vIFVzZSB0aGlzIGZvciBSZXR1cm4uCi0gICAgQ29udHJv
bFZhbHVlKE9wY29kZSBvcGNvZGUsIE9yaWdpbiBvcmlnaW4sIFZhbHVlKiByZXN1bHQpCi0gICAg
ICAgIDogVmFsdWUoQ2hlY2tlZE9wY29kZSwgb3Bjb2RlLCBWb2lkLCBvcmlnaW4sIHJlc3VsdCkK
LSAgICB7Ci0gICAgICAgIEFTU0VSVChvcGNvZGUgPT0gUmV0dXJuKTsKLSAgICB9CisgICAgQ29u
dHJvbFZhbHVlKE9wY29kZSwgT3JpZ2luLCBWYWx1ZSogcmVzdWx0KTsKIAotICAgIC8vIFVzZSB0
aGlzIGZvciBKdW1wLgotICAgIENvbnRyb2xWYWx1ZShPcGNvZGUgb3Bjb2RlLCBPcmlnaW4gb3Jp
Z2luLCBjb25zdCBGcmVxdWVudGVkQmxvY2smIHRhcmdldCkKLSAgICAgICAgOiBWYWx1ZShDaGVj
a2VkT3Bjb2RlLCBvcGNvZGUsIFZvaWQsIG9yaWdpbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChv
cGNvZGUgPT0gSnVtcCk7Ci0gICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQodGFyZ2V0KTsKLSAg
ICB9CisgICAgLy8gVXNlIHRoaXMgZm9yIEp1bXAgb3IgRW50cnlTd2l0Y2guCisgICAgQ29udHJv
bFZhbHVlKE9wY29kZSwgT3JpZ2luLCBjb25zdCBGcmVxdWVudGVkQmxvY2smKTsKIAogICAgIC8v
IFVzZSB0aGlzIGZvciBCcmFuY2guCiAgICAgQ29udHJvbFZhbHVlKAogICAgICAgICBPcGNvZGUg
b3Bjb2RlLCBPcmlnaW4gb3JpZ2luLCBWYWx1ZSogcHJlZGljYXRlLAotICAgICAgICBjb25zdCBG
cmVxdWVudGVkQmxvY2smIHllcywgY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBubykKLSAgICAgICAg
OiBWYWx1ZShDaGVja2VkT3Bjb2RlLCBvcGNvZGUsIFZvaWQsIG9yaWdpbiwgcHJlZGljYXRlKQot
ICAgIHsKLSAgICAgICAgQVNTRVJUKG9wY29kZSA9PSBCcmFuY2gpOwotICAgICAgICBtX3N1Y2Nl
c3NvcnMuYXBwZW5kKHllcyk7Ci0gICAgICAgIG1fc3VjY2Vzc29ycy5hcHBlbmQobm8pOwotICAg
IH0KKyAgICAgICAgY29uc3QgRnJlcXVlbnRlZEJsb2NrJiB5ZXMsIGNvbnN0IEZyZXF1ZW50ZWRC
bG9jayYgbm8pOwogfTsKIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0ZyZXF1ZW5jeUNsYXNzLmgJKHJldmlzaW9uIDIwMjc5NSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0ZyZXF1ZW5jeUNsYXNzLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQzLDYgKzQzLDEzIEBAIGVudW0gY2xhc3MgRnJlcXVlbmN5Q2xhc3MgOiB1aW50
OF90IHsKICAgICBSYXJlCiB9OwogCitpbmxpbmUgRnJlcXVlbmN5Q2xhc3MgbWF4RnJlcXVlbmN5
KEZyZXF1ZW5jeUNsYXNzIGEsIEZyZXF1ZW5jeUNsYXNzIGIpCit7CisgICAgaWYgKGEgPT0gRnJl
cXVlbmN5Q2xhc3M6Ok5vcm1hbCkKKyAgICAgICAgcmV0dXJuIEZyZXF1ZW5jeUNsYXNzOjpOb3Jt
YWw7CisgICAgcmV0dXJuIGI7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwogCiBuYW1l
c3BhY2UgV1RGIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyVG9BaXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0xvd2VyVG9BaXIu
Y3BwCShyZXZpc2lvbiAyMDI3OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dl
clRvQWlyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ0Niw2ICsyNDQ2LDExIEBAIHByaXZhdGU6
CiAgICAgICAgICAgICBhcHBlbmQoQWlyOjpPb3BzKTsKICAgICAgICAgICAgIHJldHVybjsKICAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQjM6OkVudHJ5U3dpdGNoOiB7Cisg
ICAgICAgICAgICBhcHBlbmQoQWlyOjpFbnRyeVN3aXRjaCk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9uIDIwMjc5NSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI5MCw2ICsyOTAsOSBAQCB2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgT3Bj
CiAgICAgY2FzZSBTd2l0Y2g6CiAgICAgICAgIG91dC5wcmludCgiU3dpdGNoIik7CiAgICAgICAg
IHJldHVybjsKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAgICAgICBvdXQucHJpbnQoIkVudHJ5
U3dpdGNoIik7CisgICAgICAgIHJldHVybjsKICAgICBjYXNlIFJldHVybjoKICAgICAgICAgb3V0
LnByaW50KCJSZXR1cm4iKTsKICAgICAgICAgcmV0dXJuOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDIwMjc5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMTYsNiArMjE2LDExIEBAIGVudW0g
T3Bjb2RlIDogaW50MTZfdCB7CiAKICAgICAvLyBTd2l0Y2guIFN3aXRjaGVzIG92ZXIgZWl0aGVy
IEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1ZSBjbGFzcy4KICAgICBTd2l0Y2gs
CisgICAgCisgICAgLy8gTXVsdGlwbGUgZW50cnlwb2ludCBhcmUgc3VwcG9ydGVkIHZpYSB0aGUg
RW50cnlTd2l0Y2ggb3BlcmF0aW9uLiBQbGFjZSB0aGlzIGluIHRoZSByb290CisgICAgLy8gYmxv
Y2sgYW5kIGxpc3QgdGhlIGVudHJ5cG9pbnRzIGFzIHRoZSBzdWNjZXNzb3JzLiBBbGwgYmxvY2tz
IGJhY2t3YXJkcy1yZWFjaGFibGUgZnJvbQorICAgIC8vIEVudHJ5U3dpdGNoIGFyZSBkdXBsaWNh
dGVkIGZvciBlYWNoIGVudHJ5cG9pbnQuCisgICAgRW50cnlTd2l0Y2gsCiAKICAgICAvLyBSZXR1
cm4uIE5vdGUgdGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtub3cgdGhlaXIgcmV0dXJuIHR5cGUs
IHNvIHRoaXMgY2FuIGp1c3QgcmV0dXJuIGFueQogICAgIC8vIHR5cGUuIFVzZXMgdGhlIENvbnRy
b2xWYWx1ZSBjbGFzcy4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVy
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5o
CShyZXZpc2lvbiAyMDI3OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1
cmUuaAkod29ya2luZyBjb3B5KQpAQCAtMjA5LDYgKzIwOSw5IEBAIHB1YmxpYzoKIAogICAgIHZv
aWQgYWRkRmFzdENvbnN0YW50KGNvbnN0IFZhbHVlS2V5Jik7CiAgICAgYm9vbCBpc0Zhc3RDb25z
dGFudChjb25zdCBWYWx1ZUtleSYpOworICAgIAorICAgIHVuc2lnbmVkIG51bUVudHJ5cG9pbnRz
KCkgY29uc3QgeyByZXR1cm4gbV9udW1FbnRyeXBvaW50czsgfQorICAgIHZvaWQgc2V0TnVtRW50
cnlwb2ludHModW5zaWduZWQgbnVtRW50cnlwb2ludHMpIHsgbV9udW1FbnRyeXBvaW50cyA9IG51
bUVudHJ5cG9pbnRzOyB9CiAKICAgICAvLyBUaGUgbmFtZSBoYXMgdG8gYmUgYSBzdHJpbmcgbGl0
ZXJhbCwgc2luY2Ugd2UgZG9uJ3QgZG8gYW55IG1lbW9yeSBtYW5hZ2VtZW50IGZvciB0aGUgc3Ry
aW5nLgogICAgIHZvaWQgc2V0TGFzdFBoYXNlTmFtZShjb25zdCBjaGFyKiBuYW1lKQpAQCAtMjU4
LDYgKzI2MSw3IEBAIHByaXZhdGU6CiAgICAgc3RkOjp1bmlxdWVfcHRyPENGRz4gbV9jZmc7CiAg
ICAgc3RkOjp1bmlxdWVfcHRyPERvbWluYXRvcnM+IG1fZG9taW5hdG9yczsKICAgICBIYXNoU2V0
PFZhbHVlS2V5PiBtX2Zhc3RDb25zdGFudHM7CisgICAgdW5zaWduZWQgbV9udW1FbnRyeXBvaW50
cyB7IDEgfTsKICAgICBjb25zdCBjaGFyKiBtX2xhc3RQaGFzZU5hbWU7CiAgICAgc3RkOjp1bmlx
dWVfcHRyPE9wYXF1ZUJ5cHJvZHVjdHM+IG1fYnlwcm9kdWN0czsKICAgICBzdGQ6OnVuaXF1ZV9w
dHI8QWlyOjpDb2RlPiBtX2NvZGU7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNW
YWxpZGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFs
aWRhdGUuY3BwCShyZXZpc2lvbiAyMDI3OTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNWYWxpZGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyOSw4ICsxMjksNiBAQCBwdWJsaWM6
CiAgICAgICAgICAgICAgICAgVkFMSURBVEUoY2hpbGQtPnR5cGUoKSAhPSBWb2lkLCAoIkF0ICIs
ICp2YWx1ZSwgIi0+IiwgKmNoaWxkKSk7CiAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLT5vcGNv
ZGUoKSkgewogICAgICAgICAgICAgY2FzZSBOb3A6Ci0gICAgICAgICAgICBjYXNlIEp1bXA6Ci0g
ICAgICAgICAgICBjYXNlIE9vcHM6CiAgICAgICAgICAgICAgICAgVkFMSURBVEUoIXZhbHVlLT5u
dW1DaGlsZHJlbigpLCAoIkF0ICIsICp2YWx1ZSkpOwogICAgICAgICAgICAgICAgIFZBTElEQVRF
KHZhbHVlLT50eXBlKCkgPT0gVm9pZCwgKCJBdCAiLCAqdmFsdWUpKTsKICAgICAgICAgICAgICAg
ICBicmVhazsKQEAgLTM3NywxNSArMzc1LDM3IEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICBW
QUxJREFURSghdmFsdWUtPm51bUNoaWxkcmVuKCksICgiQXQgIiwgKnZhbHVlKSk7CiAgICAgICAg
ICAgICAgICAgVkFMSURBVEUodmFsdWUtPnR5cGUoKSAhPSBWb2lkLCAoIkF0ICIsICp2YWx1ZSkp
OwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKdW1wOgorICAgICAg
ICAgICAgICAgIFZBTElEQVRFKCF2YWx1ZS0+bnVtQ2hpbGRyZW4oKSwgKCJBdCAiLCAqdmFsdWUp
KTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+dHlwZSgpID09IFZvaWQsICgiQXQg
IiwgKnZhbHVlKSk7CisgICAgICAgICAgICAgICAgVkFMSURBVEUodmFsdWUtPmFzPENvbnRyb2xW
YWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpID09IDEpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgY2FzZSBPb3BzOgorICAgICAgICAgICAgICAgIFZBTElEQVRFKCF2YWx1ZS0+
bnVtQ2hpbGRyZW4oKSwgKCJBdCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBWQUxJREFU
RSh2YWx1ZS0+dHlwZSgpID09IFZvaWQsICgiQXQgIiwgKnZhbHVlKSk7CisgICAgICAgICAgICAg
ICAgVkFMSURBVEUoIXZhbHVlLT5hczxDb250cm9sVmFsdWU+KCktPm51bVN1Y2Nlc3NvcnMoKSk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJldHVybjoKICAgICAg
ICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+bnVtQ2hpbGRyZW4oKSA9PSAxLCAoIkF0ICIsICp2
YWx1ZSkpOwogICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbHVlLT50eXBlKCkgPT0gVm9pZCwg
KCJBdCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSghdmFsdWUtPmFzPENv
bnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpKTsKICAgICAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgICAgIGNhc2UgQnJhbmNoOgorICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbHVl
LT5udW1DaGlsZHJlbigpID09IDEsICgiQXQgIiwgKnZhbHVlKSk7CisgICAgICAgICAgICAgICAg
VkFMSURBVEUoaXNJbnQodmFsdWUtPmNoaWxkKDApLT50eXBlKCkpLCAoIkF0ICIsICp2YWx1ZSkp
OworICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbHVlLT50eXBlKCkgPT0gVm9pZCwgKCJBdCAi
LCAqdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+YXM8Q29udHJvbFZh
bHVlPigpLT5udW1TdWNjZXNzb3JzKCkgPT0gMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAg
ICAgICAgICAgICBjYXNlIFN3aXRjaDoKICAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+
bnVtQ2hpbGRyZW4oKSA9PSAxLCAoIkF0ICIsICp2YWx1ZSkpOwogICAgICAgICAgICAgICAgIFZB
TElEQVRFKGlzSW50KHZhbHVlLT5jaGlsZCgwKS0+dHlwZSgpKSwgKCJBdCAiLCAqdmFsdWUpKTsK
ICAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+dHlwZSgpID09IFZvaWQsICgiQXQgIiwg
KnZhbHVlKSk7CisgICAgICAgICAgICAgICAgVkFMSURBVEUodmFsdWUtPmFzPENvbnRyb2xWYWx1
ZT4oKS0+bnVtU3VjY2Vzc29ycygpID09IHZhbHVlLT5hczxTd2l0Y2hWYWx1ZT4oKS0+bnVtQ2Fz
ZVZhbHVlcygpICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNl
IEVudHJ5U3dpdGNoOgorICAgICAgICAgICAgICAgIFZBTElEQVRFKCF2YWx1ZS0+bnVtQ2hpbGRy
ZW4oKSwgKCJBdCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZS0+
dHlwZSgpID09IFZvaWQsICgiQXQgIiwgKnZhbHVlKSk7CisgICAgICAgICAgICAgICAgVkFMSURB
VEUodmFsdWUtPmFzPENvbnRyb2xWYWx1ZT4oKS0+bnVtU3VjY2Vzc29ycygpID09IG1fcHJvY2Vk
dXJlLm51bUVudHJ5cG9pbnRzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
ICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHJl
dmlzaW9uIDIwMjc5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTc4LDkgKzc4LDI3IEBAIENDYWxsU3BlY2lhbCogQ29kZTo6
Y0NhbGxTcGVjaWFsKCkKICAgICByZXR1cm4gbV9jQ2FsbFNwZWNpYWw7CiB9CiAKK2Jvb2wgQ29k
ZTo6aXNFbnRyeXBvaW50KEJhc2ljQmxvY2sqIGJsb2NrKSBjb25zdAoreworICAgIGlmIChtX2Vu
dHJ5cG9pbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuICFibG9jay0+aW5kZXgoKTsKKyAg
ICAKKyAgICBmb3IgKGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2ludCA6IG1fZW50cnlw
b2ludHMpIHsKKyAgICAgICAgaWYgKGVudHJ5cG9pbnQuYmxvY2soKSA9PSBibG9jaykKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQg
Q29kZTo6cmVzZXRSZWFjaGFiaWxpdHkoKQogewotICAgIHJlY29tcHV0ZVByZWRlY2Vzc29ycyht
X2Jsb2Nrcyk7CisgICAgY2xlYXJQcmVkZWNlc3NvcnMobV9ibG9ja3MpOworICAgIGlmIChtX2Vu
dHJ5cG9pbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIobV9i
bG9ja3NbMF0uZ2V0KCkpOworICAgIGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IEZyZXF1ZW50
ZWRCbG9jayYgZW50cnlwb2ludCA6IG1fZW50cnlwb2ludHMpCisgICAgICAgICAgICB1cGRhdGVQ
cmVkZWNlc3NvcnNBZnRlcihlbnRyeXBvaW50LmJsb2NrKCkpOworICAgIH0KICAgICAKICAgICBm
b3IgKGF1dG8mIGJsb2NrIDogbV9ibG9ja3MpIHsKICAgICAgICAgaWYgKGlzQmxvY2tEZWFkKGJs
b2NrLmdldCgpKSkKQEAgLTkwLDYgKzEwOCw4IEBAIHZvaWQgQ29kZTo6cmVzZXRSZWFjaGFiaWxp
dHkoKQogCiB2b2lkIENvZGU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKIHsKKyAgICBp
ZiAoIW1fZW50cnlwb2ludHMuaXNFbXB0eSgpKQorICAgICAgICBvdXQucHJpbnQoIkVudHJ5cG9p
bnRzOiAiLCBsaXN0RHVtcChtX2VudHJ5cG9pbnRzKSwgIlxuIik7CiAgICAgZm9yIChCYXNpY0Js
b2NrKiBibG9jayA6ICp0aGlzKQogICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsK
ICAgICBpZiAoc3RhY2tTbG90cygpLnNpemUoKSkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJDb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJDb2RlLmgJKHJldmlzaW9uIDIwMjc5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTgsNiArMTE4LDIwIEBA
IHB1YmxpYzoKICAgICAgICAgbV9mcmFtZVNpemUgPSBmcmFtZVNpemU7CiAgICAgfQogCisgICAg
Ly8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHByb2MoKS5udW1FbnRy
eXBvaW50cygpLiBUaGlzIHZhbHVlIGhlcmUgbWF5IGJlIHplcm8KKyAgICAvLyB1bnRpbCB3ZSBs
b3dlciBFbnRyeVN3aXRjaC4KKyAgICB1bnNpZ25lZCBudW1FbnRyeXBvaW50cygpIGNvbnN0IHsg
cmV0dXJuIG1fZW50cnlwb2ludHMuc2l6ZSgpOyB9CisgICAgY29uc3QgVmVjdG9yPEZyZXF1ZW50
ZWRCbG9jaz4gZW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5cG9pbnRzOyB9Cisg
ICAgY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBlbnRyeXBvaW50KHVuc2lnbmVkIGluZGV4KSBjb25z
dCB7IHJldHVybiBtX2VudHJ5cG9pbnRzW2ldOyB9CisgICAgYm9vbCBpc0VudHJ5cG9pbnQoQmFz
aWNCbG9jayopIGNvbnN0OworICAgIAorICAgIC8vIFRoaXMgaXMgZm9yIHVzZSBieSBsb3dlckVu
dHJ5U3dpdGNoKCkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yPgorICAgIHZvaWQgc2V0
RW50cnlwb2ludHMoVmVjdG9yJiYgdmVjdG9yKQorICAgIHsKKyAgICAgICAgbV9lbnRyeXBvaW50
cyA9IHN0ZDo6Zm9yd2FyZDxWZWN0b3I+KHZlY3Rvcik7CisgICAgfQorCiAgICAgY29uc3QgUmVn
aXN0ZXJBdE9mZnNldExpc3QmIGNhbGxlZVNhdmVSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBt
X2NhbGxlZVNhdmVSZWdpc3RlcnM7IH0KICAgICBSZWdpc3RlckF0T2Zmc2V0TGlzdCYgY2FsbGVl
U2F2ZVJlZ2lzdGVycygpIHsgcmV0dXJuIG1fY2FsbGVlU2F2ZVJlZ2lzdGVyczsgfQogCkBAIC0y
MzIsNiArMjQ2LDcgQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2ZyYW1lU2l6ZSB7IDAgfTsK
ICAgICB1bnNpZ25lZCBtX2NhbGxBcmdBcmVhU2l6ZSB7IDAgfTsKICAgICBSZWdpc3RlckF0T2Zm
c2V0TGlzdCBtX2NhbGxlZVNhdmVSZWdpc3RlcnM7CisgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9j
az4gbV9lbnRyeXBvaW50czsgLy8gVGhpcyBpcyBlbXB0eSB1bnRpbCBhZnRlciBsb3dlckVudHJ5
U3dpdGNoKCkuCiAgICAgY29uc3QgY2hhciogbV9sYXN0UGhhc2VOYW1lOwogfTsKIApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJldmlzaW9u
IDIwMjc5NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xMjUsMTAgKzEyNSw2IEBAIHZvaWQgcHJlcGFyZUZvckdlbmVy
YXRpb24oQ29kZSYgY29kZSkKICAgICAvLyBwaGFzZS4KICAgICBzaW1wbGlmeUNGRyhjb2RlKTsK
IAotICAgIC8vIFRoaXMgc29ydHMgdGhlIGJhc2ljIGJsb2NrcyBpbiBDb2RlIHRvIGFjaGlldmUg
YW4gb3JkZXJpbmcgdGhhdCBtYXhpbWl6ZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIGhpZ2gKLSAg
ICAvLyBmcmVxdWVuY3kgc3VjY2Vzc29yIGlzIGFsc28gdGhlIGZhbGwtdGhyb3VnaCB0YXJnZXQu
Ci0gICAgb3B0aW1pemVCbG9ja09yZGVyKGNvZGUpOwotCiAgICAgLy8gVGhpcyBpcyBuZWVkZWQg
dG8gc2F0aXNmeSBhIHJlcXVpcmVtZW50IG9mIEIzOjpTdGFja21hcFZhbHVlLgogICAgIHJlcG9y
dFVzZWRSZWdpc3RlcnMoY29kZSk7CiAKQEAgLTEzNyw2ICsxMzMsMTYgQEAgdm9pZCBwcmVwYXJl
Rm9yR2VuZXJhdGlvbihDb2RlJiBjb2RlKQogICAgIC8vIHVzZS4gV2UgX211c3RfIHJ1biB0aGlz
IGFmdGVyIHJlcG9ydFVzZWRSZWdpc3RlcnMoKSwgc2luY2UgdGhhdCBraWxscyB2YXJpYWJsZSBh
c3NpZ25tZW50cwogICAgIC8vIHRoYXQgc2VlbSBkZWFkLiBMdWNraWx5LCB0aGlzIHBoYXNlIGRv
ZXMgbm90IGNoYW5nZSByZWdpc3RlciBsaXZlbmVzcywgc28gdGhhdCdzIE9LLgogICAgIGZpeFBh
cnRpYWxSZWdpc3RlclN0YWxscyhjb2RlKTsKKyAgICAKKyAgICAvLyBBY3R1YWxseSBjcmVhdGUg
ZW50cnlwb2ludHMuCisgICAgbG93ZXJFbnRyeVN3aXRjaChjb2RlKTsKKyAgICAKKyAgICAvLyBU
aGUgY29udHJvbCBmbG93IGdyYXBoIGNhbiBiZSBzaW1wbGlmaWVkIGZ1cnRoZXIgYWZ0ZXIgd2Ug
aGF2ZSBsb3dlcmVkIEVudHJ5U3dpdGNoLgorICAgIHNpbXBsaWZ5Q0ZHKGNvZGUpOworCisgICAg
Ly8gVGhpcyBzb3J0cyB0aGUgYmFzaWMgYmxvY2tzIGluIENvZGUgdG8gYWNoaWV2ZSBhbiBvcmRl
cmluZyB0aGF0IG1heGltaXplcyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgaGlnaAorICAgIC8vIGZy
ZXF1ZW5jeSBzdWNjZXNzb3IgaXMgYWxzbyB0aGUgZmFsbC10aHJvdWdoIHRhcmdldC4KKyAgICBv
cHRpbWl6ZUJsb2NrT3JkZXIoY29kZSk7CiAKICAgICBpZiAoc2hvdWxkVmFsaWRhdGVJUigpKQog
ICAgICAgICB2YWxpZGF0ZShjb2RlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckxvd2Vy
RW50cnlTd2l0Y2guaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisKKyNpbmNsdWRlICJBaXJDb2Rl
LmgiCisjaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5oIgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgbG93ZXJFbnRyeVN3aXRjaChDb2RlJiBj
b2RlKQoreworICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAibG93ZXJFbnRyeVN3aXRj
aCIpOworICAgIAorICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHNldCBvZiBibG9ja3MgdGhhdCBzaG91
bGQgYmUgZHVwbGljYXRlZC4KKyAgICBHcmFwaE5vZGVXb3JrbGlzdCB3b3JrbGlzdDsKKyAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkgeworICAgICAgICBpZiAoYmxvY2stPmxhc3Qo
KS5vcGNvZGUgPT0gRW50cnlTd2l0Y2gpCisgICAgICAgICAgICB3b3JrbGlzdC5wdXNoKGJsb2Nr
KTsKKyAgICB9CisgICAgCisgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGRvbid0IGhhdmUg
YW55IEVudHJ5U3dpdGNoZXMuIFRoYXQncyBmaW5lLgorICAgIGlmICh3b3JrbGlzdC5zZWVuKCku
aXNFbXB0eSgpKSB7CisgICAgICAgIFZlY3RvcjxGcmVxdWVudGVkQmxvY2s+IGVudHJ5cG9pbnRz
KGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCksIEZyZXF1ZW50ZWRCbG9jayhjb2RlWzBdKSk7
CisgICAgICAgIGNvZGUuc2V0RW50cnlwb2ludHMoV1RGTW92ZShlbnRyeXBvaW50cykpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHdoaWxlIChCYXNpY0Jsb2NrKiBibG9jayA9
IHdvcmtsaXN0LnBvcCgpKQorICAgICAgICB3b3JrbGlzdC5wdXNoQWxsKGJsb2NrLT5wcmVkZWNl
c3NvcnMoKSk7CisgICAgCisgICAgLy8gRklYTUU6IEF0IHRoaXMgcG9pbnQgd2UgbWF5IGZpbmQg
dGhhdCB0aGUgc2V0IG9mIGJsb2NrcyB0byBkdXBsaWNhdGUgY29udGFpbnMgc29tZXRoaW5nIHRo
YXQKKyAgICAvLyBpc24ndCBjbG9uZWFibGUuIFdlIHdvdWxkIGxpa2UgdG8gdXNlIGxvd2VyaW5n
IGJhc2VkIG9uIGFuIGVudHJ5IHZhcmlhYmxlIGluIHRoYXQgY2FzZSwKKyAgICAvLyBleGNlcHQg
dGhhdCB3ZSBjYW5ub3QgZG8gdGhpcyBiZWNhdXNlIHdlJ3ZlIGFscmVhZHkgbG9ja2VkIGluIG91
ciByZWdpc3RlciBhbmQgc3RhY2sgbGF5b3V0CisgICAgLy8gZGVjaXNpb25zISBPaCBubyEgUG9z
c2libGUgc29sdXRpb25zOgorICAgIC8vCisgICAgLy8gQSkgU2ltcGx5IHByZXRlbmQgdGhhdCB0
aGlzIGRvZXNuJ3QgaGFwcGVuLiBUaGlzIHdvdWxkIGFsbW9zdCBiZSBhIHZhbGlkIGNob2ljZSwg
c2luY2UgdGhlCisgICAgLy8gICAgbGlrZWxpaG9vZCBvZiB0aGlzIGhhcHBlbmluZyBpcyB0ZXJy
aWJseSBsb3cuCisgICAgLy8KKyAgICAvLyBCKSBBZGQgdmFsaWRhdGlvbiBydWxlcyB0aGF0IHBy
ZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZy4gVGhhdCB3b3VsZCBiZSBlYXN5IGVub3VnaDogdGhl
IElSCisgICAgLy8gICAgaXMgaW52YWxpZCBhcyBzb29uIGFzIGEgbm9uLWNsb25lYWJsZSBvcGVy
YXRpb24gaXMgYmFja3dhcmRzLXJlYWNoYWJsZSBmcm9tIEVudHJ5U3dpdGNoLgorICAgIC8vCisg
ICAgLy8gQykgVHJ5IHRvIGRvIGVudHJ5cG9pbnQgbG93ZXJpbmcgYmVmb3JlIHJlZ2lzdGVyIGFs
bG9jYXRpb24uIFNvdW5kcyByb3VnaC4gVGhhdCB3b3VsZCBtZWFuCisgICAgLy8gICAgdGhhdCB0
aGUgaGFyZGVzdCB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgd2hvbGUgY29tcGlsZXIgbmVlZHMgdG8g
a25vdyBhYm91dCBtdWx0aXBsZQorICAgIC8vICAgIGVudHJ5cG9pbnRzLiBJdCBhbHNvIG1lYW5z
IHRoYXQgYWxsIHBoYXNlcyBhZnRlciBSQSB3aWxsIGhhdmUgdG8gaGFuZGxlIG11bHRpcGxlCisg
ICAgLy8gICAgZW50cnlwb2ludHMuIE1heWJlIGl0J3MgZWFzeSBidXQgSSdkIHJhdGhlciBub3Qu
CisgICAgLy8KKyAgICAvLyBEKSBIYXZlIEVudHJ5U3dpdGNoIGluIEFpciBhbHdheXMgdXNlIGFu
IHRlbXBvcmFyeS4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb2RlIGluc2lkZSB0aGUKKyAgICAvLyAg
ICBkdXBsaWNhdGVkIGVudHJ5cG9pbnQgc2xlZCBtYXkgYmUgc2hvcnQgb25lIHJlZ2lzdGVyIGV2
ZW4gaWYgaXQgZG9lc24ndCBjb250YWluIGFueSBjb2RlCisgICAgLy8gICAgdGhhdCBjYW5ub3Qg
YmUgZHVwbGljYXRlZC4KKyAgICAvLworICAgIC8vIEUpIEludHJvZHVjZSBhIGxlZ2FsaXplRW50
cnlTd2l0Y2goKSBwaGFzZSBpbiBCMyB0aGF0IGNoZWNrcyBpZiBhbnkgb2YgdGhlIGNvZGUgaW4g
dGhlCisgICAgLy8gICAgYmFja3dhcmRzIGNsb3N1cmUgb2YgRW50cnlTd2l0Y2hlcyBpcyBub3Qg
Y2xvbmVhYmxlLiBJZiBhbnkgc3VjaCBjb2RlIGV4aXN0cywgdGhlIHBoYXNlCisgICAgLy8gICAg
dHVybnMgdGhlIEVudHJ5U3dpdGNoZXMgaW50byBTd2l0Y2hlcy4gVGhlIHRyYW5zZm9ybWVkIHBy
b2dyYW0gd291bGQgc3RpbGwgaGF2ZSBhbgorICAgIC8vICAgIEVudHJ5U3dpdGNoIGJ1dCBub3cg
aXQgd291bGQgYmUgYXQgdGhlIGVuZCBvZiBhIHZlcnkgc2ltcGxlIHJvb3QgYmxvY2suCisgICAg
Ly8KKyAgICAvLyAoRCkgZmVlbHMgdG90YWxseSBwbGF1c2libGUuIEJlY2F1c2Ugd2UgdGhpbmsg
dGhhdCB0aGUgYmFkIGNhc2Ugd29uJ3QgaGFwcGVuLCB0aGlzIGFwcHJvYWNoCisgICAgLy8ganVz
dCBtZWFucyBsb3Npbmcgb25lIHJlZ2lzdGVyIGluIHRoZSBjb21tb24gY2FzZS4gVGhhdCdzIG5v
dCBiYWQhCisgICAgLy8KKyAgICAvLyBBIGNsb3NlIHNlY29uZCBpcyAoRSkuIEluIGZhY3QsIHRo
aXMgcGhhc2UgY291bGQgZXZlbiB0dXJuIEVudHJ5U3dpdGNoZXMgaW50byBQb2x5SnVtcHMKKyAg
ICAvLyB3aGVyZSB0aGUgbmV3IEVudHJ5U3dpdGNoIGJsb2NrIGp1bXBzIHRvIGJsb2NrcyB0aGF0
IGFzc2lnbiB0aGUganVtcCB0YXJnZXRzIHVzZWQgYnkgdGhlCisgICAgLy8gUG9seUp1bXBzLgor
ICAgIC8vCisgICAgLy8gVGhlbiBhZ2FpbiwgKEIpIGlzIHZlcnkgYXR0cmFjdGl2ZS4gTm9uZSBv
ZiBvdXIgcGxhbm5lZCB1c2VzIG9mIEVudHJ5U3dpdGNoIG9yIFBvbHlKdW1wCisgICAgLy8gd291
bGQgdmlvbGF0ZSB0aGlzIHJ1bGUuIEl0IG1heSBjb21lIHRvIHBhc3MgaW4gc29tZSBkaXN0YW50
IGZ1dHVyZSB0aGF0IHdlIGFjY2lkZW50YWxseSBwdXQKKyAgICAvLyBzb21ldGhpbmcgbm9uLWNs
b25lYWJsZSBpbiB0aGUgY29kZSBsZWFkaW5nIHVwIHRvIHRoZSBFbnRyeVN3aXRjaCwgYnV0IHRo
ZW4gd2Ugd2lsbCBjYXRjaAorICAgIC8vIHRoaXMgd2l0aCB2YWxpZGF0aW9uLiBXZSBjYW4gZXZl
biBtYWtlIHN1cmUgdGhhdCBCMyB0cmFuc2Zvcm1hdGlvbnMgdGhhdCB3b3VsZCBtYWtlCisgICAg
Ly8gbm9uLWNsb25lYWJsZSBjb2RlIG91dCBvZiBjbG9uZWFibGUgY29kZSBhcmUgYXZvaWRlZCBp
ZiB3ZSBrbm93IHRoYXQgdGhlIGNvZGUgaXMgYmFja3dhcmRzCisgICAgLy8gcmVhY2hhYmxlIGZy
b20gYW55IEVudHJ5U3dpdGNoLgorICAgIC8vCisgICAgLy8gTm9uZSBvZiB0aGVzZSBhcHByb2Fj
aGVzIGZlZWxzIHZlcnkgZ29vZCwgdGhvdWdoLiBUaGUgbm8tY2xvbmUgcmVzdHJpY3Rpb24gaXMg
c3RhcnRpbmcgdG8KKyAgICAvLyBmZWVsIHF1aXRlIHdyb25nLiBQZXJoYXBzIHRoZXJlIGlzIGEg
d2F5IHRvIGxpZnQgdGhlIG5vLWNsb25lIHJlc3RyaWN0aW9uPworICAgIAorICAgIC8vIE5vdyBk
dXBsaWNhdGUgdGhlbS4KKyAgICBSRUxFQVNFX0FTU0VSVCh3b3JrbGlzdC5zYXcoY29kZVswXSkp
OworICAgIAorICAgIGF1dG8gZml4RW50cnlTd2l0Y2ggPSBbJl0gKEJhc2ljQmxvY2sqIGJsb2Nr
LCB1bnNpZ25lZCBlbnRyeXBvaW50SW5kZXgpIHsKKyAgICAgICAgaWYgKGJsb2NrLT5sYXN0KCku
b3Bjb2RlICE9IEVudHJ5U3dpdGNoKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGcmVx
dWVudGVkQmxvY2sgdGFyZ2V0ID0gYmxvY2stPnN1Y2Nlc3NvcihlbnRyeXBvaW50SW5kZXgpOwor
ICAgICAgICBibG9jay0+bGFzdCgpLm9wY29kZSA9IEp1bXA7CisgICAgICAgIGJsb2NrLT5zdWNj
ZXNzb3JzKCkucmVzaXplKDEpOworICAgICAgICBibG9jay0+c3VjY2Vzc29yKDApID0gdGFyZ2V0
OworICAgIH07CisgICAgCisgICAgVmVjdG9yPEZyZXF1ZW5jeUNsYXNzPiBlbnRyeXBvaW50RnJl
cXVlbmNpZXMoY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKSwgRnJlcXVlbmN5Q2xhc3M6OlJh
cmUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7CisgICAgICAgIGlmIChi
bG9jay0+bGFzdCgpLm9wY29kZSAhPSBFbnRyeVN3aXRjaCkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGVudHJ5cG9pbnRJbmRleCA9IGNvZGUucHJvYy5udW1F
bnRyeXBvaW50cygpOyBlbnRyeXBvaW50SW5kZXgtLTspIHsKKyAgICAgICAgICAgIGVudHJ5cG9p
bnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdID0gbWF4RnJlcXVlbmN5KAorICAgICAgICAg
ICAgICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdLAorICAgICAgICAg
ICAgICAgIGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2ludEluZGV4KS5mcmVxdWVuY3koKSk7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50cnlw
b2ludHM7CisgICAgZW50cnlwb2ludHMuYXBwZW5kKEZyZXF1ZW50ZWRCbG9jayhjb2RlWzBdLCBl
bnRyeXBvaW50RnJlcXVlbmNpZXNbMF0pKTsKKyAgICBJbmRleE1hcDxCYXNpY0Jsb2NrLCBCYXNp
Y0Jsb2NrKj4gbWFwOworICAgIGZvciAodW5zaWduZWQgZW50cnlwb2ludEluZGV4ID0gMTsgZW50
cnlwb2ludEluZGV4IDwgY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKS4gKytlbnRyeXBvaW50
SW5kZXgpIHsKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayog
YmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKSB7CisgICAgICAgICAgICBCYXNp
Y0Jsb2NrKiBuZXdCbG9jayA9IGNvZGUuYWRkQmxvY2soYmxvY2stPmZyZXF1ZW5jeSgpKTsKKyAg
ICAgICAgICAgIG1hcFtibG9ja10gPSBuZXdCbG9jazsKKyAgICAgICAgfQorICAgICAgICBlbnRy
eXBvaW50cy5hcHBlbmQoRnJlcXVlbnRlZEJsb2NrKG1hcFtjb2RlWzBdXSwgZW50cnlwb2ludEZy
ZXF1ZW5jaWVzW2VudHJ5cG9pbnRJbmRleF0pKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IHdvcmtsaXN0LnNlZW4oKS52YWx1ZXMoY29kZSkpIHsKKyAgICAgICAgICAgIEJhc2lj
QmxvY2sqIG5ld0Jsb2NrID0gbWFwW2Jsb2NrXTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSW5z
dCYgaW5zdCA6ICpibG9jaykKKyAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChp
bnN0KTsKKyAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayomIHN1Y2Nlc3NvciA6IG5ld0Jsb2Nr
LT5zdWNjZXNzb3JCbG9ja3MoKSkKKyAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBtYXBbc3Vj
Y2Vzc29yXTsKKyAgICAgICAgICAgIGZpeEVudHJ5U3dpdGNoKG5ld0Jsb2NrLCBlbnRyeXBvaW50
SW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiB3
b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKQorICAgICAgICBmaXhFbnRyeVN3aXRjaChibG9j
aywgMCk7CisgICAgCisgICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZNb3ZlKGVudHJ5cG9pbnRz
KSk7CisgICAgY29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOworfQorCit9IH0gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCisjZW5kaWYgLy8g
QWlyTG93ZXJFbnRyeVN3aXRjaF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEFpckxvd2VyRW50cnlTd2l0Y2hfaAorI2RlZmluZSBBaXJMb3dl
ckVudHJ5U3dpdGNoX2gKKworI2lmIEVOQUJMRShCM19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ29kZTsKKworLy8gQ29udmVy
dHMgY29kZSB0aGF0IHNlZW1zIHRvIGhhdmUgb25lIGVudHJ5cG9pbnQgYW5kIGVtdWxhdGVzIG11
bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGgKKy8vIEVudHJ5U3dpdGNoIGludG8gY29kZSB0aGF0IHJl
YWxseSBoYXMgbXVsdGlwbGUgZW50cnlwb2ludHMuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGR1
cGxpY2F0aW5nCisvLyB0aGUgYmFja3dhcmRzIHRyYW5zaXRpdmUgY2xvc3VyZSBmcm9tIGFsbCBF
bnRyeVN3aXRjaGVzLgordm9pZCBsb3dlckVudHJ5U3dpdGNoKENvZGUmKTsKKworfSB9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKKworI2Vu
ZGlmIC8vIEFpckxvd2VyRW50cnlTd2l0Y2hfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHJldmlzaW9uIDIwMjc5NSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHdvcmtpbmcgY29w
eSkKQEAgLTg0OSw2ICs4NDksOCBAQCBSZXREb3VibGUgVTpGOjY0IC9yZXR1cm4KIAogT29wcyAv
dGVybWluYWwKIAorRW50cnlTd2l0Y2ggL3Rlcm1pbmFsCisKICMgQSBTaHVmZmxlIGlzIGEgbXVs
dGktc291cmNlLCBtdWx0aS1kZXN0aW5hdGlvbiBtb3ZlLiBJdCBzaW11bHRhbmVvdXNseSBkb2Vz
IG11bHRpcGxlIG1vdmVzIGF0IG9uY2UuCiAjIFRoZSBtb3ZlcyBhcmUgc3BlY2lmaWVkIGFzIHRy
aXBsZXRzIG9mIHNyYywgZHN0LCBhbmQgd2lkdGguIEZvciBleGFtcGxlIHlvdSBjYW4gcmVxdWVz
dCBhIHN3YXAgdGhpcwogIyB3YXk6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCShyZXZpc2lvbiAyMDI3OTUp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDcgKzgxLDEyIEBAIFZlY3RvcjxCYXNpY0Jsb2NrKj4g
YmxvY2tzSW5PcHRpbWl6ZWRPcmQKICAgICBTb3J0ZWRTdWNjZXNzb3JzIHNvcnRlZFN1Y2Nlc3Nv
cnM7CiAgICAgU29ydGVkU3VjY2Vzc29ycyBzb3J0ZWRTbG93U3VjY2Vzc29yczsKICAgICAKLSAg
ICBmYXN0V29ya2xpc3QucHVzaChjb2RlWzBdKTsKKyAgICAvLyBXZSBleHBlY3QgZW50cnlwb2lu
dCBsb3dlcmluZyB0byBoYXZlIGFscmVhZHkgaGFwcGVuZWQuCisgICAgUkVMRUFTRV9BU1NFUlQo
Y29kZS5udW1FbnRyeXBvaW50cygpKTsKKyAgICAKKyAgICAvLyBHbyBpbiByZXZlcnNlIG9yZGVy
IHNvIHRoYXQgdGhlIGZpcnN0IGVudHJ5cG9pbnQgZ2V0cyBwcmlvcml0eS4KKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSBjb2RlLm51bUVudHJ5cG9pbnRzKCk7IGktLTspCisgICAgICAgIGZhc3RXb3Jr
bGlzdC5wdXNoKGNvZGUuZW50cnlwb2ludChpKS5ibG9jaygpKTsKICAgICAKICAgICB3aGlsZSAo
QmFzaWNCbG9jayogYmxvY2sgPSBmYXN0V29ya2xpc3QucG9wKCkpIHsKICAgICAgICAgYmxvY2tz
SW5PcmRlci5hcHBlbmQoYmxvY2spOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJWYWxpZGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJWYWxpZGF0ZS5jcHAJKHJldmlzaW9uIDIwMjc5NSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTU0LDcgKzU0LDcg
QEAgcHVibGljOgogICAgICAgICBIYXNoU2V0PFN0YWNrU2xvdCo+IHZhbGlkU2xvdHM7CiAgICAg
ICAgIEhhc2hTZXQ8QmFzaWNCbG9jayo+IHZhbGlkQmxvY2tzOwogICAgICAgICBIYXNoU2V0PFNw
ZWNpYWwqPiB2YWxpZFNwZWNpYWxzOwotCisgICAgICAgIAogICAgICAgICBmb3IgKEJhc2ljQmxv
Y2sqIGJsb2NrIDogbV9jb2RlKQogICAgICAgICAgICAgdmFsaWRCbG9ja3MuYWRkKGJsb2NrKTsK
ICAgICAgICAgZm9yIChTdGFja1Nsb3QqIHNsb3QgOiBtX2NvZGUuc3RhY2tTbG90cygpKQpAQCAt
NjMsNiArNjMsMTAgQEAgcHVibGljOgogICAgICAgICAgICAgdmFsaWRTcGVjaWFscy5hZGQoc3Bl
Y2lhbCk7CiAKICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAg
ICAgICAgICAgLy8gQmxvY2tzIHRoYXQgYXJlIGVudHJ5cG9pbnRzIG11c3Qgbm90IGhhdmUgcHJl
ZGVjZXNzb3JzLgorICAgICAgICAgICAgaWYgKG1fY29kZS5pc0VudHJ5cG9pbnQoYmxvY2spKQor
ICAgICAgICAgICAgICAgIFZBTElEQVRFKCFibG9jay0+bnVtUHJlZGVjZXNzb3JzKCksICgiQXQg
ZW50cnlwb2ludCAiLCAqYmxvY2spKTsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJ
bmRleCkgewogICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4
KTsKICAgICAgICAgICAgICAgICBmb3IgKEFyZyYgYXJnIDogaW5zdC5hcmdzKSB7CkBAIC04OSw2
ICs5MywxNCBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURSgmYXJn
ID49ICZpbnN0LmFyZ3NbMF0sICgiQXQgIiwgYXJnLCAiIGluICIsIGluc3QsICIgaW4gIiwgKmJs
b2NrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURSgmYXJnIDw9ICZpbnN0LmFy
Z3MubGFzdCgpLCAoIkF0ICIsIGFyZywgIiBpbiAiLCBpbnN0LCAiIGluICIsICpibG9jaykpOwog
ICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBzd2l0Y2ggKGluc3Qub3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFbnRyeVN3aXRj
aDoKKyAgICAgICAgICAgICAgICAgICAgVkFMSURBVEUoYmxvY2stPm51bVN1Y2Nlc3NvcnMoKSA9
PSBtX2NvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCksICgiQXQgIiwgaW5zdCwgIiBpbiAiLCAq
YmxvY2spKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNzb3IgOiBibG9j
ay0+c3VjY2Vzc29yQmxvY2tzKCkpCiAgICAgICAgICAgICAgICAgVkFMSURBVEUodmFsaWRCbG9j
a3MuY29udGFpbnMoc3VjY2Vzc29yKSwgKCJJbiAiLCAqYmxvY2spKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>284081</attachid>
            <date>2016-07-19 20:06:20 -0700</date>
            <delta_ts>2016-07-19 22:12:35 -0700</delta_ts>
            <desc>rebased and improved</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>25091</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tVdGlscy5oCShy
ZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2Nr
VXRpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtODYsMTQgKzg2LDE4IEBAIHZvaWQgdXBkYXRlUHJl
ZGVjZXNzb3JzQWZ0ZXIoQmFzaWNCbG9jayoKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNC
bG9jaz4KLXZvaWQgcmVjb21wdXRlUHJlZGVjZXNzb3JzKFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8
QmFzaWNCbG9jaz4+JiBibG9ja3MpCit2b2lkIGNsZWFyUHJlZGVjZXNzb3JzKFZlY3RvcjxzdGQ6
OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCiB7Ci0gICAgLy8gQ2xlYXIgYWxsIHBy
ZWRlY2Vzc29yIGxpc3RzIGZpcnN0LgogICAgIGZvciAoYXV0byYgYmxvY2sgOiBibG9ja3MpIHsK
ICAgICAgICAgaWYgKGJsb2NrKQogICAgICAgICAgICAgYmxvY2stPnByZWRlY2Vzc29ycygpLnJl
c2l6ZSgwKTsKICAgICB9Cit9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljQmxvY2s+Cit2b2lk
IHJlY29tcHV0ZVByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+
PiYgYmxvY2tzKQoreworICAgIGNsZWFyUHJlZGVjZXNzb3JzKGJsb2Nrcyk7CiAgICAgdXBkYXRl
UHJlZGVjZXNzb3JzQWZ0ZXIoYmxvY2tzWzBdLmdldCgpKTsKIH0KIApJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5oCShyZXZpc2lvbiAyMDM0NDEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5oCSh3b3JraW5nIGNv
cHkpCkBAIC00Myw2ICs0MywxMyBAQCBlbnVtIGNsYXNzIEZyZXF1ZW5jeUNsYXNzIDogdWludDhf
dCB7CiAgICAgUmFyZQogfTsKIAoraW5saW5lIEZyZXF1ZW5jeUNsYXNzIG1heEZyZXF1ZW5jeShG
cmVxdWVuY3lDbGFzcyBhLCBGcmVxdWVuY3lDbGFzcyBiKQoreworICAgIGlmIChhID09IEZyZXF1
ZW5jeUNsYXNzOjpOb3JtYWwpCisgICAgICAgIHJldHVybiBGcmVxdWVuY3lDbGFzczo6Tm9ybWFs
OworICAgIHJldHVybiBiOworfQorCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKIAogbmFtZXNw
YWNlIFdURiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNw
cAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJU
b0Fpci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0NDUsNiArMjQ0NSwxMSBAQCBwcml2YXRlOgog
ICAgICAgICAgICAgYXBwZW5kKEFpcjo6T29wcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEIzOjpFbnRyeVN3aXRjaDogeworICAg
ICAgICAgICAgYXBwZW5kKEFpcjo6RW50cnlTd2l0Y2gpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
OTAsNiArMjkwLDkgQEAgdm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wYwog
ICAgIGNhc2UgU3dpdGNoOgogICAgICAgICBvdXQucHJpbnQoIlN3aXRjaCIpOwogICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBFbnRyeVN3aXRjaDoKKyAgICAgICAgb3V0LnByaW50KCJFbnRyeVN3
aXRjaCIpOworICAgICAgICByZXR1cm47CiAgICAgY2FzZSBSZXR1cm46CiAgICAgICAgIG91dC5w
cmludCgiUmV0dXJuIik7CiAgICAgICAgIHJldHVybjsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM09wY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM09wY29kZS5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNPcGNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMjE2LDYgKzIxNiwxMSBAQCBlbnVtIE9w
Y29kZSA6IGludDE2X3QgewogCiAgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJ
bnQzMiBvciBJbnQ2NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCiAgICAgU3dpdGNoLAor
ICAgIAorICAgIC8vIE11bHRpcGxlIGVudHJ5cG9pbnQgYXJlIHN1cHBvcnRlZCB2aWEgdGhlIEVu
dHJ5U3dpdGNoIG9wZXJhdGlvbi4gUGxhY2UgdGhpcyBpbiB0aGUgcm9vdAorICAgIC8vIGJsb2Nr
IGFuZCBsaXN0IHRoZSBlbnRyeXBvaW50cyBhcyB0aGUgc3VjY2Vzc29ycy4gQWxsIGJsb2NrcyBi
YWNrd2FyZHMtcmVhY2hhYmxlIGZyb20KKyAgICAvLyBFbnRyeVN3aXRjaCBhcmUgZHVwbGljYXRl
ZCBmb3IgZWFjaCBlbnRyeXBvaW50LgorICAgIEVudHJ5U3dpdGNoLAogCiAgICAgLy8gUmV0dXJu
LiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJldHVybiB0eXBlLCBz
byB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKICAgICAvLyB0eXBlLgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
ODAsNiArMjgwLDExIEBAIGJvb2wgUHJvY2VkdXJlOjppc0Zhc3RDb25zdGFudChjb25zdCBWYWwK
ICAgICByZXR1cm4gbV9mYXN0Q29uc3RhbnRzLmNvbnRhaW5zKGNvbnN0YW50KTsKIH0KIAorQ0Nh
bGxIZWxwZXJzOjpMYWJlbCBQcm9jZWR1cmU6OmVudHJ5cG9pbnRMYWJlbCh1bnNpZ25lZCBpbmRl
eCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jb2RlLmVudHJ5cG9pbnRMYWJlbChpbmRleCk7Cit9
CisKIHZvaWQqIFByb2NlZHVyZTo6YWRkRGF0YVNlY3Rpb24oc2l6ZV90IHNpemUpCiB7CiAgICAg
aWYgKCFzaXplKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgJKHJl
dmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiQjNTcGFyc2VDb2xs
ZWN0aW9uLmgiCiAjaW5jbHVkZSAiQjNUeXBlLmgiCiAjaW5jbHVkZSAiQjNWYWx1ZUtleS5oIgor
I2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlB1cmVOYU4uaCIKICNpbmNsdWRl
ICJSZWdpc3RlckF0T2Zmc2V0TGlzdC5oIgogI2luY2x1ZGUgPHd0Zi9CYWcuaD4KQEAgLTIwOSw2
ICsyMTAsMTIgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGRGYXN0Q29uc3RhbnQoY29uc3QgVmFs
dWVLZXkmKTsKICAgICBib29sIGlzRmFzdENvbnN0YW50KGNvbnN0IFZhbHVlS2V5Jik7CisgICAg
CisgICAgdW5zaWduZWQgbnVtRW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX251bUVudHJ5
cG9pbnRzOyB9CisgICAgdm9pZCBzZXROdW1FbnRyeXBvaW50cyh1bnNpZ25lZCBudW1FbnRyeXBv
aW50cykgeyBtX251bUVudHJ5cG9pbnRzID0gbnVtRW50cnlwb2ludHM7IH0KKyAgICAKKyAgICAv
LyBPbmx5IGNhbGwgdGhpcyBhZnRlciBjb2RlIGdlbmVyYXRpb24gaXMgY29tcGxldGUuCisgICAg
Q0NhbGxIZWxwZXJzOjpMYWJlbCBlbnRyeXBvaW50TGFiZWwodW5zaWduZWQgZW50cnlwb2ludElu
ZGV4KSBjb25zdDsKIAogICAgIC8vIFRoZSBuYW1lIGhhcyB0byBiZSBhIHN0cmluZyBsaXRlcmFs
LCBzaW5jZSB3ZSBkb24ndCBkbyBhbnkgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBzdHJpbmcu
CiAgICAgdm9pZCBzZXRMYXN0UGhhc2VOYW1lKGNvbnN0IGNoYXIqIG5hbWUpCkBAIC0yNjEsNiAr
MjY4LDcgQEAgcHJpdmF0ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBtX2NmZzsKICAgICBz
dGQ6OnVuaXF1ZV9wdHI8RG9taW5hdG9ycz4gbV9kb21pbmF0b3JzOwogICAgIEhhc2hTZXQ8VmFs
dWVLZXk+IG1fZmFzdENvbnN0YW50czsKKyAgICB1bnNpZ25lZCBtX251bUVudHJ5cG9pbnRzIHsg
MSB9OwogICAgIGNvbnN0IGNoYXIqIG1fbGFzdFBoYXNlTmFtZTsKICAgICBzdGQ6OnVuaXF1ZV9w
dHI8T3BhcXVlQnlwcm9kdWN0cz4gbV9ieXByb2R1Y3RzOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxB
aXI6OkNvZGU+IG1fY29kZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbGlk
YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWxpZGF0
ZS5jcHAJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Zh
bGlkYXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEzLDcgKzQxMywxMyBAQCBwdWJsaWM6CiAg
ICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGNhc2VWYWx1ZXMuc2l6ZSgp
OyArK2kpCiAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFKGNhc2VWYWx1ZXNbaSAtIDFdICE9
IGNhc2VWYWx1ZXNbaV0sICgiQXQgIiwgKnZhbHVlLCAiLCBjYXNlVmFsdWUgPSAiLCBjYXNlVmFs
dWVzW2ldKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CisgICAgICAgICAgICAgICAg
VkFMSURBVEUoIXZhbHVlLT5udW1DaGlsZHJlbigpLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAg
ICAgICAgICAgIFZBTElEQVRFKHZhbHVlLT50eXBlKCkgPT0gVk9pZCwgKCJBdCAiLCAqdmFsdWUp
KTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZU93bmVyLmdldCh2YWx1ZSktPm51bVN1
Y2Nlc3NvcnMoKSA9PSBtX3Byb2NlZHVyZS5udW1FbnRyeXBvaW50cygpKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgVkFMSURBVEUoISh2YWx1
ZS0+ZWZmZWN0cygpLndyaXRlcyAmJiB2YWx1ZS0+a2V5KCkpLCAoIkF0ICIsICp2YWx1ZSkpOwog
ICAgICAgICB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCShyZXZpc2lv
biAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTYxMiw2ICs2MTIsNyBAQCBFZmZlY3RzIFZhbHVlOjplZmZlY3RzKCkgY29u
c3QKICAgICBjYXNlIFN3aXRjaDoKICAgICBjYXNlIFJldHVybjoKICAgICBjYXNlIE9vcHM6Cisg
ICAgY2FzZSBFbnRyeVN3aXRjaDoKICAgICAgICAgcmVzdWx0LnRlcm1pbmFsID0gdHJ1ZTsKICAg
ICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNzc1LDYgKzc3Niw3IEBAIFR5cGUgVmFsdWU6OnR5cGVG
b3IoT3Bjb2RlIG9wY29kZSwgVmFsdWUKICAgICBjYXNlIEJyYW5jaDoKICAgICBjYXNlIFJldHVy
bjoKICAgICBjYXNlIE9vcHM6CisgICAgY2FzZSBFbnRyeVN3aXRjaDoKICAgICAgICAgcmV0dXJu
IFZvaWQ7CiAgICAgY2FzZSBTZWxlY3Q6CiAgICAgICAgIEFTU0VSVChzZWNvbmRDaGlsZCk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3OCw2
ICsyNzgsNyBAQCBwcml2YXRlOgogICAgICAgICBjYXNlIFBoaToKICAgICAgICAgY2FzZSBKdW1w
OgogICAgICAgICBjYXNlIE9vcHM6CisgICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CiAgICAgICAg
ICAgICBpZiAoVU5MSUtFTFkobnVtQXJncykpCiAgICAgICAgICAgICAgICAgYmFkT3Bjb2RlKG9w
Y29kZSwgbnVtQXJncyk7CiAgICAgICAgICAgICBicmVhazsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiAr
MzIsNyBAQAogI2luY2x1ZGUgIkIzQmFzaWNCbG9ja1V0aWxzLmgiCiAjaW5jbHVkZSAiQjNQcm9j
ZWR1cmUuaCIKICNpbmNsdWRlICJCM1N0YWNrU2xvdC5oIgorI2luY2x1ZGUgPHd0Zi9MaXN0RHVt
cC5oPgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CiAK
QEAgLTc5LDkgKzgwLDI3IEBAIENDYWxsU3BlY2lhbCogQ29kZTo6Y0NhbGxTcGVjaWFsKCkKICAg
ICByZXR1cm4gbV9jQ2FsbFNwZWNpYWw7CiB9CiAKK2Jvb2wgQ29kZTo6aXNFbnRyeXBvaW50KEJh
c2ljQmxvY2sqIGJsb2NrKSBjb25zdAoreworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuICFibG9jay0+aW5kZXgoKTsKKyAgICAKKyAgICBmb3IgKGNvbnN0
IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2ludCA6IG1fZW50cnlwb2ludHMpIHsKKyAgICAgICAg
aWYgKGVudHJ5cG9pbnQuYmxvY2soKSA9PSBibG9jaykKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgQ29kZTo6cmVzZXRSZWFjaGFi
aWxpdHkoKQogewotICAgIHJlY29tcHV0ZVByZWRlY2Vzc29ycyhtX2Jsb2Nrcyk7CisgICAgY2xl
YXJQcmVkZWNlc3NvcnMobV9ibG9ja3MpOworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHko
KSkKKyAgICAgICAgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIobV9ibG9ja3NbMF0uZ2V0KCkpOwor
ICAgIGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2lu
dCA6IG1fZW50cnlwb2ludHMpCisgICAgICAgICAgICB1cGRhdGVQcmVkZWNlc3NvcnNBZnRlcihl
bnRyeXBvaW50LmJsb2NrKCkpOworICAgIH0KICAgICAKICAgICBmb3IgKGF1dG8mIGJsb2NrIDog
bV9ibG9ja3MpIHsKICAgICAgICAgaWYgKGlzQmxvY2tEZWFkKGJsb2NrLmdldCgpKSkKQEAgLTkx
LDYgKzExMCw4IEBAIHZvaWQgQ29kZTo6cmVzZXRSZWFjaGFiaWxpdHkoKQogCiB2b2lkIENvZGU6
OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKIHsKKyAgICBpZiAoIW1fZW50cnlwb2ludHMu
aXNFbXB0eSgpKQorICAgICAgICBvdXQucHJpbnQoIkVudHJ5cG9pbnRzOiAiLCBsaXN0RHVtcCht
X2VudHJ5cG9pbnRzKSwgIlxuIik7CiAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6ICp0aGlz
KQogICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKICAgICBpZiAoc3RhY2tTbG90
cygpLnNpemUoKSkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2Rl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgJ
KHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29k
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiQWlyVG1wLmgi
CiAjaW5jbHVkZSAiQjNJbmRleE1hcC5oIgogI2luY2x1ZGUgIkIzU3BhcnNlQ29sbGVjdGlvbi5o
IgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlJlZ2lzdGVyQXRPZmZzZXRM
aXN0LmgiCiAjaW5jbHVkZSAiU3RhY2tBbGlnbm1lbnQuaCIKIApAQCAtMTE5LDYgKzEyMCwzMiBA
QCBwdWJsaWM6CiAgICAgICAgIG1fZnJhbWVTaXplID0gZnJhbWVTaXplOwogICAgIH0KIAorICAg
IC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcyBwcm9jKCkubnVtRW50
cnlwb2ludHMoKS4gVGhpcyB2YWx1ZSBoZXJlIG1heSBiZSB6ZXJvCisgICAgLy8gdW50aWwgd2Ug
bG93ZXIgRW50cnlTd2l0Y2guCisgICAgdW5zaWduZWQgbnVtRW50cnlwb2ludHMoKSBjb25zdCB7
IHJldHVybiBtX2VudHJ5cG9pbnRzLnNpemUoKTsgfQorICAgIGNvbnN0IFZlY3RvcjxGcmVxdWVu
dGVkQmxvY2s+IGVudHJ5cG9pbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbnRyeXBvaW50czsgfQor
ICAgIGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2ludCh1bnNpZ25lZCBpbmRleCkgY29u
c3QgeyByZXR1cm4gbV9lbnRyeXBvaW50c1tpbmRleF07IH0KKyAgICBib29sIGlzRW50cnlwb2lu
dChCYXNpY0Jsb2NrKikgY29uc3Q7CisgICAgCisgICAgLy8gVGhpcyBpcyBmb3IgdXNlIGJ5IGxv
d2VyRW50cnlTd2l0Y2goKS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3I+CisgICAgdm9p
ZCBzZXRFbnRyeXBvaW50cyhWZWN0b3ImJiB2ZWN0b3IpCisgICAgeworICAgICAgICBtX2VudHJ5
cG9pbnRzID0gc3RkOjpmb3J3YXJkPFZlY3Rvcj4odmVjdG9yKTsKKyAgICB9CisgICAgCisgICAg
Q0NhbGxIZWxwZXJzOjpMYWJlbCBlbnRyeXBvaW50TGFiZWwodW5zaWduZWQgaW5kZXgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9lbnRyeXBvaW50TGFiZWxzW2luZGV4XTsKKyAgICB9
CisgICAgCisgICAgLy8gVGhpcyBpcyBmb3IgdXNlIGJ5IGdlbmVyYXRlKCkuCisgICAgdGVtcGxh
dGU8dHlwZW5hbWUgVmVjdG9yPgorICAgIHZvaWQgc2V0RW50cnlwb2ludExhYmVscyhWZWN0b3Im
JiB2ZWN0b3IpCisgICAgeworICAgICAgICBtX2VudHJ5cG9pbnRMYWJlbHMgPSBzdGQ6OmZvcndh
cmQ8VmVjdG9yPih2ZWN0b3IpOworICAgIH0KKwogICAgIGNvbnN0IFJlZ2lzdGVyQXRPZmZzZXRM
aXN0JiBjYWxsZWVTYXZlUmVnaXN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9jYWxsZWVTYXZlUmVn
aXN0ZXJzOyB9CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QmIGNhbGxlZVNhdmVSZWdpc3RlcnMo
KSB7IHJldHVybiBtX2NhbGxlZVNhdmVSZWdpc3RlcnM7IH0KIApAQCAtMjM1LDYgKzI2Miw4IEBA
IHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9mcmFtZVNpemUgeyAwIH07CiAgICAgdW5zaWduZWQg
bV9jYWxsQXJnQXJlYVNpemUgeyAwIH07CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QgbV9jYWxs
ZWVTYXZlUmVnaXN0ZXJzOworICAgIFZlY3RvcjxGcmVxdWVudGVkQmxvY2s+IG1fZW50cnlwb2lu
dHM7IC8vIFRoaXMgaXMgZW1wdHkgdW50aWwgYWZ0ZXIgbG93ZXJFbnRyeVN3aXRjaCgpLgorICAg
IFZlY3RvcjxDQ2FsbEhlbHBlcnM6OkxhYmVsPiBtX2VudHJ5cG9pbnRMYWJlbHM7IC8vIFRoaXMg
aXMgZW1wdHkgdW50aWwgY29kZSBnZW5lcmF0aW9uLgogICAgIGNvbnN0IGNoYXIqIG1fbGFzdFBo
YXNlTmFtZTsKIH07CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ3Vz
dG9tLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDdXN0
b20uaAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJDdXN0b20uaAkod29ya2luZyBjb3B5KQpAQCAtMjIwLDYgKzIyMCw0NyBAQCBzdHJ1Y3QgU2h1
ZmZsZUN1c3RvbSB7CiAgICAgc3RhdGljIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0
JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKIH07CiAKK3N0cnVjdCBFbnRy
eVN3aXRjaEN1c3RvbSB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICBzdGF0aWMg
dm9pZCBmb3JFYWNoQXJnKEluc3QmLCBjb25zdCBGdW5jJikKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBzdGF0aWMgYm9vbCBpc1Zh
bGlkRm9ybVN0YXRpYyhBcmd1bWVudHMuLi4pCisgICAgeworICAgICAgICByZXR1cm4gIXNpemVv
Zi4uLihBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRm9y
bShJbnN0JiBpbnN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc3QuYXJncy5pc0VtcHR5KCk7
CisgICAgfQorICAgIAorICAgIHN0YXRpYyBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25l
ZCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgc3RhdGlj
IGJvb2wgaXNUZXJtaW5hbChJbnN0JikKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdOb25Db250cm9sRWZmZWN0cyhJbnN0
JikKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ0Nh
bGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0aW9u
Q29udGV4dCYpCisgICAgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVk
IGJlY2F1c2Ugd2Ugc2hvdWxkIGhhdmUgbG93ZXJlZCBFbnRyeVN3aXRjaCBiZWZvcmUKKyAgICAg
ICAgLy8gZ2VuZXJhdGlvbi4KKyAgICAgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7Cisg
ICAgICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6Okp1bXAoKTsKKyAgICB9Cit9OworCiB9IH0gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCiAKICNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJldmlz
aW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKICNpbmNsdWRlICJBaXJMb2dSZWdpc3RlclByZXNzdXJl
LmgiCiAjaW5jbHVkZSAiQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmgiCisjaW5jbHVkZSAiQWlyTG93
ZXJFbnRyeVN3aXRjaC5oIgogI2luY2x1ZGUgIkFpckxvd2VyTWFjcm9zLmgiCiAjaW5jbHVkZSAi
QWlyT3Bjb2RlVXRpbHMuaCIKICNpbmNsdWRlICJBaXJPcHRpbWl6ZUJsb2NrT3JkZXIuaCIKQEAg
LTEyNywxMCArMTI4LDYgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBjb2RlKQog
ICAgIC8vIHBoYXNlLgogICAgIHNpbXBsaWZ5Q0ZHKGNvZGUpOwogCi0gICAgLy8gVGhpcyBzb3J0
cyB0aGUgYmFzaWMgYmxvY2tzIGluIENvZGUgdG8gYWNoaWV2ZSBhbiBvcmRlcmluZyB0aGF0IG1h
eGltaXplcyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgaGlnaAotICAgIC8vIGZyZXF1ZW5jeSBzdWNj
ZXNzb3IgaXMgYWxzbyB0aGUgZmFsbC10aHJvdWdoIHRhcmdldC4KLSAgICBvcHRpbWl6ZUJsb2Nr
T3JkZXIoY29kZSk7Ci0KICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzYXRpc2Z5IGEgcmVxdWly
ZW1lbnQgb2YgQjM6OlN0YWNrbWFwVmFsdWUuCiAgICAgcmVwb3J0VXNlZFJlZ2lzdGVycyhjb2Rl
KTsKIApAQCAtMTM5LDYgKzEzNiwxNiBAQCB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKENvZGUm
IGNvZGUpCiAgICAgLy8gdXNlLiBXZSBfbXVzdF8gcnVuIHRoaXMgYWZ0ZXIgcmVwb3J0VXNlZFJl
Z2lzdGVycygpLCBzaW5jZSB0aGF0IGtpbGxzIHZhcmlhYmxlIGFzc2lnbm1lbnRzCiAgICAgLy8g
dGhhdCBzZWVtIGRlYWQuIEx1Y2tpbHksIHRoaXMgcGhhc2UgZG9lcyBub3QgY2hhbmdlIHJlZ2lz
dGVyIGxpdmVuZXNzLCBzbyB0aGF0J3MgT0suCiAgICAgZml4UGFydGlhbFJlZ2lzdGVyU3RhbGxz
KGNvZGUpOworICAgIAorICAgIC8vIEFjdHVhbGx5IGNyZWF0ZSBlbnRyeXBvaW50cy4KKyAgICBs
b3dlckVudHJ5U3dpdGNoKGNvZGUpOworICAgIAorICAgIC8vIFRoZSBjb250cm9sIGZsb3cgZ3Jh
cGggY2FuIGJlIHNpbXBsaWZpZWQgZnVydGhlciBhZnRlciB3ZSBoYXZlIGxvd2VyZWQgRW50cnlT
d2l0Y2guCisgICAgc2ltcGxpZnlDRkcoY29kZSk7CisKKyAgICAvLyBUaGlzIHNvcnRzIHRoZSBi
YXNpYyBibG9ja3MgaW4gQ29kZSB0byBhY2hpZXZlIGFuIG9yZGVyaW5nIHRoYXQgbWF4aW1pemVz
IHRoZSBsaWtlbGlob29kIHRoYXQgYSBoaWdoCisgICAgLy8gZnJlcXVlbmN5IHN1Y2Nlc3NvciBp
cyBhbHNvIHRoZSBmYWxsLXRocm91Z2ggdGFyZ2V0LgorICAgIG9wdGltaXplQmxvY2tPcmRlcihj
b2RlKTsKIAogICAgIGlmIChzaG91bGRWYWxpZGF0ZUlSKCkpCiAgICAgICAgIHZhbGlkYXRlKGNv
ZGUpOwpAQCAtMjY0LDYgKzI3MSwxMSBAQCB2b2lkIGdlbmVyYXRlKENvZGUmIGNvZGUsIENDYWxs
SGVscGVycyYgCiAgICAgCiAgICAgY29udGV4dC5jdXJyZW50QmxvY2sgPSBudWxscHRyOwogICAg
IGNvbnRleHQuaW5kZXhJbkJsb2NrID0gVUlOVF9NQVg7CisgICAgCisgICAgVmVjdG9yPENDYWxs
SGVscGVyczo6TGFiZWw+IGVudHJ5cG9pbnRMYWJlbHMoY29kZS5udW1FbnRyeXBvaW50cygpKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSBjb2RlLm51bUVudHJ5cG9pbnRzKCk7IGktLTspCisgICAg
ICAgIGVudHJ5cG9pbnRMYWJlbHNbaV0gPSAqY29udGV4dC5ibG9ja0xhYmVsc1tjb2RlLmVudHJ5
cG9pbnQoaSkuYmxvY2soKV07CisgICAgY29kZS5zZXRFbnRyeXBvaW50TGFiZWxzKFdURk1vdmUo
ZW50cnlwb2ludExhYmVscykpOwogCiAgICAgcGNUb09yaWdpbk1hcC5hcHBlbmRJdGVtKGppdC5s
YWJlbCgpLCBPcmlnaW4oKSk7CiAgICAgLy8gRklYTUU6IE1ha2UgbGF0ZSBwYXRocyBoYXZlIE9y
aWdpbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTM2ODkKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5
U3dpdGNoLmNwcAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpckxvd2VyRW50cnlTd2l0Y2guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTExIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJMb3dlckVudHJ5U3dpdGNoLmgiCisKKyNpZiBFTkFC
TEUoQjNfSklUKQorCisjaW5jbHVkZSAiQWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpclBoYXNlU2Nv
cGUuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgewor
Cit2b2lkIGxvd2VyRW50cnlTd2l0Y2goQ29kZSYgY29kZSkKK3sKKyAgICBQaGFzZVNjb3BlIHBo
YXNlU2NvcGUoY29kZSwgImxvd2VyRW50cnlTd2l0Y2giKTsKKyAgICAKKyAgICAvLyBGaWd1cmUg
b3V0IHRoZSBzZXQgb2YgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGR1cGxpY2F0ZWQuCisgICAgR3Jh
cGhOb2RlV29ya2xpc3Qgd29ya2xpc3Q7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNv
ZGUpIHsKKyAgICAgICAgaWYgKGJsb2NrLT5sYXN0KCkub3Bjb2RlID09IEVudHJ5U3dpdGNoKQor
ICAgICAgICAgICAgd29ya2xpc3QucHVzaChibG9jayk7CisgICAgfQorICAgIAorICAgIC8vIEl0
J3MgcG9zc2libGUgdGhhdCB3ZSBkb24ndCBoYXZlIGFueSBFbnRyeVN3aXRjaGVzLiBUaGF0J3Mg
ZmluZS4KKyAgICBpZiAod29ya2xpc3Quc2VlbigpLmlzRW1wdHkoKSkgeworICAgICAgICBWZWN0
b3I8RnJlcXVlbnRlZEJsb2NrPiBlbnRyeXBvaW50cyhjb2RlLnByb2MoKS5udW1FbnRyeXBvaW50
cygpLCBGcmVxdWVudGVkQmxvY2soY29kZVswXSkpOworICAgICAgICBjb2RlLnNldEVudHJ5cG9p
bnRzKFdURk1vdmUoZW50cnlwb2ludHMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAK
KyAgICB3aGlsZSAoQmFzaWNCbG9jayogYmxvY2sgPSB3b3JrbGlzdC5wb3AoKSkKKyAgICAgICAg
d29ya2xpc3QucHVzaEFsbChibG9jay0+cHJlZGVjZXNzb3JzKCkpOworICAgIAorICAgIFJFTEVB
U0VfQVNTRVJUKHdvcmtsaXN0LnNhdyhjb2RlWzBdKSk7CisgICAgCisgICAgVmVjdG9yPEZyZXF1
ZW5jeUNsYXNzPiBlbnRyeXBvaW50RnJlcXVlbmNpZXMoY29kZS5wcm9jKCkubnVtRW50cnlwb2lu
dHMoKSwgRnJlcXVlbmN5Q2xhc3M6OlJhcmUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBjb2RlKSB7CisgICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSAhPSBFbnRyeVN3aXRj
aCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGVudHJ5cG9p
bnRJbmRleCA9IGNvZGUucHJvYy5udW1FbnRyeXBvaW50cygpOyBlbnRyeXBvaW50SW5kZXgtLTsp
IHsKKyAgICAgICAgICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdID0g
bWF4RnJlcXVlbmN5KAorICAgICAgICAgICAgICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRy
eXBvaW50SW5kZXhdLAorICAgICAgICAgICAgICAgIGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2lu
dEluZGV4KS5mcmVxdWVuY3koKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXV0byBm
aXhFbnRyeVN3aXRjaCA9IFsmXSAoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIGVudHJ5cG9p
bnRJbmRleCkgeworICAgICAgICBpZiAoYmxvY2stPmxhc3QoKS5vcGNvZGUgIT0gRW50cnlTd2l0
Y2gpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayB0YXJnZXQg
PSBibG9jay0+c3VjY2Vzc29yKGVudHJ5cG9pbnRJbmRleCk7CisgICAgICAgIGJsb2NrLT5sYXN0
KCkub3Bjb2RlID0gSnVtcDsKKyAgICAgICAgYmxvY2stPnN1Y2Nlc3NvcnMoKS5yZXNpemUoMSk7
CisgICAgICAgIGJsb2NrLT5zdWNjZXNzb3IoMCkgPSB0YXJnZXQ7CisgICAgfTsKKyAgICAKKyAg
ICAvLyBOb3cgZHVwbGljYXRlIHRoZW0uCisgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50
cnlwb2ludHM7CisgICAgZW50cnlwb2ludHMuYXBwZW5kKEZyZXF1ZW50ZWRCbG9jayhjb2RlWzBd
LCBlbnRyeXBvaW50RnJlcXVlbmNpZXNbMF0pKTsKKyAgICBJbmRleE1hcDxCYXNpY0Jsb2NrLCBC
YXNpY0Jsb2NrKj4gbWFwOworICAgIGZvciAodW5zaWduZWQgZW50cnlwb2ludEluZGV4ID0gMTsg
ZW50cnlwb2ludEluZGV4IDwgY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKS4gKytlbnRyeXBv
aW50SW5kZXgpIHsKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIGZvciAoQmFzaWNCbG9j
ayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKSB7CisgICAgICAgICAgICBC
YXNpY0Jsb2NrKiBuZXdCbG9jayA9IGNvZGUuYWRkQmxvY2soYmxvY2stPmZyZXF1ZW5jeSgpKTsK
KyAgICAgICAgICAgIG1hcFtibG9ja10gPSBuZXdCbG9jazsKKyAgICAgICAgfQorICAgICAgICBl
bnRyeXBvaW50cy5hcHBlbmQoRnJlcXVlbnRlZEJsb2NrKG1hcFtjb2RlWzBdXSwgZW50cnlwb2lu
dEZyZXF1ZW5jaWVzW2VudHJ5cG9pbnRJbmRleF0pKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2Nr
KiBibG9jayA6IHdvcmtsaXN0LnNlZW4oKS52YWx1ZXMoY29kZSkpIHsKKyAgICAgICAgICAgIEJh
c2ljQmxvY2sqIG5ld0Jsb2NrID0gbWFwW2Jsb2NrXTsKKyAgICAgICAgICAgIGZvciAoY29uc3Qg
SW5zdCYgaW5zdCA6ICpibG9jaykKKyAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5z
dChpbnN0KTsKKyAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayomIHN1Y2Nlc3NvciA6IG5ld0Js
b2NrLT5zdWNjZXNzb3JCbG9ja3MoKSkKKyAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBtYXBb
c3VjY2Vzc29yXTsKKyAgICAgICAgICAgIGZpeEVudHJ5U3dpdGNoKG5ld0Jsb2NrLCBlbnRyeXBv
aW50SW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKQorICAgICAgICBmaXhFbnRyeVN3aXRjaChi
bG9jaywgMCk7CisgICAgCisgICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZNb3ZlKGVudHJ5cG9p
bnRzKSk7CisgICAgY29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOworfQorCit9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCisjZW5kaWYg
Ly8gQWlyTG93ZXJFbnRyeVN3aXRjaF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCShub25leGlzdGVudCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKyNkZWZpbmUgQWly
TG93ZXJFbnRyeVN3aXRjaF9oCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCituYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKKy8vIENv
bnZlcnRzIGNvZGUgdGhhdCBzZWVtcyB0byBoYXZlIG9uZSBlbnRyeXBvaW50IGFuZCBlbXVsYXRl
cyBtdWx0aXBsZSBlbnRyeXBvaW50cyB3aXRoCisvLyBFbnRyeVN3aXRjaCBpbnRvIGNvZGUgdGhh
dCByZWFsbHkgaGFzIG11bHRpcGxlIGVudHJ5cG9pbnRzLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBi
eSBkdXBsaWNhdGluZworLy8gdGhlIGJhY2t3YXJkcyB0cmFuc2l0aXZlIGNsb3N1cmUgZnJvbSBh
bGwgRW50cnlTd2l0Y2hlcy4KK3ZvaWQgbG93ZXJFbnRyeVN3aXRjaChDb2RlJik7CisKK30gfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCisK
KyNlbmRpZiAvLyBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCShyZXZpc2lvbiAyMDM0NDEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCSh3b3JraW5n
IGNvcHkpCkBAIC04NDksNiArODQ5LDEwIEBAIFJldERvdWJsZSBVOkY6NjQgL3JldHVybgogCiBP
b3BzIC90ZXJtaW5hbAogCisjIFRoaXMgaXMgYSB0ZXJtaW5hbCBidXQgd2UgZXhwcmVzcyBpdCBh
cyBhIEN1c3RvbSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXQgdG8gaGF2ZSBhIGNvZGUKKyMgZ2Vu
ZXJhdG9yLgorY3VzdG9tIEVudHJ5U3dpdGNoCisKICMgQSBTaHVmZmxlIGlzIGEgbXVsdGktc291
cmNlLCBtdWx0aS1kZXN0aW5hdGlvbiBtb3ZlLiBJdCBzaW11bHRhbmVvdXNseSBkb2VzIG11bHRp
cGxlIG1vdmVzIGF0IG9uY2UuCiAjIFRoZSBtb3ZlcyBhcmUgc3BlY2lmaWVkIGFzIHRyaXBsZXRz
IG9mIHNyYywgZHN0LCBhbmQgd2lkdGguIEZvciBleGFtcGxlIHlvdSBjYW4gcmVxdWVzdCBhIHN3
YXAgdGhpcwogIyB3YXk6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9w
dGltaXplQmxvY2tPcmRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTgxLDE2ICs4MSwyOCBAQCBWZWN0b3I8QmFzaWNCbG9jayo+IGJsb2Nr
c0luT3B0aW1pemVkT3JkCiAgICAgU29ydGVkU3VjY2Vzc29ycyBzb3J0ZWRTdWNjZXNzb3JzOwog
ICAgIFNvcnRlZFN1Y2Nlc3NvcnMgc29ydGVkU2xvd1N1Y2Nlc3NvcnM7CiAgICAgCi0gICAgZmFz
dFdvcmtsaXN0LnB1c2goY29kZVswXSk7CisgICAgLy8gV2UgZXhwZWN0IGVudHJ5cG9pbnQgbG93
ZXJpbmcgdG8gaGF2ZSBhbHJlYWR5IGhhcHBlbmVkLgorICAgIFJFTEVBU0VfQVNTRVJUKGNvZGUu
bnVtRW50cnlwb2ludHMoKSk7CisKKyAgICBhdXRvIGFwcGVuZFN1Y2Nlc3NvciA9IFsmXSAoY29u
c3QgRnJlcXVlbnRlZEJsb2NrJiBibG9jaykgeworICAgICAgICBpZiAoYmxvY2suaXNSYXJlKCkp
CisgICAgICAgICAgICBzb3J0ZWRTbG93U3VjY2Vzc29ycy5hcHBlbmQoYmxvY2suYmxvY2soKSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvcnRlZFN1Y2Nlc3NvcnMuYXBwZW5kKGJsb2Nr
LmJsb2NrKCkpOworICAgIH07CisgICAgCisgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBm
aXJzdCBlbnRyeXBvaW50LCB3ZSBwdXNoIHRoZW0gaW4gb3JkZXIgb2YgZnJlcXVlbmN5IGFuZCBm
cmVxdWVuY3kKKyAgICAvLyBjbGFzcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgY29k
ZS5udW1FbnRyeXBvaW50cygpOyArK2kpCisgICAgICAgIGFwcGVuZFN1Y2Nlc3Nvcihjb2RlLmVu
dHJ5cG9pbnQoaSkpOworICAgIAorICAgIC8vIEFsd2F5cyBwdXNoIHRoZSBwcmltYXJ5IHN1Y2Nl
c3NvciBsYXN0IHNvIHRoYXQgaXQgZ2V0cyBoaWdoZXN0IHByaW9yaXR5LgorICAgIGZhc3RXb3Jr
bGlzdC5wdXNoKGNvZGUuZW50cnlwb2ludCgwKS5ibG9jaygpKTsKICAgICAKICAgICB3aGlsZSAo
QmFzaWNCbG9jayogYmxvY2sgPSBmYXN0V29ya2xpc3QucG9wKCkpIHsKICAgICAgICAgYmxvY2tz
SW5PcmRlci5hcHBlbmQoYmxvY2spOwotICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYgc3Vj
Y2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgewotICAgICAgICAgICAgaWYgKHN1Y2Nlc3Nv
ci5pc1JhcmUoKSkKLSAgICAgICAgICAgICAgICBzb3J0ZWRTbG93U3VjY2Vzc29ycy5hcHBlbmQo
c3VjY2Vzc29yLmJsb2NrKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNv
cnRlZFN1Y2Nlc3NvcnMuYXBwZW5kKHN1Y2Nlc3Nvci5ibG9jaygpKTsKLSAgICAgICAgfQorICAg
ICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMo
KSkKKyAgICAgICAgICAgIGFwcGVuZFN1Y2Nlc3NvcihzdWNjZXNzb3IpOwogICAgICAgICBzb3J0
ZWRTdWNjZXNzb3JzLnByb2Nlc3MoZmFzdFdvcmtsaXN0KTsKICAgICB9CiAKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUuY3BwCShyZXZpc2lvbiAyMDM0
NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTQsNyArNTQsNyBAQCBwdWJsaWM6CiAgICAgICAgIEhhc2hTZXQ8U3Rh
Y2tTbG90Kj4gdmFsaWRTbG90czsKICAgICAgICAgSGFzaFNldDxCYXNpY0Jsb2NrKj4gdmFsaWRC
bG9ja3M7CiAgICAgICAgIEhhc2hTZXQ8U3BlY2lhbCo+IHZhbGlkU3BlY2lhbHM7Ci0KKyAgICAg
ICAgCiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpCiAgICAgICAgICAg
ICB2YWxpZEJsb2Nrcy5hZGQoYmxvY2spOwogICAgICAgICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6
IG1fY29kZS5zdGFja1Nsb3RzKCkpCkBAIC02Myw2ICs2MywxMCBAQCBwdWJsaWM6CiAgICAgICAg
ICAgICB2YWxpZFNwZWNpYWxzLmFkZChzcGVjaWFsKTsKIAogICAgICAgICBmb3IgKEJhc2ljQmxv
Y2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICAvLyBCbG9ja3MgdGhhdCBhcmUgZW50
cnlwb2ludHMgbXVzdCBub3QgaGF2ZSBwcmVkZWNlc3NvcnMuCisgICAgICAgICAgICBpZiAobV9j
b2RlLmlzRW50cnlwb2ludChibG9jaykpCisgICAgICAgICAgICAgICAgVkFMSURBVEUoIWJsb2Nr
LT5udW1QcmVkZWNlc3NvcnMoKSwgKCJBdCBlbnRyeXBvaW50ICIsICpibG9jaykpOworICAgICAg
ICAgICAgCiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRl
eCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7CiAgICAgICAgICAgICAgICAgSW5zdCYg
aW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwogICAgICAgICAgICAgICAgIGZvciAoQXJnJiBh
cmcgOiBpbnN0LmFyZ3MpIHsKQEAgLTg5LDYgKzkzLDE0IEBAIHB1YmxpYzoKICAgICAgICAgICAg
ICAgICAgICAgICAgIFZBTElEQVRFKCZhcmcgPj0gJmluc3QuYXJnc1swXSwgKCJBdCAiLCBhcmcs
ICIgaW4gIiwgaW5zdCwgIiBpbiAiLCAqYmxvY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAg
IFZBTElEQVRFKCZhcmcgPD0gJmluc3QuYXJncy5sYXN0KCksICgiQXQgIiwgYXJnLCAiIGluICIs
IGluc3QsICIgaW4gIiwgKmJsb2NrKSk7CiAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5vcGNvZGUpIHsKKyAgICAg
ICAgICAgICAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAgICAgICAgICAgICAgICAgICBWQUxJREFU
RShibG9jay0+bnVtU3VjY2Vzc29ycygpID09IG1fY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMo
KSwgKCJBdCAiLCBpbnN0LCAiIGluICIsICpibG9jaykpOworICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JCbG9ja3MoKSkKICAgICAgICAg
ICAgICAgICBWQUxJREFURSh2YWxpZEJsb2Nrcy5jb250YWlucyhzdWNjZXNzb3IpLCAoIkluICIs
ICpibG9jaykpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>284084</attachid>
            <date>2016-07-19 22:12:35 -0700</date>
            <delta_ts>2016-07-20 13:29:32 -0700</delta_ts>
            <desc>it&apos;s starting to work!</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>51580</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAzNDQyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBA
QAorMjAxNi0wNy0xOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAg
IEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgdGVhY2hlcyBCMyBo
b3cgdG8gY29tcGlsZSBwcm9jZWR1cmVzIHdpdGggbXVsdGlwbGUgZW50cnlwb2ludHMgaW4gdGhl
IGJlc3Qgd2F5IGV2ZXIuCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBvaW50cyBh
cmUgdXNlZnVsLiBXZSBjb3VsZCB1c2UgdGhlbSB0byByZWR1Y2UgdGhlIGNvc3Qgb2YgY29tcGls
aW5nIE9TUgorICAgICAgICBlbnRyeXBvaW50cy4gV2UgY291bGQgdXNlIHRoZW0gdG8gaW1wbGVt
ZW50IGJldHRlciB0cnkvY2F0Y2guCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBv
aW50cyBhcmUgaGFyZCB0byBzdXBwb3J0LiBBbGwgb2YgYSBzdWRkZW4sIGFsbCBvZiB0aGUgY29k
ZSB0aGF0IGFzc3VtZWQKKyAgICAgICAgdGhhdCB0aGUgcm9vdCBibG9jayBpcyB0aGUgZW50cnlw
b2ludCB3b3VsZCBoYXZlIHRvIGJlIGNoYW5nZWQuIFRyYW5zZm9ybWF0aW9ucyBsaWtlCisgICAg
ICAgIG1vdmVDb25zdGFudHMoKSB3b3VsZCBoYXZlIHRvIGRvIGNyYXp5IHRoaW5ncyBpZiB0aGUg
ZXhpc3RlbmNlIG9mIG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIHByZXZlbnRlZCBpdCBm
cm9tIGZpbmRpbmcgYSBzaW5nbGUgY29tbW9uIGRvbWluYXRvci4KKyAgICAgICAgCisgICAgICAg
IFRoZXJlZm9yZSwgd2Ugd2FudCB0byBhZGQgbXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aG91dCBh
Y3R1YWxseSB0ZWFjaGluZyB0aGUgY29tcGlsZXIgdGhhdAorICAgICAgICB0aGVyZSBpcyBzdWNo
IGEgdGhpbmcuIFRoYXQncyBzb3J0IG9mIHdoYXQgdGhpcyBjaGFuZ2UgZG9lcy4KKyAgICAgICAg
CisgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBvcGNvZGUgdG8gYm90aCBCMyBhbmQgQWlyIGNhbGxl
ZCBFbnRyeVN3aXRjaC4gSXQncyBhIHRlcm1pbmFsIHRoYXQgdGFrZXMKKyAgICAgICAgb25lIG9y
IG1vcmUgc3VjY2Vzc29ycyBhbmQgbm8gdmFsdWUgY2hpbGRyZW4uIFRoZSBudW1iZXIgb2Ygc3Vj
Y2Vzc29ycyBtdXN0IG1hdGNoCisgICAgICAgIFByb2NlZHVyZTo6bnVtRW50cnlwb2ludHMoKSwg
d2hpY2ggY291bGQgYmUgYXJiaXRyYXJpbHkgbGFyZ2UuIFRoZSBzZW1hbnRpY3Mgb2YgRW50cnlT
d2l0Y2gKKyAgICAgICAgYXJlOgorICAgICAgICAKKyAgICAgICAgLSBFYWNoIG9mIHRoZSBlbnRy
eXBvaW50cyBzZXRzIGEgaGlkZGVuIEVudHJ5IHZhcmlhYmxlIHRvIHRoYXQgZW50cnlwb2ludCdz
IGluZGV4IGFuZCBqdW1wcworICAgICAgICAgIHRvIHRoZSBwcm9jZWR1cmUncyByb290IGJsb2Nr
LgorICAgICAgICAKKyAgICAgICAgLSBBbiBFbnRyeVN3aXRjaCBpcyBhIHN3aXRjaCBzdGF0ZW1l
bnQgb3ZlciB0aGlzIGhpZGRlbiBFbnRyeSB2YXJpYWJsZS4KKyAgICAgICAgCisgICAgICAgIFRo
ZSB3YXkgdGhhdCB3ZSBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyBpcyB0aGF0IEFpciBoYXMgYSB2
ZXJ5IGxhdGUgcGhhc2UgLSBhZnRlciBhbGwKKyAgICAgICAgcmVnaXN0ZXIgYW5kIHN0YWNrIGxh
eW91dCAtIHRoYXQgY2xvbmVzIGFsbCBjb2RlIHdoZXJlIHRoZSBFbnRyeSB2YXJpYWJsZSBpcyBs
aXZlOyBpLmUgYWxsCisgICAgICAgIGNvZGUgaW4gdGhlIGNsb3N1cmUgb3ZlciBwcmVkZWNlc3Nv
cnMgb2YgYWxsIGJsb2NrcyB0aGF0IGRvIEVudHJ5U3dpdGNoLgorICAgICAgICAKKyAgICAgICAg
VXN1YWxseSwgeW91IHdvdWxkIHVzZSB0aGlzIGJ5IGNyZWF0aW5nIGFuIEVudHJ5U3dpdGNoIGlu
IHRoZSByb290IGJsb2NrLCBidXQgeW91IGRvbid0CisgICAgICAgIGhhdmUgdG8gZG8gdGhhdC4g
SnVzdCByZW1lbWJlciB0aGF0IHRoZSBjb2RlIGJlZm9yZSBFbnRyeVN3aXRjaCBnZXRzIGNsb25l
ZCBmb3IgZWFjaAorICAgICAgICBlbnRyeXBvaW50LiBXZSBhbGxvdyBjbG9uaW5nIG9mIGFuIGFy
Yml0cmFyaWx5IGxhcmdlIGFtb3VudCBvZiBjb2RlIGJlY2F1c2UgcmVzdHJpY3RpbmcgaXQsCisg
ICAgICAgIGFuZCBzbyByZXN0cmljaW5nIHRoZSBwbGFjZW1lbnQgb2YgRW50cnlTd2l0Y2hlcywg
d291bGQgYmUgdW5lbGVnYW50LiBJdCB3b3VsZCBiZSBoYXJkIHRvCisgICAgICAgIHByZXNlcnZl
IHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGxvd2Vy
IGFueSB2YWx1ZSBiZWZvcmUgYW4KKyAgICAgICAgRW50cnlTd2l0Y2ggdG8gYSBjb250cm9sIGZs
b3cgZGlhbW9uZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZ2l2ZXMgdXMgYW4gZWFz
eS10by11c2Ugd2F5IHRvIHVzZSBCMyB0byBjb21waWxlIGNvZGUgd2l0aCBtdWx0aXBsZSBlbnRy
eXBvaW50cy4KKyAgICAgICAgSW5zaWRlIHRoZSBjb21waWxlciwgb25seSBjb2RlIHRoYXQgcnVu
cyB2ZXJ5IGxhdGUgaW4gQWlyIGhhcyB0byBrbm93IGFib3V0IHRoaXMgZmVhdHVyZS4KKyAgICAg
ICAgV2UgZ2V0IHRoZSBiZXN0IG9mIGJvdGggd29ybGRzIQorCisgICAgICAgICogQ01ha2VMaXN0
cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ajoKKyAgICAgICAgKiBiMy9CM0Jhc2ljQmxvY2tVdGlscy5oOgorICAgICAgICAoSlNDOjpCMzo6
dXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIpOgorICAgICAgICAoSlNDOjpCMzo6Y2xlYXJQcmVkZWNl
c3NvcnMpOgorICAgICAgICAoSlNDOjpCMzo6cmVjb21wdXRlUHJlZGVjZXNzb3JzKToKKyAgICAg
ICAgKiBiMy9CM0ZyZXF1ZW5jeUNsYXNzLmg6CisgICAgICAgIChKU0M6OkIzOjptYXhGcmVxdWVu
Y3kpOgorICAgICAgICAqIGIzL0IzR2VuZXJhdGUuaDoKKyAgICAgICAgKiBiMy9CM0xvd2VyVG9B
aXIuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMb3dlclRvQWlyOjpsb3dlcik6CisgICAg
ICAgICogYjMvQjNNb3ZlQ29uc3RhbnRzLmNwcDoKKyAgICAgICAgKiBiMy9CM09wY29kZS5jcHA6
CisgICAgICAgIChXVEY6OnByaW50SW50ZXJuYWwpOgorICAgICAgICAqIGIzL0IzT3Bjb2RlLmg6
CisgICAgICAgICogYjMvQjNQcm9jZWR1cmUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6UHJvY2Vk
dXJlOjppc0Zhc3RDb25zdGFudCk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmVudHJ5
cG9pbnRMYWJlbCk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmFkZERhdGFTZWN0aW9u
KToKKyAgICAgICAgKiBiMy9CM1Byb2NlZHVyZS5oOgorICAgICAgICAoSlNDOjpCMzo6UHJvY2Vk
dXJlOjpudW1FbnRyeXBvaW50cyk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OnNldE51
bUVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6c2V0TGFzdFBoYXNl
TmFtZSk6CisgICAgICAgICogYjMvQjNWYWxpZGF0ZS5jcHA6CisgICAgICAgICogYjMvQjNWYWx1
ZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpWYWx1ZTo6ZWZmZWN0cyk6CisgICAgICAgIChKU0M6
OkIzOjpWYWx1ZTo6dHlwZUZvcik6CisgICAgICAgICogYjMvQjNWYWx1ZS5oOgorICAgICAgICAq
IGIzL2Fpci9BaXJDb2RlLmNwcDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6Y0NhbGxT
cGVjaWFsKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6aXNFbnRyeXBvaW50KToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6cmVzZXRSZWFjaGFiaWxpdHkpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjpDb2RlOjpkdW1wKToKKyAgICAgICAgKiBiMy9haXIvQWlyQ29kZS5oOgor
ICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpzZXRGcmFtZVNpemUpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpDb2RlOjpudW1FbnRyeXBvaW50cyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6
OkNvZGU6OmVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlw
b2ludCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNvZGU6OnNldEVudHJ5cG9pbnRzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlwb2ludExhYmVsKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6Q29kZTo6c2V0RW50cnlwb2ludExhYmVscyk6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6OkNvZGU6OmNhbGxlZVNhdmVSZWdpc3RlcnMpOgorICAgICAgICAqIGIzL2Fpci9BaXJD
dXN0b20uaDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6UGF0Y2hDdXN0b206OmlzVGVybWluYWwp
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpQYXRjaEN1c3RvbTo6aGFzTm9uQXJnRWZmZWN0cyk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpoYXNOb25BcmdOb25Db250cm9s
RWZmZWN0cyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpnZW5lcmF0ZSk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNvbW1vbkN1c3RvbUJhc2U6Omhhc05vbkFyZ0VmZmVj
dHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDQ2FsbEN1c3RvbTo6Zm9yRWFjaEFyZyk6Cisg
ICAgICAgIChKU0M6OkIzOjpBaXI6OkNvbGRDQ2FsbEN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OlNodWZmbGVDdXN0b206OmZvckVhY2hBcmcpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjpFbnRyeVN3aXRjaEN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAgICAgIChK
U0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1ZhbGlkRm9ybVN0YXRpYyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1ZhbGlkRm9ybSk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjphZG1pdHNTdGFjayk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1Rlcm1pbmFsKToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xF
ZmZlY3RzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206OmdlbmVy
YXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlyR2VuZXJhdGUuY3BwOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpwcmVwYXJlRm9yR2VuZXJhdGlvbik6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Omdl
bmVyYXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA6IEFkZGVk
LgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpsb3dlckVudHJ5U3dpdGNoKToKKyAgICAgICAgKiBi
My9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oOiBBZGRlZC4KKyAgICAgICAgKiBiMy9haXIvQWly
T3Bjb2RlLm9wY29kZXM6CisgICAgICAgICogYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5j
cHA6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OmJsb2Nrc0luT3B0aW1pemVkT3JkZXIpOgorICAg
ICAgICAqIGIzL2Fpci9BaXJTcGVjaWFsLmNwcDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6U3Bl
Y2lhbDo6aXNUZXJtaW5hbCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlNwZWNpYWw6Omhhc05v
bkFyZ0VmZmVjdHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpTcGVjaWFsOjpoYXNOb25BcmdO
b25Db250cm9sRWZmZWN0cyk6CisgICAgICAgICogYjMvYWlyL0FpclNwZWNpYWwuaDoKKyAgICAg
ICAgKiBiMy9haXIvQWlyVmFsaWRhdGUuY3BwOgorICAgICAgICAqIGIzL2Fpci9vcGNvZGVfZ2Vu
ZXJhdG9yLnJiOgorICAgICAgICAqIGIzL3Rlc3RiMy5jcHA6CisgICAgICAgIChKU0M6OkIzOjpj
b21waWxlKToKKyAgICAgICAgKEpTQzo6QjM6Omludm9rZSk6CisgICAgICAgIChKU0M6OkIzOjpj
b21waWxlQW5kUnVuKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RSZXNldFJlYWNoYWJpbGl0eURh
bmdsaW5nUmVmZXJlbmNlKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RFbnRyeVN3aXRjaFNpbXBs
ZSk6CisgICAgICAgIChKU0M6OkIzOjp6ZXJvKToKKyAgICAgICAgKEpTQzo6QjM6Om5lZ2F0aXZl
WmVybyk6CisgICAgICAgIChKU0M6OkIzOjpydW4pOgorCiAyMDE2LTA3LTE5ICBGaWxpcCBQaXps
byAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAgVGhlIGRlZmF1bHQgdGVzdGluZyBtb2Rl
IHNob3VsZCBub3QgaW52b2x2ZSBkaXNhYmxpbmcgdGhlIEZUTCBKSVQKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODksNiArODksNyBA
QCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5jcHAKICAgICBiMy9haXIvQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAK
ICAgICBiMy9haXIvQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmNwcAorICAgIGIzL2Fpci9BaXJMb3dl
ckVudHJ5U3dpdGNoLmNwcAogICAgIGIzL2Fpci9BaXJMb3dlck1hY3Jvcy5jcHAKICAgICBiMy9h
aXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcAogICAgIGIzL2Fpci9BaXJQaGFzZVNjb3BlLmNw
cApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDIwMzQ0MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC02OTgsNiArNjk4LDggQEAKIAkJMEZEQjJDRUExNzQ4
OTZDNzAwN0IzQzFCIC8qIENvbmN1cnJlbnRKSVRMb2NrLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRCMkNFOTE3NDg5NkM3MDA3QjNDMUIgLyogQ29u
Y3VycmVudEpJVExvY2suaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRkREQkZCNTE2NjZFRUQ4MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NE
YXRhRHVtcC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRkREQkZCMjE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5j
cHAgKi87IH07CiAJCTBGRERCRkI2MTY2NkVFREEwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vz
c0RhdGFEdW1wLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRkREQkZCMzE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5o
ICovOyB9OworCQkwRkRGNzA4NTFEM0YyQzIyMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRj
aC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRG
NzA4MzFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAgKi87IH07CisJ
CTBGREY3MDg2MUQzRjJDMjUwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRGNzA4NDFEM0YyQzFG
MDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5oICovOyB9OwogCQkwRkUwNTAxNDFBQTkw
OTExMDBEMzNCMzMgLyogQXJndW1lbnRzTW9kZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZFMDUwMEMxQUE5MDkxMTAwRDMzQjMzIC8qIEFyZ3VtZW50
c01vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9Owog
CQkwRkUwNTAxNTFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRTA1MDBEMUFB
OTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwICovOyB9OwogCQkwRkUw
NTAxNjFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkUwNTAwRTFBQTkwOTExMDBE
MzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTI4OTYsNiArMjg5OCw4IEBACiAJCTBGREIyQ0U5
MTc0ODk2QzcwMDdCM0MxQiAvKiBDb25jdXJyZW50SklUTG9jay5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBDb25jdXJyZW50SklUTG9jay5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkwRkREQkZCMjE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NE
YXRhRHVtcC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBERkdWYXJp
YWJsZUFjY2Vzc0RhdGFEdW1wLmNwcDsgcGF0aCA9IGRmZy9ERkdWYXJpYWJsZUFjY2Vzc0RhdGFE
dW1wLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZEREJGQjMxNjY2RUVENTAw
QzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oOyBwYXRoID0gZGZnL0RG
R1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEZERjcwODMxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA7
IHBhdGggPSBiMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTBGREY3MDg0MUQzRjJDMUYwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dp
dGNoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckxvd2VyRW50cnlTd2l0
Y2guaDsgcGF0aCA9IGIzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTBGRTA1MDBDMUFBOTA5MTEwMEQzM0IzMyAvKiBBcmd1bWVudHNNb2Rl
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFyZ3VtZW50c01vZGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZFMDUwMEQxQUE5MDkxMTAwRDMzQjMzIC8qIERp
cmVjdEFyZ3VtZW50c09mZnNldC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkwRkUwNTAwRTFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERpcmVjdEFyZ3VtZW50c09mZnNldC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDg5Myw2ICs0ODk3LDggQEAKIAkJCQkw
RkUzNEMxODFDNEIzOUFFMDAwM0E1MTIgLyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oICovLAog
CQkJCTBGNjE4MzI1MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlckFmdGVyUmVnQWxsb2MuY3Bw
ICovLAogCQkJCTBGNjE4MzI2MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlckFmdGVyUmVnQWxs
b2MuaCAqLywKKwkJCQkwRkRGNzA4MzFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3
aXRjaC5jcHAgKi8sCisJCQkJMEZERjcwODQxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50
cnlTd2l0Y2guaCAqLywKIAkJCQkwRjYxODMyNzFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJN
YWNyb3MuY3BwICovLAogCQkJCTBGNjE4MzI4MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlck1h
Y3Jvcy5oICovLAogCQkJCTI2NDA5MUZBMUJFMkZENDEwMDY4NERCMiAvKiBBaXJPcGNvZGUub3Bj
b2RlcyAqLywKQEAgLTgwNjUsNiArODA3MSw3IEBACiAJCQkJQkMxOEM0NjMwRTE2RjVDRDAwQjM0
NDYwIC8qIFNvdXJjZVByb3ZpZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlFNDlEQzE2QzEyRUYy
OTRFMDAxODRBMUYgLyogU291cmNlUHJvdmlkZXJDYWNoZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
RTQ5REMxNkQxMkVGMjk1MzAwMTg0QTFGIC8qIFNvdXJjZVByb3ZpZGVyQ2FjaGVJdGVtLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRkRGNzA4NjFEM0YyQzI1MDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRy
eVN3aXRjaC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCN0YzOUUxNUVEOEU0NjAwRjE2N0IyIC8q
IFNwYXJzZUFycmF5VmFsdWVNYXAuaCBpbiBIZWFkZXJzICovLAogCQkJCUE3Mzg2NTU0MTE4Njk3
QjQwMDU0MDI3OSAvKiBTcGVjaWFsaXplZFRodW5rSklULmggaW4gSGVhZGVycyAqLywKIAkJCQkw
RjU1NDFCMjE2MTNDMUZCMDBDRTNFMjUgLyogU3BlY2lhbFBvaW50ZXIuaCBpbiBIZWFkZXJzICov
LApAQCAtOTM3MCw2ICs5Mzc3LDcgQEAKIAkJCQkwRjI0RTU1MDE3RUUyNzQ5MDBBQkIyMTcgLyog
UmVwYXRjaC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjZCOEFEODFDNEVEREEyMDA5NjkwNTIg
LyogQjNEdXBsaWNhdGVUYWlscy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1Mjc3NzNERTFBQUY4
M0FDMDBCREU3RTggLyogUnVudGltZVR5cGUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEZERjcw
ODUxRDNGMkMyMjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJMEY3NzAwOTIxNDAyRkYzQzAwNzhFQjM5IC8qIFNhbXBsaW5nQ291bnRlci5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk3OTA1QkI2ODFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNj
ZXNzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRTA1MDI3MUFBOTA5NTYwMEQzM0IzMyAvKiBT
Y29wZWRBcmd1bWVudHMuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrVXRpbHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrVXRpbHMuaAkocmV2aXNpb24gMjAzNDQxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja1V0aWxzLmgJKHdvcmtpbmcgY29weSkK
QEAgLTg2LDE0ICs4NiwxOCBAQCB2b2lkIHVwZGF0ZVByZWRlY2Vzc29yc0FmdGVyKEJhc2ljQmxv
Y2sqCiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljQmxvY2s+Ci12b2lkIHJlY29tcHV0ZVBy
ZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiYgYmxvY2tzKQor
dm9pZCBjbGVhclByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2ljQmxvY2s+
PiYgYmxvY2tzKQogewotICAgIC8vIENsZWFyIGFsbCBwcmVkZWNlc3NvciBsaXN0cyBmaXJzdC4K
ICAgICBmb3IgKGF1dG8mIGJsb2NrIDogYmxvY2tzKSB7CiAgICAgICAgIGlmIChibG9jaykKICAg
ICAgICAgICAgIGJsb2NrLT5wcmVkZWNlc3NvcnMoKS5yZXNpemUoMCk7CiAgICAgfQorfQogCit0
ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgordm9pZCByZWNvbXB1dGVQcmVkZWNlc3NvcnMo
VmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4mIGJsb2NrcykKK3sKKyAgICBjbGVh
clByZWRlY2Vzc29ycyhibG9ja3MpOwogICAgIHVwZGF0ZVByZWRlY2Vzc29yc0FmdGVyKGJsb2Nr
c1swXS5nZXQoKSk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0ZyZXF1
ZW5jeUNsYXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzRnJl
cXVlbmN5Q2xhc3MuaAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAkod29ya2luZyBjb3B5KQpAQCAtNDMsNiArNDMsMTMgQEAg
ZW51bSBjbGFzcyBGcmVxdWVuY3lDbGFzcyA6IHVpbnQ4X3QgewogICAgIFJhcmUKIH07CiAKK2lu
bGluZSBGcmVxdWVuY3lDbGFzcyBtYXhGcmVxdWVuY3koRnJlcXVlbmN5Q2xhc3MgYSwgRnJlcXVl
bmN5Q2xhc3MgYikKK3sKKyAgICBpZiAoYSA9PSBGcmVxdWVuY3lDbGFzczo6Tm9ybWFsKQorICAg
ICAgICByZXR1cm4gRnJlcXVlbmN5Q2xhc3M6Ok5vcm1hbDsKKyAgICByZXR1cm4gYjsKK30KKwog
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCiAKIG5hbWVzcGFjZSBXVEYgewpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzR2VuZXJhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNHZW5lcmF0ZS5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM5LDEyICszOSwx
MiBAQCBuYW1lc3BhY2UgQWlyIHsgY2xhc3MgQ29kZTsgfQogCiAvLyBUaGlzIHRha2VzIGEgQjM6
OlByb2NlZHVyZSwgb3B0aW1pemVzIGl0IGluLXBsYWNlLCBsb3dlcnMgaXQgdG8gQWlyLCBhbmQg
cHJlcGFyZXMgdGhlIEFpciBmb3IKIC8vIGdlbmVyYXRpb24uCi12b2lkIHByZXBhcmVGb3JHZW5l
cmF0aW9uKFByb2NlZHVyZSYsIHVuc2lnbmVkIG9wdExldmVsID0gMSk7CitKU19FWFBPUlRfUFJJ
VkFURSB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKFByb2NlZHVyZSYsIHVuc2lnbmVkIG9wdExl
dmVsID0gMSk7CiAKIC8vIFRoaXMgdGFrZXMgYSBCMzo6UHJvY2VkdXJlIHRoYXQgaGFzIGJlZW4g
cHJlcGFyZWQgZm9yIGdlbmVyYXRpb24gKGkuZS4gaXQgaGFzIGJlZW4gbG93ZXJlZCB0byBBaXIg
YW5kCiAvLyB0aGUgQWlyIGhhcyBiZWVuIHByZXBhcmVkIGZvciBnZW5lcmF0aW9uKSBhbmQgZ2Vu
ZXJhdGVzIGl0LiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIGNhbGxpbmcKIC8vIEFpcjo6Z2Vu
ZXJhdGUoKSBvbiB0aGUgUHJvY2VkdXJlOjpjb2RlKCkuCi12b2lkIGdlbmVyYXRlKFByb2NlZHVy
ZSYsIENDYWxsSGVscGVycyYpOworSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBnZW5lcmF0ZShQcm9j
ZWR1cmUmLCBDQ2FsbEhlbHBlcnMmKTsKIAogLy8gVGhpcyB0YWtlcyBhIEIzOjpQcm9jZWR1cmUs
IG9wdGltaXplcyBpdCBpbi1wbGFjZSwgYW5kIGxvd2VycyBpdCB0byBBaXIuIFlvdSBjYW4gdGhl
biBnZW5lcmF0ZQogLy8gdGhlIEFpciB0byBtYWNoaW5lIGNvZGUgdXNpbmcgQWlyOjpwcmVwYXJl
Rm9yR2VuZXJhdGlvbigpIGFuZCBBaXI6OmdlbmVyYXRlKCkgb24gdGhlIFByb2NlZHVyZSdzCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNwcAkocmV2aXNpb24g
MjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJUb0Fpci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI0NDUsNiArMjQ0NSwxMSBAQCBwcml2YXRlOgogICAgICAgICAgICAg
YXBwZW5kKEFpcjo6T29wcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICBjYXNlIEIzOjpFbnRyeVN3aXRjaDogeworICAgICAgICAgICAgYXBw
ZW5kKEFpcjo6RW50cnlTd2l0Y2gpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAK
ICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTW92ZUNvbnN0YW50cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzTW92ZUNvbnN0YW50cy5jcHAJKHJldmlzaW9uIDIwMzQ0MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01vdmVDb25zdGFudHMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYzoKICAgICAgICAgCiAgICAgICAgIGhvaXN0Q29u
c3RhbnRzKAogICAgICAgICAgICAgWyZdIChjb25zdCBWYWx1ZUtleSYga2V5KSAtPiBib29sIHsK
LSAgICAgICAgICAgICAgICByZXR1cm4ga2V5Lm9wY29kZSgpID09IENvbnN0MzIgfHwga2V5Lm9w
Y29kZSgpID09IENvbnN0NjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5vcGNvZGUoKSA9
PSBDb25zdDMyIHx8IGtleS5vcGNvZGUoKSA9PSBDb25zdDY0IHx8IGtleS5vcGNvZGUoKSA9PSBB
cmd1bWVudFJlZzsKICAgICAgICAgICAgIH0pOwogICAgIH0KIApJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTAsNiArMjkwLDkg
QEAgdm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wYwogICAgIGNhc2UgU3dp
dGNoOgogICAgICAgICBvdXQucHJpbnQoIlN3aXRjaCIpOwogICAgICAgICByZXR1cm47CisgICAg
Y2FzZSBFbnRyeVN3aXRjaDoKKyAgICAgICAgb3V0LnByaW50KCJFbnRyeVN3aXRjaCIpOworICAg
ICAgICByZXR1cm47CiAgICAgY2FzZSBSZXR1cm46CiAgICAgICAgIG91dC5wcmludCgiUmV0dXJu
Iik7CiAgICAgICAgIHJldHVybjsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09w
Y29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5o
CShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMjE2LDYgKzIxNiwxMSBAQCBlbnVtIE9wY29kZSA6IGludDE2
X3QgewogCiAgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQzMiBvciBJbnQ2
NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCiAgICAgU3dpdGNoLAorICAgIAorICAgIC8v
IE11bHRpcGxlIGVudHJ5cG9pbnQgYXJlIHN1cHBvcnRlZCB2aWEgdGhlIEVudHJ5U3dpdGNoIG9w
ZXJhdGlvbi4gUGxhY2UgdGhpcyBpbiB0aGUgcm9vdAorICAgIC8vIGJsb2NrIGFuZCBsaXN0IHRo
ZSBlbnRyeXBvaW50cyBhcyB0aGUgc3VjY2Vzc29ycy4gQWxsIGJsb2NrcyBiYWNrd2FyZHMtcmVh
Y2hhYmxlIGZyb20KKyAgICAvLyBFbnRyeVN3aXRjaCBhcmUgZHVwbGljYXRlZCBmb3IgZWFjaCBl
bnRyeXBvaW50LgorICAgIEVudHJ5U3dpdGNoLAogCiAgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQg
QjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBq
dXN0IHJldHVybiBhbnkKICAgICAvLyB0eXBlLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yODAsNiArMjgwLDEx
IEBAIGJvb2wgUHJvY2VkdXJlOjppc0Zhc3RDb25zdGFudChjb25zdCBWYWwKICAgICByZXR1cm4g
bV9mYXN0Q29uc3RhbnRzLmNvbnRhaW5zKGNvbnN0YW50KTsKIH0KIAorQ0NhbGxIZWxwZXJzOjpM
YWJlbCBQcm9jZWR1cmU6OmVudHJ5cG9pbnRMYWJlbCh1bnNpZ25lZCBpbmRleCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9jb2RlLT5lbnRyeXBvaW50TGFiZWwoaW5kZXgpOworfQorCiB2b2lkKiBQ
cm9jZWR1cmU6OmFkZERhdGFTZWN0aW9uKHNpemVfdCBzaXplKQogewogICAgIGlmICghc2l6ZSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAyMDM0
NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkod29ya2luZyBj
b3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkIzU3BhcnNlQ29sbGVjdGlvbi5oIgog
I2luY2x1ZGUgIkIzVHlwZS5oIgogI2luY2x1ZGUgIkIzVmFsdWVLZXkuaCIKKyNpbmNsdWRlICJD
Q2FsbEhlbHBlcnMuaCIKICNpbmNsdWRlICJQdXJlTmFOLmgiCiAjaW5jbHVkZSAiUmVnaXN0ZXJB
dE9mZnNldExpc3QuaCIKICNpbmNsdWRlIDx3dGYvQmFnLmg+CkBAIC01Nyw2ICs1OCwxMyBAQCBj
bGFzcyBWYXJpYWJsZTsKIAogbmFtZXNwYWNlIEFpciB7IGNsYXNzIENvZGU7IH0KIAorLy8gVGhp
cyByZXByZXNlbnRzIEIzJ3MgdmlldyBvZiBhIHBpZWNlIG9mIGNvZGUuIE5vdGUgdGhhdCB0aGlz
IG9iamVjdCBtdXN0IGV4aXN0IGluIGEgMToxCisvLyByZWxhdGlvbnNoaXAgd2l0aCBBaXI6OkNv
ZGUuIEIzOjpQcm9jZWR1cmUgYW5kIEFpcjo6Q29kZSBhcmUganVzdCBkaWZmZXJlbnQgZmFjYWRl
cyBvZiB0aGUgQjMKKy8vIGNvbXBpbGVyJ3Mga25vd2xlZGdlIGFib3V0IGEgcGllY2Ugb2YgY29k
ZS4gU29tZSBraW5kcyBvZiBzdGF0ZSBhcmVuJ3QgcGVyZmVjdCBmaXRzIGZvciBlaXRoZXIKKy8v
IFByb2NlZHVyZSBvciBDb2RlLCBhbmQgYXJlIHBsYWNlZCBpbiBvbmUgb3IgdGhlIG90aGVyIGJh
c2VkIG9uIGNvbnZlbmllbmNlLiBQcm9jZWR1cmUgYWx3YXlzCisvLyBhbGxvY2F0ZXMgYSBDb2Rl
LCBhbmQgYSBDb2RlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dCBhbiBvd25pbmcgUHJvY2Vk
dXJlIGFuZCB0aGV5IGFsd2F5cworLy8gaGF2ZSByZWZlcmVuY2VzIHRvIGVhY2ggb3RoZXIuCisK
IGNsYXNzIFByb2NlZHVyZSB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsK
ICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKQEAgLTIwOSw2ICsyMTcsMTQgQEAgcHVibGlj
OgogCiAgICAgdm9pZCBhZGRGYXN0Q29uc3RhbnQoY29uc3QgVmFsdWVLZXkmKTsKICAgICBib29s
IGlzRmFzdENvbnN0YW50KGNvbnN0IFZhbHVlS2V5Jik7CisgICAgCisgICAgdW5zaWduZWQgbnVt
RW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX251bUVudHJ5cG9pbnRzOyB9CisgICAgdm9p
ZCBzZXROdW1FbnRyeXBvaW50cyh1bnNpZ25lZCBudW1FbnRyeXBvaW50cykgeyBtX251bUVudHJ5
cG9pbnRzID0gbnVtRW50cnlwb2ludHM7IH0KKyAgICAKKyAgICAvLyBPbmx5IGNhbGwgdGhpcyBh
ZnRlciBjb2RlIGdlbmVyYXRpb24gaXMgY29tcGxldGUuIE5vdGUgdGhhdCB0aGUgbGFiZWwgZm9y
IHRoZSAwdGggZW50cnlwb2ludAorICAgIC8vIHNob3VsZCBwb2ludCB0byBleGFjdGx5IHdoZXJl
IHRoZSBjb2RlIGdlbmVyYXRpb24gY3Vyc29yIHdhcyBiZWZvcmUgeW91IHN0YXJ0ZWQgZ2VuZXJh
dGluZworICAgIC8vIGNvZGUuCisgICAgSlNfRVhQT1JUX1BSSVZBVEUgQ0NhbGxIZWxwZXJzOjpM
YWJlbCBlbnRyeXBvaW50TGFiZWwodW5zaWduZWQgZW50cnlwb2ludEluZGV4KSBjb25zdDsKIAog
ICAgIC8vIFRoZSBuYW1lIGhhcyB0byBiZSBhIHN0cmluZyBsaXRlcmFsLCBzaW5jZSB3ZSBkb24n
dCBkbyBhbnkgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBzdHJpbmcuCiAgICAgdm9pZCBzZXRM
YXN0UGhhc2VOYW1lKGNvbnN0IGNoYXIqIG5hbWUpCkBAIC0yNjEsNiArMjc3LDcgQEAgcHJpdmF0
ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBtX2NmZzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8
RG9taW5hdG9ycz4gbV9kb21pbmF0b3JzOwogICAgIEhhc2hTZXQ8VmFsdWVLZXk+IG1fZmFzdENv
bnN0YW50czsKKyAgICB1bnNpZ25lZCBtX251bUVudHJ5cG9pbnRzIHsgMSB9OwogICAgIGNvbnN0
IGNoYXIqIG1fbGFzdFBoYXNlTmFtZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8T3BhcXVlQnlwcm9k
dWN0cz4gbV9ieXByb2R1Y3RzOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxBaXI6OkNvZGU+IG1fY29k
ZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWxpZGF0ZS5jcHAJKHJldmlzaW9u
IDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDEzLDcgKzQxMywxMyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGNhc2VWYWx1ZXMuc2l6ZSgpOyArK2kpCiAgICAgICAg
ICAgICAgICAgICAgIFZBTElEQVRFKGNhc2VWYWx1ZXNbaSAtIDFdICE9IGNhc2VWYWx1ZXNbaV0s
ICgiQXQgIiwgKnZhbHVlLCAiLCBjYXNlVmFsdWUgPSAiLCBjYXNlVmFsdWVzW2ldKSk7CiAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CisgICAgICAgICAgICAgICAgVkFMSURBVEUoIXZhbHVl
LT5udW1DaGlsZHJlbigpLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAgICAgICAgICAgIFZBTElE
QVRFKHZhbHVlLT50eXBlKCkgPT0gVm9pZCwgKCJBdCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAg
ICAgICBWQUxJREFURSh2YWx1ZU93bmVyLmdldCh2YWx1ZSktPm51bVN1Y2Nlc3NvcnMoKSA9PSBt
X3Byb2NlZHVyZS5udW1FbnRyeXBvaW50cygpLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBWQUxJREFURSghKHZh
bHVlLT5lZmZlY3RzKCkud3JpdGVzICYmIHZhbHVlLT5rZXkoKSksICgiQXQgIiwgKnZhbHVlKSk7
CiAgICAgICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAJKHJldmlz
aW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNjEyLDYgKzYxMiw3IEBAIEVmZmVjdHMgVmFsdWU6OmVmZmVjdHMoKSBj
b25zdAogICAgIGNhc2UgU3dpdGNoOgogICAgIGNhc2UgUmV0dXJuOgogICAgIGNhc2UgT29wczoK
KyAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICByZXN1bHQudGVybWluYWwgPSB0cnVlOwog
ICAgICAgICBicmVhazsKICAgICB9CkBAIC03NzUsNiArNzc2LDcgQEAgVHlwZSBWYWx1ZTo6dHlw
ZUZvcihPcGNvZGUgb3Bjb2RlLCBWYWx1ZQogICAgIGNhc2UgQnJhbmNoOgogICAgIGNhc2UgUmV0
dXJuOgogICAgIGNhc2UgT29wczoKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICByZXR1
cm4gVm9pZDsKICAgICBjYXNlIFNlbGVjdDoKICAgICAgICAgQVNTRVJUKHNlY29uZENoaWxkKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMjAzNDQxKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjc4
LDYgKzI3OCw3IEBAIHByaXZhdGU6CiAgICAgICAgIGNhc2UgUGhpOgogICAgICAgICBjYXNlIEp1
bXA6CiAgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgY2FzZSBFbnRyeVN3aXRjaDoKICAgICAg
ICAgICAgIGlmIChVTkxJS0VMWShudW1BcmdzKSkKICAgICAgICAgICAgICAgICBiYWRPcGNvZGUo
b3Bjb2RlLCBudW1BcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL3Rlc3RiMy5jcHAJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy90ZXN0YjMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5j
bHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKICNpbmNsdWRlICJCM0NvbnN0UHRyVmFsdWUuaCIKICNp
bmNsdWRlICJCM0VmZmVjdHMuaCIKKyNpbmNsdWRlICJCM0dlbmVyYXRlLmgiCiAjaW5jbHVkZSAi
QjNNYXRoRXh0cmFzLmgiCiAjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgogI2luY2x1ZGUgIkIz
UHJvY2VkdXJlLmgiCkBAIC0xMDIsMTMgKzEwMywxOSBAQCBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGls
YXRpb24+IGNvbXBpbGUoUHJvCiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4u
IEFyZ3VtZW50cz4KLVQgaW52b2tlKGNvbnN0IENvbXBpbGF0aW9uJiBjb2RlLCBBcmd1bWVudHMu
Li4gYXJndW1lbnRzKQorVCBpbnZva2UoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHB0ciwgQXJndW1l
bnRzLi4uIGFyZ3VtZW50cykKIHsKLSAgICBUICgqZnVuY3Rpb24pKEFyZ3VtZW50cy4uLikgPSBi
aXR3aXNlX2Nhc3Q8VCgqKShBcmd1bWVudHMuLi4pPihjb2RlLmNvZGUoKS5leGVjdXRhYmxlQWRk
cmVzcygpKTsKKyAgICBUICgqZnVuY3Rpb24pKEFyZ3VtZW50cy4uLikgPSBiaXR3aXNlX2Nhc3Q8
VCgqKShBcmd1bWVudHMuLi4pPihwdHIuZXhlY3V0YWJsZUFkZHJlc3MoKSk7CiAgICAgcmV0dXJu
IGZ1bmN0aW9uKGFyZ3VtZW50cy4uLik7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVu
YW1lLi4uIEFyZ3VtZW50cz4KK1QgaW52b2tlKGNvbnN0IENvbXBpbGF0aW9uJiBjb2RlLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIHJldHVybiBpbnZva2U8VD4oY29kZS5jb2RlKCks
IGFyZ3VtZW50cy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFy
Z3VtZW50cz4KIFQgY29tcGlsZUFuZFJ1bihQcm9jZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRz
Li4uIGFyZ3VtZW50cykKIHsKICAgICByZXR1cm4gaW52b2tlPFQ+KCpjb21waWxlKHByb2NlZHVy
ZSksIGFyZ3VtZW50cy4uLik7CkBAIC0xMjM3Nyw2ICsxMjM4NCw2MSBAQCB2b2lkIHRlc3RSZXNl
dFJlYWNoYWJpbGl0eURhbmdsaW5nUmVmZXJlCiAgICAgdmFsaWRhdGUocHJvYyk7CiB9CiAKK3Zv
aWQgdGVzdEVudHJ5U3dpdGNoU2ltcGxlKCkKK3sKKyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBw
cm9jLnNldE51bUVudHJ5cG9pbnRzKDMpOworICAgIAorICAgIEJhc2ljQmxvY2sqIHJvb3QgPSBw
cm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogb25lID0gcHJvYy5hZGRCbG9jaygpOwor
ICAgIEJhc2ljQmxvY2sqIHR3byA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0
aHJlZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICAKKyAgICByb290LT5hcHBlbmROZXc8VmFsdWU+
KHByb2MsIEVudHJ5U3dpdGNoLCBPcmlnaW4oKSk7CisgICAgcm9vdC0+YXBwZW5kU3VjY2Vzc29y
KEZyZXF1ZW50ZWRCbG9jayhvbmUpKTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVl
bnRlZEJsb2NrKHR3bykpOworICAgIHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxv
Y2sodGhyZWUpKTsKKyAgICAKKyAgICBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgIHBy
b2MsIFJldHVybiwgT3JpZ2luKCksCisgICAgICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAg
ICAgICAgICAgIHByb2MsIEFkZCwgT3JpZ2luKCksCisgICAgICAgICAgICBvbmUtPmFwcGVuZE5l
dzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIw
KSwKKyAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9y
aWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSk7CisgICAgCisgICAgdHdvLT5hcHBlbmRO
ZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBSZXR1cm4sIE9yaWdpbigpLAorICAgICAgICB0d28t
PmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBTdWIsIE9yaWdpbigpLAorICAg
ICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCks
IEdQUkluZm86OmFyZ3VtZW50R1BSMCksCisgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxBcmd1
bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpOwor
ICAgIAorICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBSZXR1cm4s
IE9yaWdpbigpLAorICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAg
IHByb2MsIE11bCwgT3JpZ2luKCksCisgICAgICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PEFyZ3Vt
ZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApLAorICAg
ICAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4o
KSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpOworICAgIAorICAgIHByZXBhcmVGb3JHZW5lcmF0
aW9uKHByb2MpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQodm0pOworICAgIGdlbmVyYXRl
KHByb2MsIGppdCk7CisgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2bSwgaml0LCBudWxscHRy
KTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbE9uZSA9IGxpbmtCdWZmZXIubG9jYXRpb25P
Zihwcm9jLmVudHJ5cG9pbnRMYWJlbCgwKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxU
d28gPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMSkpOworICAg
IENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVGhyZWUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJv
Yy5lbnRyeXBvaW50TGFiZWwoMikpOworICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiBj
b2RlUmVmID0gRklOQUxJWkVfQ09ERShsaW5rQnVmZmVyLCAoInRlc3RiMyBjb21waWxhdGlvbiIp
KTsKKyAgICAKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJlbE9uZSwgMSwgMikgPT0gMyk7Cisg
ICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIpID09IC0xKTsKKyAgICBDSEVDSyhp
bnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyKSA9PSAyKTsKKyAgICBDSEVDSyhpbnZva2U8aW50
PihsYWJlbE9uZSwgLTEsIDIpID09IDEpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVHdv
LCAtMSwgMikgPT0gLTMpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIC0xLCAy
KSA9PSAtMik7Cit9CisKIC8vIE1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3QgdHJ5IHRv
IG9wdGltaXplIGFueXRoaW5nIG91dC4KIE5FVkVSX0lOTElORSBkb3VibGUgemVybygpCiB7CkBA
IC0xMjM4OCw4ICsxMjQ1MCw2IEBAIGRvdWJsZSBuZWdhdGl2ZVplcm8oKQogICAgIHJldHVybiAt
emVybygpOwogfQogCi0KLQogI2RlZmluZSBSVU4odGVzdCkgZG8geyAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAogICAgICAgICBpZiAoIXNob3VsZFJ1bigjdGVzdCkpICAgICAgICAgICAgICAg
ICAgXAogICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApA
QCAtMTM3ODMsNiArMTM4NDMsOCBAQCB2b2lkIHJ1bihjb25zdCBjaGFyKiBmaWx0ZXIpCiAgICAg
UlVOKHRlc3RJbnRlcnByZXRlcigpKTsKICAgICBSVU4odGVzdFJlZHVjZVN0cmVuZ3RoQ2hlY2tC
b3R0b21Vc2VJbkFub3RoZXJCbG9jaygpKTsKICAgICBSVU4odGVzdFJlc2V0UmVhY2hhYmlsaXR5
RGFuZ2xpbmdSZWZlcmVuY2UoKSk7CisgICAgCisgICAgUlVOKHRlc3RFbnRyeVN3aXRjaFNpbXBs
ZSgpKTsKIAogICAgIGlmICh0YXNrcy5pc0VtcHR5KCkpCiAgICAgICAgIHVzYWdlKCk7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHJldmlzaW9uIDIwMzQ0
MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJCM0Jhc2ljQmxvY2tVdGlscy5oIgog
I2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCiAjaW5jbHVkZSAiQjNTdGFja1Nsb3QuaCIKKyNpbmNs
dWRlIDx3dGYvTGlzdER1bXAuaD4KIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgewogCkBAIC03OSwxOCArODAsMzggQEAgQ0NhbGxTcGVjaWFsKiBDb2RlOjpj
Q2FsbFNwZWNpYWwoKQogICAgIHJldHVybiBtX2NDYWxsU3BlY2lhbDsKIH0KIAorYm9vbCBDb2Rl
Ojppc0VudHJ5cG9pbnQoQmFzaWNCbG9jayogYmxvY2spIGNvbnN0Cit7CisgICAgaWYgKG1fZW50
cnlwb2ludHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gIWJsb2NrLT5pbmRleCgpOworICAg
IAorICAgIGZvciAoY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBlbnRyeXBvaW50IDogbV9lbnRyeXBv
aW50cykgeworICAgICAgICBpZiAoZW50cnlwb2ludC5ibG9jaygpID09IGJsb2NrKQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBD
b2RlOjpyZXNldFJlYWNoYWJpbGl0eSgpCiB7Ci0gICAgcmVjb21wdXRlUHJlZGVjZXNzb3JzKG1f
YmxvY2tzKTsKKyAgICBjbGVhclByZWRlY2Vzc29ycyhtX2Jsb2Nrcyk7CisgICAgaWYgKG1fZW50
cnlwb2ludHMuaXNFbXB0eSgpKQorICAgICAgICB1cGRhdGVQcmVkZWNlc3NvcnNBZnRlcihtX2Js
b2Nrc1swXS5nZXQoKSk7CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoY29uc3QgRnJlcXVlbnRl
ZEJsb2NrJiBlbnRyeXBvaW50IDogbV9lbnRyeXBvaW50cykKKyAgICAgICAgICAgIHVwZGF0ZVBy
ZWRlY2Vzc29yc0FmdGVyKGVudHJ5cG9pbnQuYmxvY2soKSk7CisgICAgfQogICAgIAogICAgIGZv
ciAoYXV0byYgYmxvY2sgOiBtX2Jsb2NrcykgewotICAgICAgICBpZiAoaXNCbG9ja0RlYWQoYmxv
Y2suZ2V0KCkpKQorICAgICAgICBpZiAoaXNCbG9ja0RlYWQoYmxvY2suZ2V0KCkpICYmICFpc0Vu
dHJ5cG9pbnQoYmxvY2suZ2V0KCkpKQogICAgICAgICAgICAgYmxvY2sgPSBudWxscHRyOwogICAg
IH0KIH0KIAogdm9pZCBDb2RlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CiB7CisgICAg
aWYgKCFtX2VudHJ5cG9pbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgb3V0LnByaW50KCJFbnRyeXBv
aW50czogIiwgbGlzdER1bXAobV9lbnRyeXBvaW50cyksICJcbiIpOwogICAgIGZvciAoQmFzaWNC
bG9jayogYmxvY2sgOiAqdGhpcykKICAgICAgICAgb3V0LnByaW50KGRlZXBEdW1wKGJsb2NrKSk7
CiAgICAgaWYgKHN0YWNrU2xvdHMoKS5zaXplKCkpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyQ29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyQ29kZS5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMzUsNiArMzUsNyBAQAog
I2luY2x1ZGUgIkFpclRtcC5oIgogI2luY2x1ZGUgIkIzSW5kZXhNYXAuaCIKICNpbmNsdWRlICJC
M1NwYXJzZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJDQ2FsbEhlbHBlcnMuaCIKICNpbmNsdWRl
ICJSZWdpc3RlckF0T2Zmc2V0TGlzdC5oIgogI2luY2x1ZGUgIlN0YWNrQWxpZ25tZW50LmgiCiAK
QEAgLTExOSw2ICsxMjAsMzIgQEAgcHVibGljOgogICAgICAgICBtX2ZyYW1lU2l6ZSA9IGZyYW1l
U2l6ZTsKICAgICB9CiAKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgdGhp
bmcgYXMgcHJvYygpLm51bUVudHJ5cG9pbnRzKCkuIFRoaXMgdmFsdWUgaGVyZSBtYXkgYmUgemVy
bworICAgIC8vIHVudGlsIHdlIGxvd2VyIEVudHJ5U3dpdGNoLgorICAgIHVuc2lnbmVkIG51bUVu
dHJ5cG9pbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbnRyeXBvaW50cy5zaXplKCk7IH0KKyAgICBj
b25zdCBWZWN0b3I8RnJlcXVlbnRlZEJsb2NrPiBlbnRyeXBvaW50cygpIGNvbnN0IHsgcmV0dXJu
IG1fZW50cnlwb2ludHM7IH0KKyAgICBjb25zdCBGcmVxdWVudGVkQmxvY2smIGVudHJ5cG9pbnQo
dW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZW50cnlwb2ludHNbaW5kZXhdOyB9Cisg
ICAgYm9vbCBpc0VudHJ5cG9pbnQoQmFzaWNCbG9jayopIGNvbnN0OworICAgIAorICAgIC8vIFRo
aXMgaXMgZm9yIHVzZSBieSBsb3dlckVudHJ5U3dpdGNoKCkuCisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVmVjdG9yPgorICAgIHZvaWQgc2V0RW50cnlwb2ludHMoVmVjdG9yJiYgdmVjdG9yKQorICAg
IHsKKyAgICAgICAgbV9lbnRyeXBvaW50cyA9IHN0ZDo6Zm9yd2FyZDxWZWN0b3I+KHZlY3Rvcik7
CisgICAgfQorICAgIAorICAgIENDYWxsSGVscGVyczo6TGFiZWwgZW50cnlwb2ludExhYmVsKHVu
c2lnbmVkIGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZW50cnlwb2ludExh
YmVsc1tpbmRleF07CisgICAgfQorICAgIAorICAgIC8vIFRoaXMgaXMgZm9yIHVzZSBieSBnZW5l
cmF0ZSgpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KKyAgICB2b2lkIHNldEVudHJ5
cG9pbnRMYWJlbHMoVmVjdG9yJiYgdmVjdG9yKQorICAgIHsKKyAgICAgICAgbV9lbnRyeXBvaW50
TGFiZWxzID0gc3RkOjpmb3J3YXJkPFZlY3Rvcj4odmVjdG9yKTsKKyAgICB9CisKICAgICBjb25z
dCBSZWdpc3RlckF0T2Zmc2V0TGlzdCYgY2FsbGVlU2F2ZVJlZ2lzdGVycygpIGNvbnN0IHsgcmV0
dXJuIG1fY2FsbGVlU2F2ZVJlZ2lzdGVyczsgfQogICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0JiBj
YWxsZWVTYXZlUmVnaXN0ZXJzKCkgeyByZXR1cm4gbV9jYWxsZWVTYXZlUmVnaXN0ZXJzOyB9CiAK
QEAgLTIzNSw2ICsyNjIsOCBAQCBwcml2YXRlOgogICAgIHVuc2lnbmVkIG1fZnJhbWVTaXplIHsg
MCB9OwogICAgIHVuc2lnbmVkIG1fY2FsbEFyZ0FyZWFTaXplIHsgMCB9OwogICAgIFJlZ2lzdGVy
QXRPZmZzZXRMaXN0IG1fY2FsbGVlU2F2ZVJlZ2lzdGVyczsKKyAgICBWZWN0b3I8RnJlcXVlbnRl
ZEJsb2NrPiBtX2VudHJ5cG9pbnRzOyAvLyBUaGlzIGlzIGVtcHR5IHVudGlsIGFmdGVyIGxvd2Vy
RW50cnlTd2l0Y2goKS4KKyAgICBWZWN0b3I8Q0NhbGxIZWxwZXJzOjpMYWJlbD4gbV9lbnRyeXBv
aW50TGFiZWxzOyAvLyBUaGlzIGlzIGVtcHR5IHVudGlsIGNvZGUgZ2VuZXJhdGlvbi4KICAgICBj
b25zdCBjaGFyKiBtX2xhc3RQaGFzZU5hbWU7CiB9OwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckN1c3RvbS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyQ3VzdG9tLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyQ3VzdG9tLmgJKHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkw
LDExIEBAIHN0cnVjdCBQYXRjaEN1c3RvbSB7CiAgICAgICAgIHJldHVybiBpbnN0LmFyZ3NbMF0u
c3BlY2lhbCgpLT5pc1Rlcm1pbmFsKGluc3QpOwogICAgIH0KIAorICAgIHN0YXRpYyBib29sIGhh
c05vbkFyZ0VmZmVjdHMoSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnN0LmFy
Z3NbMF0uc3BlY2lhbCgpLT5oYXNOb25BcmdFZmZlY3RzKGluc3QpOworICAgIH0KKwogICAgIHN0
YXRpYyBib29sIGhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKEluc3QmIGluc3QpCiAgICAgewog
ICAgICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+aGFzTm9uQXJnTm9uQ29udHJv
bEVmZmVjdHMoaW5zdCk7CkBAIC0xMDIsMTAgKzEwNywxOCBAQCBzdHJ1Y3QgUGF0Y2hDdXN0b20g
ewogICAgIH0KIH07CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFN1YnR5cGU+CitzdHJ1Y3QgQ29tbW9u
Q3VzdG9tQmFzZSB7CisgICAgc3RhdGljIGJvb2wgaGFzTm9uQXJnRWZmZWN0cyhJbnN0JiBpbnN0
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN1YnR5cGU6OmlzVGVybWluYWwoaW5zdCkgfHwgU3Vi
dHlwZTo6aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoaW5zdCk7CisgICAgfQorfTsKKwogLy8g
RGVmaW5pdGlvbiBvZiBDQ2FsbCBpbnN0cnVjdGlvbi4gQ0NhbGwgaXMgdXNlZCBmb3IgaG90IHBh
dGggQyBmdW5jdGlvbiBjYWxscy4gSXQncyBsb3dlcmVkIHRvIGEKIC8vIFBhdGNoIHdpdGggYW4g
QWlyIENDYWxsU3BlY2lhbCBhbG9uZyB3aXRoIGNvZGUgdG8gbWFyc2hhbCBpbnN0cnVjdGlvbnMu
IFRoZSBsb3dlcmluZyBoYXBwZW5zCiAvLyBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28g
dGhhdCB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHNlZXMgdGhlIGNsb2JiZXJzLgotc3RydWN0IEND
YWxsQ3VzdG9tIHsKK3N0cnVjdCBDQ2FsbEN1c3RvbSA6IHB1YmxpYyBDb21tb25DdXN0b21CYXNl
PENDYWxsQ3VzdG9tPiB7CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KICAgICBzdGF0
aWMgdm9pZCBmb3JFYWNoQXJnKEluc3QmIGluc3QsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCiAg
ICAgewpAQCAtMTcxLDcgKzE4NCw3IEBAIHN0cnVjdCBDb2xkQ0NhbGxDdXN0b20gOiBDQ2FsbEN1
c3RvbSB7CiAgICAgfQogfTsKIAotc3RydWN0IFNodWZmbGVDdXN0b20geworc3RydWN0IFNodWZm
bGVDdXN0b20gOiBwdWJsaWMgQ29tbW9uQ3VzdG9tQmFzZTxTaHVmZmxlQ3VzdG9tPiB7CiAgICAg
dGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KICAgICBzdGF0aWMgdm9pZCBmb3JFYWNoQXJnKElu
c3QmIGluc3QsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCiAgICAgewpAQCAtMjIwLDYgKzIzMyw0
NyBAQCBzdHJ1Y3QgU2h1ZmZsZUN1c3RvbSB7CiAgICAgc3RhdGljIENDYWxsSGVscGVyczo6SnVt
cCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKIH07
CiAKK3N0cnVjdCBFbnRyeVN3aXRjaEN1c3RvbSA6IHB1YmxpYyBDb21tb25DdXN0b21CYXNlPEVu
dHJ5U3dpdGNoQ3VzdG9tPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICBzdGF0
aWMgdm9pZCBmb3JFYWNoQXJnKEluc3QmLCBjb25zdCBGdW5jJikKKyAgICB7CisgICAgfQorICAg
IAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBzdGF0aWMgYm9vbCBp
c1ZhbGlkRm9ybVN0YXRpYyhBcmd1bWVudHMuLi4pCisgICAgeworICAgICAgICByZXR1cm4gIXNp
emVvZi4uLihBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlk
Rm9ybShJbnN0JiBpbnN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc3QuYXJncy5pc0VtcHR5
KCk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNp
Z25lZCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgc3Rh
dGljIGJvb2wgaXNUZXJtaW5hbChJbnN0JikKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdOb25Db250cm9sRWZmZWN0cyhJ
bnN0JikKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMg
Q0NhbGxIZWxwZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0
aW9uQ29udGV4dCYpCisgICAgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFj
aGVkIGJlY2F1c2Ugd2Ugc2hvdWxkIGhhdmUgbG93ZXJlZCBFbnRyeVN3aXRjaCBiZWZvcmUKKyAg
ICAgICAgLy8gZ2VuZXJhdGlvbi4KKyAgICAgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7
CisgICAgICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6Okp1bXAoKTsKKyAgICB9Cit9OworCiB9IH0g
fSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCiAKICNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJl
dmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJh
dGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiQWlySXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKICNpbmNsdWRlICJBaXJMb2dSZWdpc3RlclByZXNz
dXJlLmgiCiAjaW5jbHVkZSAiQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmgiCisjaW5jbHVkZSAiQWly
TG93ZXJFbnRyeVN3aXRjaC5oIgogI2luY2x1ZGUgIkFpckxvd2VyTWFjcm9zLmgiCiAjaW5jbHVk
ZSAiQWlyT3Bjb2RlVXRpbHMuaCIKICNpbmNsdWRlICJBaXJPcHRpbWl6ZUJsb2NrT3JkZXIuaCIK
QEAgLTEyNywxMCArMTI4LDYgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBjb2Rl
KQogICAgIC8vIHBoYXNlLgogICAgIHNpbXBsaWZ5Q0ZHKGNvZGUpOwogCi0gICAgLy8gVGhpcyBz
b3J0cyB0aGUgYmFzaWMgYmxvY2tzIGluIENvZGUgdG8gYWNoaWV2ZSBhbiBvcmRlcmluZyB0aGF0
IG1heGltaXplcyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgaGlnaAotICAgIC8vIGZyZXF1ZW5jeSBz
dWNjZXNzb3IgaXMgYWxzbyB0aGUgZmFsbC10aHJvdWdoIHRhcmdldC4KLSAgICBvcHRpbWl6ZUJs
b2NrT3JkZXIoY29kZSk7Ci0KICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzYXRpc2Z5IGEgcmVx
dWlyZW1lbnQgb2YgQjM6OlN0YWNrbWFwVmFsdWUuCiAgICAgcmVwb3J0VXNlZFJlZ2lzdGVycyhj
b2RlKTsKIApAQCAtMTM5LDYgKzEzNiwxNiBAQCB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKENv
ZGUmIGNvZGUpCiAgICAgLy8gdXNlLiBXZSBfbXVzdF8gcnVuIHRoaXMgYWZ0ZXIgcmVwb3J0VXNl
ZFJlZ2lzdGVycygpLCBzaW5jZSB0aGF0IGtpbGxzIHZhcmlhYmxlIGFzc2lnbm1lbnRzCiAgICAg
Ly8gdGhhdCBzZWVtIGRlYWQuIEx1Y2tpbHksIHRoaXMgcGhhc2UgZG9lcyBub3QgY2hhbmdlIHJl
Z2lzdGVyIGxpdmVuZXNzLCBzbyB0aGF0J3MgT0suCiAgICAgZml4UGFydGlhbFJlZ2lzdGVyU3Rh
bGxzKGNvZGUpOworICAgIAorICAgIC8vIEFjdHVhbGx5IGNyZWF0ZSBlbnRyeXBvaW50cy4KKyAg
ICBsb3dlckVudHJ5U3dpdGNoKGNvZGUpOworICAgIAorICAgIC8vIFRoZSBjb250cm9sIGZsb3cg
Z3JhcGggY2FuIGJlIHNpbXBsaWZpZWQgZnVydGhlciBhZnRlciB3ZSBoYXZlIGxvd2VyZWQgRW50
cnlTd2l0Y2guCisgICAgc2ltcGxpZnlDRkcoY29kZSk7CisKKyAgICAvLyBUaGlzIHNvcnRzIHRo
ZSBiYXNpYyBibG9ja3MgaW4gQ29kZSB0byBhY2hpZXZlIGFuIG9yZGVyaW5nIHRoYXQgbWF4aW1p
emVzIHRoZSBsaWtlbGlob29kIHRoYXQgYSBoaWdoCisgICAgLy8gZnJlcXVlbmN5IHN1Y2Nlc3Nv
ciBpcyBhbHNvIHRoZSBmYWxsLXRocm91Z2ggdGFyZ2V0LgorICAgIG9wdGltaXplQmxvY2tPcmRl
cihjb2RlKTsKIAogICAgIGlmIChzaG91bGRWYWxpZGF0ZUlSKCkpCiAgICAgICAgIHZhbGlkYXRl
KGNvZGUpOwpAQCAtMTU3LDIyICsxNjQsMTEgQEAgdm9pZCBnZW5lcmF0ZShDb2RlJiBjb2RlLCBD
Q2FsbEhlbHBlcnMmIAogCiAgICAgRGlzYWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGRp
c2FsbG93U2NyYXRjaChqaXQpOwogCi0gICAgLy8gQW5kIG5vdywgd2UgZ2VuZXJhdGUgY29kZS4K
LSAgICBqaXQuZW1pdEZ1bmN0aW9uUHJvbG9ndWUoKTsKLSAgICBpZiAoY29kZS5mcmFtZVNpemUo
KSkKLSAgICAgICAgaml0LmFkZFB0cihDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtY29kZS5m
cmFtZVNpemUoKSksIE1hY3JvQXNzZW1ibGVyOjpzdGFja1BvaW50ZXJSZWdpc3Rlcik7Ci0KICAg
ICBhdXRvIGFyZ0ZvciA9IFsmXSAoY29uc3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkpIC0+IEND
YWxsSGVscGVyczo6QWRkcmVzcyB7CiAgICAgICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6OkFkZHJl
c3MoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIGVudHJ5Lm9mZnNldCgpKTsKICAgICB9Owog
ICAgIAotICAgIGZvciAoY29uc3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkgOiBjb2RlLmNhbGxl
ZVNhdmVSZWdpc3RlcnMoKSkgewotICAgICAgICBpZiAoZW50cnkucmVnKCkuaXNHUFIoKSkKLSAg
ICAgICAgICAgIGppdC5zdG9yZVB0cihlbnRyeS5yZWcoKS5ncHIoKSwgYXJnRm9yKGVudHJ5KSk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGppdC5zdG9yZURvdWJsZShlbnRyeS5yZWcoKS5m
cHIoKSwgYXJnRm9yKGVudHJ5KSk7Ci0gICAgfQotCisgICAgLy8gQW5kIG5vdywgd2UgZ2VuZXJh
dGUgY29kZS4KICAgICBHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0OwogICAgIGNvbnRleHQuY29k
ZSA9ICZjb2RlOwogICAgIGNvbnRleHQuYmxvY2tMYWJlbHMucmVzaXplKGNvZGUuc2l6ZSgpKTsK
QEAgLTIwNiw2ICsyMDIsMjAgQEAgdm9pZCBnZW5lcmF0ZShDb2RlJiBjb2RlLCBDQ2FsbEhlbHBl
cnMmIAogICAgICAgICBibG9ja0p1bXBzW2Jsb2NrXS5saW5rKCZqaXQpOwogICAgICAgICBDQ2Fs
bEhlbHBlcnM6OkxhYmVsIGxhYmVsID0gaml0LmxhYmVsKCk7CiAgICAgICAgICpjb250ZXh0LmJs
b2NrTGFiZWxzW2Jsb2NrXSA9IGxhYmVsOworCisgICAgICAgIGlmIChjb2RlLmlzRW50cnlwb2lu
dChibG9jaykpIHsKKyAgICAgICAgICAgIGppdC5lbWl0RnVuY3Rpb25Qcm9sb2d1ZSgpOworICAg
ICAgICAgICAgaWYgKGNvZGUuZnJhbWVTaXplKCkpCisgICAgICAgICAgICAgICAgaml0LmFkZFB0
cihDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtY29kZS5mcmFtZVNpemUoKSksIE1hY3JvQXNz
ZW1ibGVyOjpzdGFja1BvaW50ZXJSZWdpc3Rlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGZvciAoY29uc3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkgOiBjb2RlLmNhbGxlZVNhdmVSZWdp
c3RlcnMoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5yZWcoKS5pc0dQUigpKQorICAg
ICAgICAgICAgICAgICAgICBqaXQuc3RvcmVQdHIoZW50cnkucmVnKCkuZ3ByKCksIGFyZ0Zvcihl
bnRyeSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaml0LnN0
b3JlRG91YmxlKGVudHJ5LnJlZygpLmZwcigpLCBhcmdGb3IoZW50cnkpKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgQVNTRVJUKGJsb2NrLT5zaXplKCkgPj0g
MSk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBibG9jay0+c2l6ZSgpIC0gMTsg
KytpKSB7CiAgICAgICAgICAgICBjb250ZXh0LmluZGV4SW5CbG9jayA9IGk7CkBAIC0yNjQsNiAr
Mjc0LDExIEBAIHZvaWQgZ2VuZXJhdGUoQ29kZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKICAgICAK
ICAgICBjb250ZXh0LmN1cnJlbnRCbG9jayA9IG51bGxwdHI7CiAgICAgY29udGV4dC5pbmRleElu
QmxvY2sgPSBVSU5UX01BWDsKKyAgICAKKyAgICBWZWN0b3I8Q0NhbGxIZWxwZXJzOjpMYWJlbD4g
ZW50cnlwb2ludExhYmVscyhjb2RlLm51bUVudHJ5cG9pbnRzKCkpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IGNvZGUubnVtRW50cnlwb2ludHMoKTsgaS0tOykKKyAgICAgICAgZW50cnlwb2ludExh
YmVsc1tpXSA9ICpjb250ZXh0LmJsb2NrTGFiZWxzW2NvZGUuZW50cnlwb2ludChpKS5ibG9jaygp
XTsKKyAgICBjb2RlLnNldEVudHJ5cG9pbnRMYWJlbHMoV1RGTW92ZShlbnRyeXBvaW50TGFiZWxz
KSk7CiAKICAgICBwY1RvT3JpZ2luTWFwLmFwcGVuZEl0ZW0oaml0LmxhYmVsKCksIE9yaWdpbigp
KTsKICAgICAvLyBGSVhNRTogTWFrZSBsYXRlIHBhdGhzIGhhdmUgT3JpZ2luczogaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzY4OQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guY3BwCShub25l
eGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3
aXRjaC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkFpckxvd2VyRW50cnlTd2l0Y2guaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisKKyNp
bmNsdWRlICJBaXJCbG9ja1dvcmtsaXN0LmgiCisjaW5jbHVkZSAiQWlyQ29kZS5oIgorI2luY2x1
ZGUgIkFpckluc3RJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5oIgorI2luY2x1
ZGUgIkIzUHJvY2VkdXJlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1l
c3BhY2UgQWlyIHsKKwordm9pZCBsb3dlckVudHJ5U3dpdGNoKENvZGUmIGNvZGUpCit7CisgICAg
UGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJsb3dlckVudHJ5U3dpdGNoIik7CisgICAgCisg
ICAgLy8gRmlndXJlIG91dCB0aGUgc2V0IG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBkdXBsaWNh
dGVkLgorICAgIEJsb2NrV29ya2xpc3Qgd29ya2xpc3Q7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IGNvZGUpIHsKKyAgICAgICAgaWYgKGJsb2NrLT5sYXN0KCkub3Bjb2RlID09IEVudHJ5
U3dpdGNoKQorICAgICAgICAgICAgd29ya2xpc3QucHVzaChibG9jayk7CisgICAgfQorICAgIAor
ICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3ZSBkb24ndCBoYXZlIGFueSBFbnRyeVN3aXRjaGVz
LiBUaGF0J3MgZmluZS4KKyAgICBpZiAod29ya2xpc3Quc2VlbigpLmlzRW1wdHkoKSkgeworICAg
ICAgICBWZWN0b3I8RnJlcXVlbnRlZEJsb2NrPiBlbnRyeXBvaW50cyhjb2RlLnByb2MoKS5udW1F
bnRyeXBvaW50cygpLCBGcmVxdWVudGVkQmxvY2soY29kZVswXSkpOworICAgICAgICBjb2RlLnNl
dEVudHJ5cG9pbnRzKFdURk1vdmUoZW50cnlwb2ludHMpKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICAKKyAgICB3aGlsZSAoQmFzaWNCbG9jayogYmxvY2sgPSB3b3JrbGlzdC5wb3AoKSkK
KyAgICAgICAgd29ya2xpc3QucHVzaEFsbChibG9jay0+cHJlZGVjZXNzb3JzKCkpOworICAgIAor
ICAgIFJFTEVBU0VfQVNTRVJUKHdvcmtsaXN0LnNhdyhjb2RlWzBdKSk7CisgICAgCisgICAgVmVj
dG9yPEZyZXF1ZW5jeUNsYXNzPiBlbnRyeXBvaW50RnJlcXVlbmNpZXMoY29kZS5wcm9jKCkubnVt
RW50cnlwb2ludHMoKSwgRnJlcXVlbmN5Q2xhc3M6OlJhcmUpOworICAgIGZvciAoQmFzaWNCbG9j
ayogYmxvY2sgOiBjb2RlKSB7CisgICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSAhPSBF
bnRyeVN3aXRjaCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGVudHJ5cG9pbnRJbmRleCA9IGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCk7IGVudHJ5cG9p
bnRJbmRleC0tOykgeworICAgICAgICAgICAgZW50cnlwb2ludEZyZXF1ZW5jaWVzW2VudHJ5cG9p
bnRJbmRleF0gPSBtYXhGcmVxdWVuY3koCisgICAgICAgICAgICAgICAgZW50cnlwb2ludEZyZXF1
ZW5jaWVzW2VudHJ5cG9pbnRJbmRleF0sCisgICAgICAgICAgICAgICAgYmxvY2stPnN1Y2Nlc3Nv
cihlbnRyeXBvaW50SW5kZXgpLmZyZXF1ZW5jeSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICBhdXRvIGZpeEVudHJ5U3dpdGNoID0gWyZdIChCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWdu
ZWQgZW50cnlwb2ludEluZGV4KSB7CisgICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSAh
PSBFbnRyeVN3aXRjaCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRnJlcXVlbnRlZEJs
b2NrIHRhcmdldCA9IGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2ludEluZGV4KTsKKyAgICAgICAg
YmxvY2stPmxhc3QoKS5vcGNvZGUgPSBKdW1wOworICAgICAgICBibG9jay0+c3VjY2Vzc29ycygp
LnJlc2l6ZSgxKTsKKyAgICAgICAgYmxvY2stPnN1Y2Nlc3NvcigwKSA9IHRhcmdldDsKKyAgICB9
OworICAgIAorICAgIC8vIE5vdyBkdXBsaWNhdGUgdGhlbS4KKyAgICBWZWN0b3I8RnJlcXVlbnRl
ZEJsb2NrPiBlbnRyeXBvaW50czsKKyAgICBlbnRyeXBvaW50cy5hcHBlbmQoRnJlcXVlbnRlZEJs
b2NrKGNvZGVbMF0sIGVudHJ5cG9pbnRGcmVxdWVuY2llc1swXSkpOworICAgIEluZGV4TWFwPEJh
c2ljQmxvY2ssIEJhc2ljQmxvY2sqPiBtYXAoY29kZS5zaXplKCkpOworICAgIGZvciAodW5zaWdu
ZWQgZW50cnlwb2ludEluZGV4ID0gMTsgZW50cnlwb2ludEluZGV4IDwgY29kZS5wcm9jKCkubnVt
RW50cnlwb2ludHMoKTsgKytlbnRyeXBvaW50SW5kZXgpIHsKKyAgICAgICAgbWFwLmNsZWFyKCk7
CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVz
KGNvZGUpKSB7CisgICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdCbG9jayA9IGNvZGUuYWRkQmxv
Y2soYmxvY2stPmZyZXF1ZW5jeSgpKTsKKyAgICAgICAgICAgIG1hcFtibG9ja10gPSBuZXdCbG9j
azsKKyAgICAgICAgfQorICAgICAgICBlbnRyeXBvaW50cy5hcHBlbmQoRnJlcXVlbnRlZEJsb2Nr
KG1hcFtjb2RlWzBdXSwgZW50cnlwb2ludEZyZXF1ZW5jaWVzW2VudHJ5cG9pbnRJbmRleF0pKTsK
KyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IHdvcmtsaXN0LnNlZW4oKS52YWx1ZXMo
Y29kZSkpIHsKKyAgICAgICAgICAgIEJhc2ljQmxvY2sqIG5ld0Jsb2NrID0gbWFwW2Jsb2NrXTsK
KyAgICAgICAgICAgIGZvciAoY29uc3QgSW5zdCYgaW5zdCA6ICpibG9jaykKKyAgICAgICAgICAg
ICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChpbnN0KTsKKyAgICAgICAgICAgIG5ld0Jsb2NrLT5z
dWNjZXNzb3JzKCkgPSBibG9jay0+c3VjY2Vzc29ycygpOworICAgICAgICAgICAgZm9yIChCYXNp
Y0Jsb2NrKiYgc3VjY2Vzc29yIDogbmV3QmxvY2stPnN1Y2Nlc3NvckJsb2NrcygpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKEJhc2ljQmxvY2sqIHJlcGxhY2VtZW50ID0gbWFwW3N1Y2Nlc3Nvcl0p
CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHJlcGxhY2VtZW50OworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgZml4RW50cnlTd2l0Y2gobmV3QmxvY2ssIGVudHJ5cG9pbnRJbmRl
eCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IHdvcmts
aXN0LnNlZW4oKS52YWx1ZXMoY29kZSkpCisgICAgICAgIGZpeEVudHJ5U3dpdGNoKGJsb2NrLCAw
KTsKKyAgICAKKyAgICBjb2RlLnNldEVudHJ5cG9pbnRzKFdURk1vdmUoZW50cnlwb2ludHMpKTsK
KyAgICBjb2RlLnJlc2V0UmVhY2hhYmlsaXR5KCk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCisKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmgJKG5v
bmV4aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5
U3dpdGNoLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEFpckxvd2VyRW50cnlTd2l0
Y2hfaAorI2RlZmluZSBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKworI2lmIEVOQUJMRShCM19KSVQp
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xh
c3MgQ29kZTsKKworLy8gQ29udmVydHMgY29kZSB0aGF0IHNlZW1zIHRvIGhhdmUgb25lIGVudHJ5
cG9pbnQgYW5kIGVtdWxhdGVzIG11bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGgKKy8vIEVudHJ5U3dp
dGNoIGludG8gY29kZSB0aGF0IHJlYWxseSBoYXMgbXVsdGlwbGUgZW50cnlwb2ludHMuIFRoaXMg
aXMgYWNjb21wbGlzaGVkIGJ5IGR1cGxpY2F0aW5nCisvLyB0aGUgYmFja3dhcmRzIHRyYW5zaXRp
dmUgY2xvc3VyZSBmcm9tIGFsbCBFbnRyeVN3aXRjaGVzLgordm9pZCBsb3dlckVudHJ5U3dpdGNo
KENvZGUmKTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8g
RU5BQkxFKEIzX0pJVCkKKworI2VuZGlmIC8vIEFpckxvd2VyRW50cnlTd2l0Y2hfaAorCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMJKHJl
dmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3Bjb2Rl
Lm9wY29kZXMJKHdvcmtpbmcgY29weSkKQEAgLTg0OSw2ICs4NDksMTAgQEAgUmV0RG91YmxlIFU6
Rjo2NCAvcmV0dXJuCiAKIE9vcHMgL3Rlcm1pbmFsCiAKKyMgVGhpcyBpcyBhIHRlcm1pbmFsIGJ1
dCB3ZSBleHByZXNzIGl0IGFzIGEgQ3VzdG9tIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBpdCB0byBo
YXZlIGEgY29kZQorIyBnZW5lcmF0b3IuCitjdXN0b20gRW50cnlTd2l0Y2gKKwogIyBBIFNodWZm
bGUgaXMgYSBtdWx0aS1zb3VyY2UsIG11bHRpLWRlc3RpbmF0aW9uIG1vdmUuIEl0IHNpbXVsdGFu
ZW91c2x5IGRvZXMgbXVsdGlwbGUgbW92ZXMgYXQgb25jZS4KICMgVGhlIG1vdmVzIGFyZSBzcGVj
aWZpZWQgYXMgdHJpcGxldHMgb2Ygc3JjLCBkc3QsIGFuZCB3aWR0aC4gRm9yIGV4YW1wbGUgeW91
IGNhbiByZXF1ZXN0IGEgc3dhcCB0aGlzCiAjIHdheToKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAJKHJldmlz
aW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyT3B0aW1pemVC
bG9ja09yZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtODEsMTYgKzgxLDI4IEBAIFZlY3RvcjxC
YXNpY0Jsb2NrKj4gYmxvY2tzSW5PcHRpbWl6ZWRPcmQKICAgICBTb3J0ZWRTdWNjZXNzb3JzIHNv
cnRlZFN1Y2Nlc3NvcnM7CiAgICAgU29ydGVkU3VjY2Vzc29ycyBzb3J0ZWRTbG93U3VjY2Vzc29y
czsKICAgICAKLSAgICBmYXN0V29ya2xpc3QucHVzaChjb2RlWzBdKTsKKyAgICAvLyBXZSBleHBl
Y3QgZW50cnlwb2ludCBsb3dlcmluZyB0byBoYXZlIGFscmVhZHkgaGFwcGVuZWQuCisgICAgUkVM
RUFTRV9BU1NFUlQoY29kZS5udW1FbnRyeXBvaW50cygpKTsKKworICAgIGF1dG8gYXBwZW5kU3Vj
Y2Vzc29yID0gWyZdIChjb25zdCBGcmVxdWVudGVkQmxvY2smIGJsb2NrKSB7CisgICAgICAgIGlm
IChibG9jay5pc1JhcmUoKSkKKyAgICAgICAgICAgIHNvcnRlZFNsb3dTdWNjZXNzb3JzLmFwcGVu
ZChibG9jay5ibG9jaygpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc29ydGVkU3VjY2Vz
c29ycy5hcHBlbmQoYmxvY2suYmxvY2soKSk7CisgICAgfTsKKyAgICAKKyAgICAvLyBGb3IgZXZl
cnl0aGluZyBidXQgdGhlIGZpcnN0IGVudHJ5cG9pbnQsIHdlIHB1c2ggdGhlbSBpbiBvcmRlciBv
ZiBmcmVxdWVuY3kgYW5kIGZyZXF1ZW5jeQorICAgIC8vIGNsYXNzLgorICAgIGZvciAodW5zaWdu
ZWQgaSA9IDE7IGkgPCBjb2RlLm51bUVudHJ5cG9pbnRzKCk7ICsraSkKKyAgICAgICAgYXBwZW5k
U3VjY2Vzc29yKGNvZGUuZW50cnlwb2ludChpKSk7CisgICAgCisgICAgLy8gQWx3YXlzIHB1c2gg
dGhlIHByaW1hcnkgc3VjY2Vzc29yIGxhc3Qgc28gdGhhdCBpdCBnZXRzIGhpZ2hlc3QgcHJpb3Jp
dHkuCisgICAgZmFzdFdvcmtsaXN0LnB1c2goY29kZS5lbnRyeXBvaW50KDApLmJsb2NrKCkpOwog
ICAgIAogICAgIHdoaWxlIChCYXNpY0Jsb2NrKiBibG9jayA9IGZhc3RXb3JrbGlzdC5wb3AoKSkg
ewogICAgICAgICBibG9ja3NJbk9yZGVyLmFwcGVuZChibG9jayk7Ci0gICAgICAgIGZvciAoRnJl
cXVlbnRlZEJsb2NrJiBzdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7Ci0gICAgICAg
ICAgICBpZiAoc3VjY2Vzc29yLmlzUmFyZSgpKQotICAgICAgICAgICAgICAgIHNvcnRlZFNsb3dT
dWNjZXNzb3JzLmFwcGVuZChzdWNjZXNzb3IuYmxvY2soKSk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgc29ydGVkU3VjY2Vzc29ycy5hcHBlbmQoc3VjY2Vzc29yLmJsb2NrKCkp
OwotICAgICAgICB9CisgICAgICAgIGZvciAoRnJlcXVlbnRlZEJsb2NrJiBzdWNjZXNzb3IgOiBi
bG9jay0+c3VjY2Vzc29ycygpKQorICAgICAgICAgICAgYXBwZW5kU3VjY2Vzc29yKHN1Y2Nlc3Nv
cik7CiAgICAgICAgIHNvcnRlZFN1Y2Nlc3NvcnMucHJvY2VzcyhmYXN0V29ya2xpc3QpOwogICAg
IH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuY3Bw
CShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNw
ZWNpYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCw2ICs2MCwxMSBAQCBib29sIFNwZWNpYWw6
OmlzVGVybWluYWwoSW5zdCYpCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNwZWNpYWw6
Omhhc05vbkFyZ0VmZmVjdHMoSW5zdCYpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wg
U3BlY2lhbDo6aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoSW5zdCYpCiB7CiAgICAgcmV0dXJu
IHRydWU7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuaAko
cmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVj
aWFsLmgJKHdvcmtpbmcgY29weSkKQEAgLTkyLDYgKzkyLDkgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgYm9vbCBpc1Rlcm1pbmFsKEluc3QmKTsKIAogICAgIC8vIEJ5IGRlZmF1bHQsIHRoaXMgcmV0
dXJucyB0cnVlLgorICAgIHZpcnR1YWwgYm9vbCBoYXNOb25BcmdFZmZlY3RzKEluc3QmKTsKKwor
ICAgIC8vIEJ5IGRlZmF1bHQsIHRoaXMgcmV0dXJucyB0cnVlLgogICAgIHZpcnR1YWwgYm9vbCBo
YXNOb25BcmdOb25Db250cm9sRWZmZWN0cyhJbnN0Jik7CiAKICAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVmFs
aWRhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
VmFsaWRhdGUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpclZhbGlkYXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAog
CiAjaW5jbHVkZSAiQWlyQ29kZS5oIgogI2luY2x1ZGUgIkFpckluc3RJbmxpbmVzLmgiCisjaW5j
bHVkZSAiQjNQcm9jZWR1cmUuaCIKIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5h
bWVzcGFjZSBBaXIgewogCkBAIC01NCw3ICs1NSw3IEBAIHB1YmxpYzoKICAgICAgICAgSGFzaFNl
dDxTdGFja1Nsb3QqPiB2YWxpZFNsb3RzOwogICAgICAgICBIYXNoU2V0PEJhc2ljQmxvY2sqPiB2
YWxpZEJsb2NrczsKICAgICAgICAgSGFzaFNldDxTcGVjaWFsKj4gdmFsaWRTcGVjaWFsczsKLQor
ICAgICAgICAKICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkKICAgICAg
ICAgICAgIHZhbGlkQmxvY2tzLmFkZChibG9jayk7CiAgICAgICAgIGZvciAoU3RhY2tTbG90KiBz
bG90IDogbV9jb2RlLnN0YWNrU2xvdHMoKSkKQEAgLTYzLDYgKzY0LDEwIEBAIHB1YmxpYzoKICAg
ICAgICAgICAgIHZhbGlkU3BlY2lhbHMuYWRkKHNwZWNpYWwpOwogCiAgICAgICAgIGZvciAoQmFz
aWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIC8vIEJsb2NrcyB0aGF0IGFy
ZSBlbnRyeXBvaW50cyBtdXN0IG5vdCBoYXZlIHByZWRlY2Vzc29ycy4KKyAgICAgICAgICAgIGlm
IChtX2NvZGUuaXNFbnRyeXBvaW50KGJsb2NrKSkKKyAgICAgICAgICAgICAgICBWQUxJREFURSgh
YmxvY2stPm51bVByZWRlY2Vzc29ycygpLCAoIkF0IGVudHJ5cG9pbnQgIiwgKmJsb2NrKSk7Cisg
ICAgICAgICAgICAKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5z
dEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKICAgICAgICAgICAgICAgICBJ
bnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7CiAgICAgICAgICAgICAgICAgZm9yIChB
cmcmIGFyZyA6IGluc3QuYXJncykgewpAQCAtODksNiArOTQsMTQgQEAgcHVibGljOgogICAgICAg
ICAgICAgICAgICAgICAgICAgVkFMSURBVEUoJmFyZyA+PSAmaW5zdC5hcmdzWzBdLCAoIkF0ICIs
IGFyZywgIiBpbiAiLCBpbnN0LCAiIGluICIsICpibG9jaykpOwogICAgICAgICAgICAgICAgICAg
ICAgICAgVkFMSURBVEUoJmFyZyA8PSAmaW5zdC5hcmdzLmxhc3QoKSwgKCJBdCAiLCBhcmcsICIg
aW4gIiwgaW5zdCwgIiBpbiAiLCAqYmxvY2spKTsKICAgICAgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3dpdGNoIChpbnN0Lm9wY29kZSkgewor
ICAgICAgICAgICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CisgICAgICAgICAgICAgICAgICAgIFZB
TElEQVRFKGJsb2NrLT5udW1TdWNjZXNzb3JzKCkgPT0gbV9jb2RlLnByb2MoKS5udW1FbnRyeXBv
aW50cygpLCAoIkF0ICIsIGluc3QsICIgaW4gIiwgKmJsb2NrKSk7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZv
ciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvckJsb2NrcygpKQogICAg
ICAgICAgICAgICAgIFZBTElEQVRFKHZhbGlkQmxvY2tzLmNvbnRhaW5zKHN1Y2Nlc3NvciksICgi
SW4gIiwgKmJsb2NrKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29k
ZV9nZW5lcmF0b3IucmIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9vcGNvZGVfZ2VuZXJhdG9yLnJiCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmIJKHdvcmtpbmcgY29weSkKQEAgLTEw
NDYsNyArMTA0Niw3IEBAIHdyaXRlSCgiT3Bjb2RlR2VuZXJhdGVkIikgewogICAgICAgICB8IG9w
Y29kZSB8CiAgICAgICAgIGlmIG9wY29kZS5jdXN0b20KICAgICAgICAgICAgIG91dHAucHV0cyAi
Y2FzZSAje29wY29kZS5uYW1lfToiCi0gICAgICAgICAgICBvdXRwLnB1dHMgInJldHVybiAje29w
Y29kZS5uYW1lfUN1c3RvbTo6aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoKnRoaXMpOyIKKyAg
ICAgICAgICAgIG91dHAucHV0cyAicmV0dXJuICN7b3Bjb2RlLm5hbWV9Q3VzdG9tOjpoYXNOb25B
cmdFZmZlY3RzKCp0aGlzKTsiCiAgICAgICAgIGVuZAogICAgIH0KICAgICBvdXRwLnB1dHMgImRl
ZmF1bHQ6IgpJbmRleDogU291cmNlL1dURi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dURi9DaGFuZ2VMb2cJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9XVEYvQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTYtMDctMTkgIEZpbGlwIFBpemxv
ICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBCMyBzaG91bGQgc3VwcG9ydCBtdWx0aXBs
ZSBlbnRyeXBvaW50cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTU5MzkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgKiB3dGYvR3JhcGhOb2RlV29ya2xpc3QuaDogRXhwb3NlIHNvbWUgaGFuZHkgZnVuY3Rp
b25hbGl0eS4KKyAgICAgICAgKFdURjo6R3JhcGhOb2RlV29ya2xpc3Q6OnBvcCk6CisgICAgICAg
IChXVEY6OkdyYXBoTm9kZVdvcmtsaXN0OjpzYXcpOgorICAgICAgICAoV1RGOjpHcmFwaE5vZGVX
b3JrbGlzdDo6c2Vlbik6CisgICAgICAgICogd3RmL1ZlY3RvclRyYWl0cy5oOiBGaXggYSBidWch
IE90aGVyd2lzZSBmaWxsaW5nIGEgdmVjdG9yIG9mIGJ5dGUtc2l6ZWQgZW51bSBjbGFzc2VzIGRv
ZXNuJ3Qgd29yay4KKwogMjAxNi0wNy0xOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBw
bGUuY29tPgogCiAgICAgICAgIFdlYktpdCBuaWdodGx5IGZhaWxzIHRvIGJ1aWxkIG9uIG1hY09T
IFNpZXJyYQpJbmRleDogU291cmNlL1dURi93dGYvR3JhcGhOb2RlV29ya2xpc3QuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlzdC5oCShyZXZpc2lvbiAyMDM0
NDEpCisrKyBTb3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlzdC5oCSh3b3JraW5nIGNvcHkp
CkBAIC02Myw2ICs2Myw4IEBAIHB1YmxpYzoKICAgICB9CiAKICAgICBib29sIHNhdyhOb2RlIG5v
ZGUpIHsgcmV0dXJuIG1fc2Vlbi5jb250YWlucyhub2RlKTsgfQorICAgIAorICAgIGNvbnN0IFNl
dCYgc2VlbigpIGNvbnN0IHsgcmV0dXJuIG1fc2VlbjsgfQogCiBwcml2YXRlOgogICAgIFNldCBt
X3NlZW47CkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9WZWN0b3JUcmFpdHMuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV1RGL3d0Zi9WZWN0b3JUcmFpdHMuaAkocmV2aXNpb24gMjAzNDQxKQorKysgU291
cmNlL1dURi93dGYvVmVjdG9yVHJhaXRzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAxNiBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI1
LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4K
ICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAKIG5hbWVzcGFjZSBX
VEYgewogCkBAIC01MSw3ICs1Miw3IEBAIG5hbWVzcGFjZSBXVEYgewogICAgICAgICBzdGF0aWMg
Y29uc3QgYm9vbCBjYW5Jbml0aWFsaXplV2l0aE1lbXNldCA9IGZhbHNlOwogICAgICAgICBzdGF0
aWMgY29uc3QgYm9vbCBjYW5Nb3ZlV2l0aE1lbWNweSA9IHRydWU7CiAgICAgICAgIHN0YXRpYyBj
b25zdCBib29sIGNhbkNvcHlXaXRoTWVtY3B5ID0gdHJ1ZTsKLSAgICAgICAgc3RhdGljIGNvbnN0
IGJvb2wgY2FuRmlsbFdpdGhNZW1zZXQgPSBzaXplb2YoVCkgPT0gc2l6ZW9mKGNoYXIpOworICAg
ICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5GaWxsV2l0aE1lbXNldCA9IHNpemVvZihUKSA9PSBz
aXplb2YoY2hhcikgJiYgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWU7CiAgICAgICAgIHN0YXRp
YyBjb25zdCBib29sIGNhbkNvbXBhcmVXaXRoTWVtY21wID0gdHJ1ZTsKICAgICB9OwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>284143</attachid>
            <date>2016-07-20 13:29:32 -0700</date>
            <delta_ts>2016-07-21 14:33:34 -0700</delta_ts>
            <desc>works like a charm</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>62828</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAzNDQyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBA
QAorMjAxNi0wNy0xOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAg
IEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgdGVhY2hlcyBCMyBo
b3cgdG8gY29tcGlsZSBwcm9jZWR1cmVzIHdpdGggbXVsdGlwbGUgZW50cnlwb2ludHMgaW4gdGhl
IGJlc3Qgd2F5IGV2ZXIuCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBvaW50cyBh
cmUgdXNlZnVsLiBXZSBjb3VsZCB1c2UgdGhlbSB0byByZWR1Y2UgdGhlIGNvc3Qgb2YgY29tcGls
aW5nIE9TUgorICAgICAgICBlbnRyeXBvaW50cy4gV2UgY291bGQgdXNlIHRoZW0gdG8gaW1wbGVt
ZW50IGJldHRlciB0cnkvY2F0Y2guCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBv
aW50cyBhcmUgaGFyZCB0byBzdXBwb3J0LiBBbGwgb2YgYSBzdWRkZW4sIGFsbCBvZiB0aGUgY29k
ZSB0aGF0IGFzc3VtZWQKKyAgICAgICAgdGhhdCB0aGUgcm9vdCBibG9jayBpcyB0aGUgZW50cnlw
b2ludCB3b3VsZCBoYXZlIHRvIGJlIGNoYW5nZWQuIFRyYW5zZm9ybWF0aW9ucyBsaWtlCisgICAg
ICAgIG1vdmVDb25zdGFudHMoKSB3b3VsZCBoYXZlIHRvIGRvIGNyYXp5IHRoaW5ncyBpZiB0aGUg
ZXhpc3RlbmNlIG9mIG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIHByZXZlbnRlZCBpdCBm
cm9tIGZpbmRpbmcgYSBzaW5nbGUgY29tbW9uIGRvbWluYXRvci4KKyAgICAgICAgCisgICAgICAg
IFRoZXJlZm9yZSwgd2Ugd2FudCB0byBhZGQgbXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aG91dCBh
Y3R1YWxseSB0ZWFjaGluZyB0aGUgY29tcGlsZXIgdGhhdAorICAgICAgICB0aGVyZSBpcyBzdWNo
IGEgdGhpbmcuIFRoYXQncyBzb3J0IG9mIHdoYXQgdGhpcyBjaGFuZ2UgZG9lcy4KKyAgICAgICAg
CisgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBvcGNvZGUgdG8gYm90aCBCMyBhbmQgQWlyIGNhbGxl
ZCBFbnRyeVN3aXRjaC4gSXQncyBhIHRlcm1pbmFsIHRoYXQgdGFrZXMKKyAgICAgICAgb25lIG9y
IG1vcmUgc3VjY2Vzc29ycyBhbmQgbm8gdmFsdWUgY2hpbGRyZW4uIFRoZSBudW1iZXIgb2Ygc3Vj
Y2Vzc29ycyBtdXN0IG1hdGNoCisgICAgICAgIFByb2NlZHVyZTo6bnVtRW50cnlwb2ludHMoKSwg
d2hpY2ggY291bGQgYmUgYXJiaXRyYXJpbHkgbGFyZ2UuIFRoZSBzZW1hbnRpY3Mgb2YgRW50cnlT
d2l0Y2gKKyAgICAgICAgYXJlOgorICAgICAgICAKKyAgICAgICAgLSBFYWNoIG9mIHRoZSBlbnRy
eXBvaW50cyBzZXRzIGEgaGlkZGVuIEVudHJ5IHZhcmlhYmxlIHRvIHRoYXQgZW50cnlwb2ludCdz
IGluZGV4IGFuZCBqdW1wcworICAgICAgICAgIHRvIHRoZSBwcm9jZWR1cmUncyByb290IGJsb2Nr
LgorICAgICAgICAKKyAgICAgICAgLSBBbiBFbnRyeVN3aXRjaCBpcyBhIHN3aXRjaCBzdGF0ZW1l
bnQgb3ZlciB0aGlzIGhpZGRlbiBFbnRyeSB2YXJpYWJsZS4KKyAgICAgICAgCisgICAgICAgIFRo
ZSB3YXkgdGhhdCB3ZSBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyBpcyB0aGF0IEFpciBoYXMgYSB2
ZXJ5IGxhdGUgcGhhc2UgLSBhZnRlciBhbGwKKyAgICAgICAgcmVnaXN0ZXIgYW5kIHN0YWNrIGxh
eW91dCAtIHRoYXQgY2xvbmVzIGFsbCBjb2RlIHdoZXJlIHRoZSBFbnRyeSB2YXJpYWJsZSBpcyBs
aXZlOyBpLmUgYWxsCisgICAgICAgIGNvZGUgaW4gdGhlIGNsb3N1cmUgb3ZlciBwcmVkZWNlc3Nv
cnMgb2YgYWxsIGJsb2NrcyB0aGF0IGRvIEVudHJ5U3dpdGNoLgorICAgICAgICAKKyAgICAgICAg
VXN1YWxseSwgeW91IHdvdWxkIHVzZSB0aGlzIGJ5IGNyZWF0aW5nIGFuIEVudHJ5U3dpdGNoIGlu
IHRoZSByb290IGJsb2NrLCBidXQgeW91IGRvbid0CisgICAgICAgIGhhdmUgdG8gZG8gdGhhdC4g
SnVzdCByZW1lbWJlciB0aGF0IHRoZSBjb2RlIGJlZm9yZSBFbnRyeVN3aXRjaCBnZXRzIGNsb25l
ZCBmb3IgZWFjaAorICAgICAgICBlbnRyeXBvaW50LiBXZSBhbGxvdyBjbG9uaW5nIG9mIGFuIGFy
Yml0cmFyaWx5IGxhcmdlIGFtb3VudCBvZiBjb2RlIGJlY2F1c2UgcmVzdHJpY3RpbmcgaXQsCisg
ICAgICAgIGFuZCBzbyByZXN0cmljaW5nIHRoZSBwbGFjZW1lbnQgb2YgRW50cnlTd2l0Y2hlcywg
d291bGQgYmUgdW5lbGVnYW50LiBJdCB3b3VsZCBiZSBoYXJkIHRvCisgICAgICAgIHByZXNlcnZl
IHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGxvd2Vy
IGFueSB2YWx1ZSBiZWZvcmUgYW4KKyAgICAgICAgRW50cnlTd2l0Y2ggdG8gYSBjb250cm9sIGZs
b3cgZGlhbW9uZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZ2l2ZXMgdXMgYW4gZWFz
eS10by11c2Ugd2F5IHRvIHVzZSBCMyB0byBjb21waWxlIGNvZGUgd2l0aCBtdWx0aXBsZSBlbnRy
eXBvaW50cy4KKyAgICAgICAgSW5zaWRlIHRoZSBjb21waWxlciwgb25seSBjb2RlIHRoYXQgcnVu
cyB2ZXJ5IGxhdGUgaW4gQWlyIGhhcyB0byBrbm93IGFib3V0IHRoaXMgZmVhdHVyZS4KKyAgICAg
ICAgV2UgZ2V0IHRoZSBiZXN0IG9mIGJvdGggd29ybGRzIQorCisgICAgICAgICogQ01ha2VMaXN0
cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ajoKKyAgICAgICAgKiBiMy9CM0Jhc2ljQmxvY2tVdGlscy5oOgorICAgICAgICAoSlNDOjpCMzo6
dXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIpOgorICAgICAgICAoSlNDOjpCMzo6Y2xlYXJQcmVkZWNl
c3NvcnMpOgorICAgICAgICAoSlNDOjpCMzo6cmVjb21wdXRlUHJlZGVjZXNzb3JzKToKKyAgICAg
ICAgKiBiMy9CM0ZyZXF1ZW5jeUNsYXNzLmg6CisgICAgICAgIChKU0M6OkIzOjptYXhGcmVxdWVu
Y3kpOgorICAgICAgICAqIGIzL0IzR2VuZXJhdGUuaDoKKyAgICAgICAgKiBiMy9CM0xvd2VyVG9B
aXIuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMb3dlclRvQWlyOjpsb3dlcik6CisgICAg
ICAgICogYjMvQjNNb3ZlQ29uc3RhbnRzLmNwcDoKKyAgICAgICAgKiBiMy9CM09wY29kZS5jcHA6
CisgICAgICAgIChXVEY6OnByaW50SW50ZXJuYWwpOgorICAgICAgICAqIGIzL0IzT3Bjb2RlLmg6
CisgICAgICAgICogYjMvQjNQcm9jZWR1cmUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6UHJvY2Vk
dXJlOjppc0Zhc3RDb25zdGFudCk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmVudHJ5
cG9pbnRMYWJlbCk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmFkZERhdGFTZWN0aW9u
KToKKyAgICAgICAgKiBiMy9CM1Byb2NlZHVyZS5oOgorICAgICAgICAoSlNDOjpCMzo6UHJvY2Vk
dXJlOjpudW1FbnRyeXBvaW50cyk6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OnNldE51
bUVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6c2V0TGFzdFBoYXNl
TmFtZSk6CisgICAgICAgICogYjMvQjNWYWxpZGF0ZS5jcHA6CisgICAgICAgICogYjMvQjNWYWx1
ZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpWYWx1ZTo6ZWZmZWN0cyk6CisgICAgICAgIChKU0M6
OkIzOjpWYWx1ZTo6dHlwZUZvcik6CisgICAgICAgICogYjMvQjNWYWx1ZS5oOgorICAgICAgICAq
IGIzL2Fpci9BaXJDb2RlLmNwcDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6Y0NhbGxT
cGVjaWFsKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6aXNFbnRyeXBvaW50KToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6cmVzZXRSZWFjaGFiaWxpdHkpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjpDb2RlOjpkdW1wKToKKyAgICAgICAgKiBiMy9haXIvQWlyQ29kZS5oOgor
ICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpzZXRGcmFtZVNpemUpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpDb2RlOjpudW1FbnRyeXBvaW50cyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6
OkNvZGU6OmVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlw
b2ludCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNvZGU6OnNldEVudHJ5cG9pbnRzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlwb2ludExhYmVsKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6Q29kZTo6c2V0RW50cnlwb2ludExhYmVscyk6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6OkNvZGU6OmNhbGxlZVNhdmVSZWdpc3RlcnMpOgorICAgICAgICAqIGIzL2Fpci9BaXJD
dXN0b20uaDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6UGF0Y2hDdXN0b206OmlzVGVybWluYWwp
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpQYXRjaEN1c3RvbTo6aGFzTm9uQXJnRWZmZWN0cyk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpoYXNOb25BcmdOb25Db250cm9s
RWZmZWN0cyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpnZW5lcmF0ZSk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNvbW1vbkN1c3RvbUJhc2U6Omhhc05vbkFyZ0VmZmVj
dHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDQ2FsbEN1c3RvbTo6Zm9yRWFjaEFyZyk6Cisg
ICAgICAgIChKU0M6OkIzOjpBaXI6OkNvbGRDQ2FsbEN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OlNodWZmbGVDdXN0b206OmZvckVhY2hBcmcpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjpFbnRyeVN3aXRjaEN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAgICAgIChK
U0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1ZhbGlkRm9ybVN0YXRpYyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1ZhbGlkRm9ybSk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjphZG1pdHNTdGFjayk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkVudHJ5U3dpdGNoQ3VzdG9tOjppc1Rlcm1pbmFsKToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xF
ZmZlY3RzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206OmdlbmVy
YXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlyR2VuZXJhdGUuY3BwOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpwcmVwYXJlRm9yR2VuZXJhdGlvbik6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Omdl
bmVyYXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA6IEFkZGVk
LgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpsb3dlckVudHJ5U3dpdGNoKToKKyAgICAgICAgKiBi
My9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oOiBBZGRlZC4KKyAgICAgICAgKiBiMy9haXIvQWly
T3Bjb2RlLm9wY29kZXM6CisgICAgICAgICogYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5j
cHA6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OmJsb2Nrc0luT3B0aW1pemVkT3JkZXIpOgorICAg
ICAgICAqIGIzL2Fpci9BaXJTcGVjaWFsLmNwcDoKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6U3Bl
Y2lhbDo6aXNUZXJtaW5hbCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlNwZWNpYWw6Omhhc05v
bkFyZ0VmZmVjdHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpTcGVjaWFsOjpoYXNOb25BcmdO
b25Db250cm9sRWZmZWN0cyk6CisgICAgICAgICogYjMvYWlyL0FpclNwZWNpYWwuaDoKKyAgICAg
ICAgKiBiMy9haXIvQWlyVmFsaWRhdGUuY3BwOgorICAgICAgICAqIGIzL2Fpci9vcGNvZGVfZ2Vu
ZXJhdG9yLnJiOgorICAgICAgICAqIGIzL3Rlc3RiMy5jcHA6CisgICAgICAgIChKU0M6OkIzOjpj
b21waWxlKToKKyAgICAgICAgKEpTQzo6QjM6Omludm9rZSk6CisgICAgICAgIChKU0M6OkIzOjpj
b21waWxlQW5kUnVuKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RSZXNldFJlYWNoYWJpbGl0eURh
bmdsaW5nUmVmZXJlbmNlKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RFbnRyeVN3aXRjaFNpbXBs
ZSk6CisgICAgICAgIChKU0M6OkIzOjp6ZXJvKToKKyAgICAgICAgKEpTQzo6QjM6Om5lZ2F0aXZl
WmVybyk6CisgICAgICAgIChKU0M6OkIzOjpydW4pOgorCiAyMDE2LTA3LTE5ICBGaWxpcCBQaXps
byAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAgVGhlIGRlZmF1bHQgdGVzdGluZyBtb2Rl
IHNob3VsZCBub3QgaW52b2x2ZSBkaXNhYmxpbmcgdGhlIEZUTCBKSVQKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODksNiArODksNyBA
QCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5jcHAKICAgICBiMy9haXIvQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAK
ICAgICBiMy9haXIvQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmNwcAorICAgIGIzL2Fpci9BaXJMb3dl
ckVudHJ5U3dpdGNoLmNwcAogICAgIGIzL2Fpci9BaXJMb3dlck1hY3Jvcy5jcHAKICAgICBiMy9h
aXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcAogICAgIGIzL2Fpci9BaXJQaGFzZVNjb3BlLmNw
cApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDIwMzQ0MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC02OTgsNiArNjk4LDggQEAKIAkJMEZEQjJDRUExNzQ4
OTZDNzAwN0IzQzFCIC8qIENvbmN1cnJlbnRKSVRMb2NrLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRCMkNFOTE3NDg5NkM3MDA3QjNDMUIgLyogQ29u
Y3VycmVudEpJVExvY2suaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRkREQkZCNTE2NjZFRUQ4MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NE
YXRhRHVtcC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRkREQkZCMjE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5j
cHAgKi87IH07CiAJCTBGRERCRkI2MTY2NkVFREEwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vz
c0RhdGFEdW1wLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRkREQkZCMzE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5o
ICovOyB9OworCQkwRkRGNzA4NTFEM0YyQzIyMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRj
aC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRG
NzA4MzFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAgKi87IH07CisJ
CTBGREY3MDg2MUQzRjJDMjUwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkRGNzA4NDFEM0YyQzFG
MDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5oICovOyB9OwogCQkwRkUwNTAxNDFBQTkw
OTExMDBEMzNCMzMgLyogQXJndW1lbnRzTW9kZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZFMDUwMEMxQUE5MDkxMTAwRDMzQjMzIC8qIEFyZ3VtZW50
c01vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9Owog
CQkwRkUwNTAxNTFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRTA1MDBEMUFB
OTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwICovOyB9OwogCQkwRkUw
NTAxNjFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkUwNTAwRTFBQTkwOTExMDBE
MzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTI4OTYsNiArMjg5OCw4IEBACiAJCTBGREIyQ0U5
MTc0ODk2QzcwMDdCM0MxQiAvKiBDb25jdXJyZW50SklUTG9jay5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBDb25jdXJyZW50SklUTG9jay5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkwRkREQkZCMjE2NjZFRUQ1MDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NE
YXRhRHVtcC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBERkdWYXJp
YWJsZUFjY2Vzc0RhdGFEdW1wLmNwcDsgcGF0aCA9IGRmZy9ERkdWYXJpYWJsZUFjY2Vzc0RhdGFE
dW1wLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZEREJGQjMxNjY2RUVENTAw
QzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oOyBwYXRoID0gZGZnL0RG
R1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEZERjcwODMxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA7
IHBhdGggPSBiMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTBGREY3MDg0MUQzRjJDMUYwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dp
dGNoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckxvd2VyRW50cnlTd2l0
Y2guaDsgcGF0aCA9IGIzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTBGRTA1MDBDMUFBOTA5MTEwMEQzM0IzMyAvKiBBcmd1bWVudHNNb2Rl
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFyZ3VtZW50c01vZGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZFMDUwMEQxQUE5MDkxMTAwRDMzQjMzIC8qIERp
cmVjdEFyZ3VtZW50c09mZnNldC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkwRkUwNTAwRTFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRzT2Zmc2V0Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERpcmVjdEFyZ3VtZW50c09mZnNldC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDg5Myw2ICs0ODk3LDggQEAKIAkJCQkw
RkUzNEMxODFDNEIzOUFFMDAwM0E1MTIgLyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oICovLAog
CQkJCTBGNjE4MzI1MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlckFmdGVyUmVnQWxsb2MuY3Bw
ICovLAogCQkJCTBGNjE4MzI2MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlckFmdGVyUmVnQWxs
b2MuaCAqLywKKwkJCQkwRkRGNzA4MzFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3
aXRjaC5jcHAgKi8sCisJCQkJMEZERjcwODQxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50
cnlTd2l0Y2guaCAqLywKIAkJCQkwRjYxODMyNzFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJN
YWNyb3MuY3BwICovLAogCQkJCTBGNjE4MzI4MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlck1h
Y3Jvcy5oICovLAogCQkJCTI2NDA5MUZBMUJFMkZENDEwMDY4NERCMiAvKiBBaXJPcGNvZGUub3Bj
b2RlcyAqLywKQEAgLTgwNjUsNiArODA3MSw3IEBACiAJCQkJQkMxOEM0NjMwRTE2RjVDRDAwQjM0
NDYwIC8qIFNvdXJjZVByb3ZpZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlFNDlEQzE2QzEyRUYy
OTRFMDAxODRBMUYgLyogU291cmNlUHJvdmlkZXJDYWNoZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
RTQ5REMxNkQxMkVGMjk1MzAwMTg0QTFGIC8qIFNvdXJjZVByb3ZpZGVyQ2FjaGVJdGVtLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRkRGNzA4NjFEM0YyQzI1MDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRy
eVN3aXRjaC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCN0YzOUUxNUVEOEU0NjAwRjE2N0IyIC8q
IFNwYXJzZUFycmF5VmFsdWVNYXAuaCBpbiBIZWFkZXJzICovLAogCQkJCUE3Mzg2NTU0MTE4Njk3
QjQwMDU0MDI3OSAvKiBTcGVjaWFsaXplZFRodW5rSklULmggaW4gSGVhZGVycyAqLywKIAkJCQkw
RjU1NDFCMjE2MTNDMUZCMDBDRTNFMjUgLyogU3BlY2lhbFBvaW50ZXIuaCBpbiBIZWFkZXJzICov
LApAQCAtOTM3MCw2ICs5Mzc3LDcgQEAKIAkJCQkwRjI0RTU1MDE3RUUyNzQ5MDBBQkIyMTcgLyog
UmVwYXRjaC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjZCOEFEODFDNEVEREEyMDA5NjkwNTIg
LyogQjNEdXBsaWNhdGVUYWlscy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1Mjc3NzNERTFBQUY4
M0FDMDBCREU3RTggLyogUnVudGltZVR5cGUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEZERjcw
ODUxRDNGMkMyMjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJMEY3NzAwOTIxNDAyRkYzQzAwNzhFQjM5IC8qIFNhbXBsaW5nQ291bnRlci5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk3OTA1QkI2ODFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNj
ZXNzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRTA1MDI3MUFBOTA5NTYwMEQzM0IzMyAvKiBT
Y29wZWRBcmd1bWVudHMuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTk2LDggKzk2LDgg
QEAgcHVibGljOgogICAgIAogICAgIHZvaWQgY2xlYXJTdWNjZXNzb3JzKCk7CiAgICAgSlNfRVhQ
T1JUX1BSSVZBVEUgdm9pZCBhcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJsb2NrKTsKLSAgICB2
b2lkIHNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2NrKTsKLSAgICB2b2lkIHNldFN1Y2Nlc3Nv
cnMoRnJlcXVlbnRlZEJsb2NrLCBGcmVxdWVudGVkQmxvY2spOworICAgIEpTX0VYUE9SVF9QUklW
QVRFIHZvaWQgc2V0U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2spOworICAgIEpTX0VYUE9SVF9Q
UklWQVRFIHZvaWQgc2V0U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2ssIEZyZXF1ZW50ZWRCbG9j
ayk7CiAKICAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3JCbG9jayh1bnNpZ25lZCBpbmRleCkgY29u
c3QgeyByZXR1cm4gc3VjY2Vzc29yKGluZGV4KS5ibG9jaygpOyB9CiAgICAgQmFzaWNCbG9jayom
IHN1Y2Nlc3NvckJsb2NrKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBzdWNjZXNzb3IoaW5kZXgp
LmJsb2NrKCk7IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxvY2tV
dGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxv
Y2tVdGlscy5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
QjNCYXNpY0Jsb2NrVXRpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtODYsMTQgKzg2LDE4IEBAIHZv
aWQgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIoQmFzaWNCbG9jayoKIH0KIAogdGVtcGxhdGU8dHlw
ZW5hbWUgQmFzaWNCbG9jaz4KLXZvaWQgcmVjb21wdXRlUHJlZGVjZXNzb3JzKFZlY3RvcjxzdGQ6
OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCit2b2lkIGNsZWFyUHJlZGVjZXNzb3Jz
KFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCiB7Ci0gICAgLy8g
Q2xlYXIgYWxsIHByZWRlY2Vzc29yIGxpc3RzIGZpcnN0LgogICAgIGZvciAoYXV0byYgYmxvY2sg
OiBibG9ja3MpIHsKICAgICAgICAgaWYgKGJsb2NrKQogICAgICAgICAgICAgYmxvY2stPnByZWRl
Y2Vzc29ycygpLnJlc2l6ZSgwKTsKICAgICB9Cit9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2lj
QmxvY2s+Cit2b2lkIHJlY29tcHV0ZVByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRy
PEJhc2ljQmxvY2s+PiYgYmxvY2tzKQoreworICAgIGNsZWFyUHJlZGVjZXNzb3JzKGJsb2Nrcyk7
CiAgICAgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIoYmxvY2tzWzBdLmdldCgpKTsKIH0KIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5oCShyZXZpc2lv
biAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5o
CSh3b3JraW5nIGNvcHkpCkBAIC00Myw2ICs0MywxMyBAQCBlbnVtIGNsYXNzIEZyZXF1ZW5jeUNs
YXNzIDogdWludDhfdCB7CiAgICAgUmFyZQogfTsKIAoraW5saW5lIEZyZXF1ZW5jeUNsYXNzIG1h
eEZyZXF1ZW5jeShGcmVxdWVuY3lDbGFzcyBhLCBGcmVxdWVuY3lDbGFzcyBiKQoreworICAgIGlm
IChhID09IEZyZXF1ZW5jeUNsYXNzOjpOb3JtYWwpCisgICAgICAgIHJldHVybiBGcmVxdWVuY3lD
bGFzczo6Tm9ybWFsOworICAgIHJldHVybiBiOworfQorCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6
QjMKIAogbmFtZXNwYWNlIFdURiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNH
ZW5lcmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0dlbmVy
YXRlLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0dl
bmVyYXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0
IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxNS0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzksMTIgKzM5LDEyIEBAIG5hbWVzcGFjZSBBaXIgeyBj
bGFzcyBDb2RlOyB9CiAKIC8vIFRoaXMgdGFrZXMgYSBCMzo6UHJvY2VkdXJlLCBvcHRpbWl6ZXMg
aXQgaW4tcGxhY2UsIGxvd2VycyBpdCB0byBBaXIsIGFuZCBwcmVwYXJlcyB0aGUgQWlyIGZvcgog
Ly8gZ2VuZXJhdGlvbi4KLXZvaWQgcHJlcGFyZUZvckdlbmVyYXRpb24oUHJvY2VkdXJlJiwgdW5z
aWduZWQgb3B0TGV2ZWwgPSAxKTsKK0pTX0VYUE9SVF9QUklWQVRFIHZvaWQgcHJlcGFyZUZvckdl
bmVyYXRpb24oUHJvY2VkdXJlJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAogLy8gVGhpcyB0
YWtlcyBhIEIzOjpQcm9jZWR1cmUgdGhhdCBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgZ2VuZXJhdGlv
biAoaS5lLiBpdCBoYXMgYmVlbiBsb3dlcmVkIHRvIEFpciBhbmQKIC8vIHRoZSBBaXIgaGFzIGJl
ZW4gcHJlcGFyZWQgZm9yIGdlbmVyYXRpb24pIGFuZCBnZW5lcmF0ZXMgaXQuIFRoaXMgaXMgdGhl
IGVxdWl2YWxlbnQgb2YgY2FsbGluZwogLy8gQWlyOjpnZW5lcmF0ZSgpIG9uIHRoZSBQcm9jZWR1
cmU6OmNvZGUoKS4KLXZvaWQgZ2VuZXJhdGUoUHJvY2VkdXJlJiwgQ0NhbGxIZWxwZXJzJik7CitK
U19FWFBPUlRfUFJJVkFURSB2b2lkIGdlbmVyYXRlKFByb2NlZHVyZSYsIENDYWxsSGVscGVycyYp
OwogCiAvLyBUaGlzIHRha2VzIGEgQjM6OlByb2NlZHVyZSwgb3B0aW1pemVzIGl0IGluLXBsYWNl
LCBhbmQgbG93ZXJzIGl0IHRvIEFpci4gWW91IGNhbiB0aGVuIGdlbmVyYXRlCiAvLyB0aGUgQWly
IHRvIG1hY2hpbmUgY29kZSB1c2luZyBBaXI6OnByZXBhcmVGb3JHZW5lcmF0aW9uKCkgYW5kIEFp
cjo6Z2VuZXJhdGUoKSBvbiB0aGUgUHJvY2VkdXJlJ3MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0xvd2VyVG9BaXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0xvd2VyVG9BaXIuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ0NSw2
ICsyNDQ1LDExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBhcHBlbmQoQWlyOjpPb3BzKTsKICAg
ICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2Ug
QjM6OkVudHJ5U3dpdGNoOiB7CisgICAgICAgICAgICBhcHBlbmQoQWlyOjpFbnRyeVN3aXRjaCk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAg
ICAgICAgICAgYnJlYWs7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNb3ZlQ29u
c3RhbnRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNb3Zl
Q29uc3RhbnRzLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzTW92ZUNvbnN0YW50cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAg
cHVibGljOgogICAgICAgICAKICAgICAgICAgaG9pc3RDb25zdGFudHMoCiAgICAgICAgICAgICBb
Jl0gKGNvbnN0IFZhbHVlS2V5JiBrZXkpIC0+IGJvb2wgewotICAgICAgICAgICAgICAgIHJldHVy
biBrZXkub3Bjb2RlKCkgPT0gQ29uc3QzMiB8fCBrZXkub3Bjb2RlKCkgPT0gQ29uc3Q2NDsKKyAg
ICAgICAgICAgICAgICByZXR1cm4ga2V5Lm9wY29kZSgpID09IENvbnN0MzIgfHwga2V5Lm9wY29k
ZSgpID09IENvbnN0NjQgfHwga2V5Lm9wY29kZSgpID09IEFyZ3VtZW50UmVnOwogICAgICAgICAg
ICAgfSk7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJ
KHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI5MCw2ICsyOTAsOSBAQCB2b2lkIHByaW50SW50ZXJuYWwo
UHJpbnRTdHJlYW0mIG91dCwgT3BjCiAgICAgY2FzZSBTd2l0Y2g6CiAgICAgICAgIG91dC5wcmlu
dCgiU3dpdGNoIik7CiAgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAg
ICAgICBvdXQucHJpbnQoIkVudHJ5U3dpdGNoIik7CisgICAgICAgIHJldHVybjsKICAgICBjYXNl
IFJldHVybjoKICAgICAgICAgb3V0LnByaW50KCJSZXR1cm4iKTsKICAgICAgICAgcmV0dXJuOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
MTYsNiArMjE2LDExIEBAIGVudW0gT3Bjb2RlIDogaW50MTZfdCB7CiAKICAgICAvLyBTd2l0Y2gu
IFN3aXRjaGVzIG92ZXIgZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1
ZSBjbGFzcy4KICAgICBTd2l0Y2gsCisgICAgCisgICAgLy8gTXVsdGlwbGUgZW50cnlwb2ludCBh
cmUgc3VwcG9ydGVkIHZpYSB0aGUgRW50cnlTd2l0Y2ggb3BlcmF0aW9uLiBQbGFjZSB0aGlzIGlu
IHRoZSByb290CisgICAgLy8gYmxvY2sgYW5kIGxpc3QgdGhlIGVudHJ5cG9pbnRzIGFzIHRoZSBz
dWNjZXNzb3JzLiBBbGwgYmxvY2tzIGJhY2t3YXJkcy1yZWFjaGFibGUgZnJvbQorICAgIC8vIEVu
dHJ5U3dpdGNoIGFyZSBkdXBsaWNhdGVkIGZvciBlYWNoIGVudHJ5cG9pbnQuCisgICAgRW50cnlT
d2l0Y2gsCiAKICAgICAvLyBSZXR1cm4uIE5vdGUgdGhhdCBCMyBwcm9jZWR1cmVzIGRvbid0IGtu
b3cgdGhlaXIgcmV0dXJuIHR5cGUsIHNvIHRoaXMgY2FuIGp1c3QgcmV0dXJuIGFueQogICAgIC8v
IHR5cGUuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5jcHAJKHJl
dmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI4MCw2ICsyODAsMTEgQEAgYm9vbCBQcm9jZWR1cmU6Omlz
RmFzdENvbnN0YW50KGNvbnN0IFZhbAogICAgIHJldHVybiBtX2Zhc3RDb25zdGFudHMuY29udGFp
bnMoY29uc3RhbnQpOwogfQogCitDQ2FsbEhlbHBlcnM6OkxhYmVsIFByb2NlZHVyZTo6ZW50cnlw
b2ludExhYmVsKHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBtX2NvZGUtPmVu
dHJ5cG9pbnRMYWJlbChpbmRleCk7Cit9CisKIHZvaWQqIFByb2NlZHVyZTo6YWRkRGF0YVNlY3Rp
b24oc2l6ZV90IHNpemUpCiB7CiAgICAgaWYgKCFzaXplKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzUHJvY2VkdXJlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL0IzUHJvY2VkdXJlLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBA
CiAjaW5jbHVkZSAiQjNTcGFyc2VDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiQjNUeXBlLmgiCiAj
aW5jbHVkZSAiQjNWYWx1ZUtleS5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1
ZGUgIlB1cmVOYU4uaCIKICNpbmNsdWRlICJSZWdpc3RlckF0T2Zmc2V0TGlzdC5oIgogI2luY2x1
ZGUgPHd0Zi9CYWcuaD4KQEAgLTU3LDYgKzU4LDEzIEBAIGNsYXNzIFZhcmlhYmxlOwogCiBuYW1l
c3BhY2UgQWlyIHsgY2xhc3MgQ29kZTsgfQogCisvLyBUaGlzIHJlcHJlc2VudHMgQjMncyB2aWV3
IG9mIGEgcGllY2Ugb2YgY29kZS4gTm90ZSB0aGF0IHRoaXMgb2JqZWN0IG11c3QgZXhpc3QgaW4g
YSAxOjEKKy8vIHJlbGF0aW9uc2hpcCB3aXRoIEFpcjo6Q29kZS4gQjM6OlByb2NlZHVyZSBhbmQg
QWlyOjpDb2RlIGFyZSBqdXN0IGRpZmZlcmVudCBmYWNhZGVzIG9mIHRoZSBCMworLy8gY29tcGls
ZXIncyBrbm93bGVkZ2UgYWJvdXQgYSBwaWVjZSBvZiBjb2RlLiBTb21lIGtpbmRzIG9mIHN0YXRl
IGFyZW4ndCBwZXJmZWN0IGZpdHMgZm9yIGVpdGhlcgorLy8gUHJvY2VkdXJlIG9yIENvZGUsIGFu
ZCBhcmUgcGxhY2VkIGluIG9uZSBvciB0aGUgb3RoZXIgYmFzZWQgb24gY29udmVuaWVuY2UuIFBy
b2NlZHVyZSBhbHdheXMKKy8vIGFsbG9jYXRlcyBhIENvZGUsIGFuZCBhIENvZGUgY2Fubm90IGJl
IGFsbG9jYXRlZCB3aXRob3V0IGFuIG93bmluZyBQcm9jZWR1cmUgYW5kIHRoZXkgYWx3YXlzCisv
LyBoYXZlIHJlZmVyZW5jZXMgdG8gZWFjaCBvdGhlci4KKwogY2xhc3MgUHJvY2VkdXJlIHsKICAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShQcm9jZWR1cmUpOwogICAgIFdURl9NQUtFX0ZBU1RfQUxM
T0NBVEVEOwpAQCAtMjA5LDYgKzIxNywxNCBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGFkZEZhc3RD
b25zdGFudChjb25zdCBWYWx1ZUtleSYpOwogICAgIGJvb2wgaXNGYXN0Q29uc3RhbnQoY29uc3Qg
VmFsdWVLZXkmKTsKKyAgICAKKyAgICB1bnNpZ25lZCBudW1FbnRyeXBvaW50cygpIGNvbnN0IHsg
cmV0dXJuIG1fbnVtRW50cnlwb2ludHM7IH0KKyAgICB2b2lkIHNldE51bUVudHJ5cG9pbnRzKHVu
c2lnbmVkIG51bUVudHJ5cG9pbnRzKSB7IG1fbnVtRW50cnlwb2ludHMgPSBudW1FbnRyeXBvaW50
czsgfQorICAgIAorICAgIC8vIE9ubHkgY2FsbCB0aGlzIGFmdGVyIGNvZGUgZ2VuZXJhdGlvbiBp
cyBjb21wbGV0ZS4gTm90ZSB0aGF0IHRoZSBsYWJlbCBmb3IgdGhlIDB0aCBlbnRyeXBvaW50Cisg
ICAgLy8gc2hvdWxkIHBvaW50IHRvIGV4YWN0bHkgd2hlcmUgdGhlIGNvZGUgZ2VuZXJhdGlvbiBj
dXJzb3Igd2FzIGJlZm9yZSB5b3Ugc3RhcnRlZCBnZW5lcmF0aW5nCisgICAgLy8gY29kZS4KKyAg
ICBKU19FWFBPUlRfUFJJVkFURSBDQ2FsbEhlbHBlcnM6OkxhYmVsIGVudHJ5cG9pbnRMYWJlbCh1
bnNpZ25lZCBlbnRyeXBvaW50SW5kZXgpIGNvbnN0OwogCiAgICAgLy8gVGhlIG5hbWUgaGFzIHRv
IGJlIGEgc3RyaW5nIGxpdGVyYWwsIHNpbmNlIHdlIGRvbid0IGRvIGFueSBtZW1vcnkgbWFuYWdl
bWVudCBmb3IgdGhlIHN0cmluZy4KICAgICB2b2lkIHNldExhc3RQaGFzZU5hbWUoY29uc3QgY2hh
ciogbmFtZSkKQEAgLTI2MSw2ICsyNzcsNyBAQCBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0
cjxDRkc+IG1fY2ZnOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxEb21pbmF0b3JzPiBtX2RvbWluYXRv
cnM7CiAgICAgSGFzaFNldDxWYWx1ZUtleT4gbV9mYXN0Q29uc3RhbnRzOworICAgIHVuc2lnbmVk
IG1fbnVtRW50cnlwb2ludHMgeyAxIH07CiAgICAgY29uc3QgY2hhciogbV9sYXN0UGhhc2VOYW1l
OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxPcGFxdWVCeXByb2R1Y3RzPiBtX2J5cHJvZHVjdHM7CiAg
ICAgc3RkOjp1bmlxdWVfcHRyPEFpcjo6Q29kZT4gbV9jb2RlOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFsaWRhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFsaWRhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MTMsNyAr
NDEzLDEzIEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBp
IDwgY2FzZVZhbHVlcy5zaXplKCk7ICsraSkKICAgICAgICAgICAgICAgICAgICAgVkFMSURBVEUo
Y2FzZVZhbHVlc1tpIC0gMV0gIT0gY2FzZVZhbHVlc1tpXSwgKCJBdCAiLCAqdmFsdWUsICIsIGNh
c2VWYWx1ZSA9ICIsIGNhc2VWYWx1ZXNbaV0pKTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIH0gfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBFbnRyeVN3aXRj
aDoKKyAgICAgICAgICAgICAgICBWQUxJREFURSghdmFsdWUtPm51bUNoaWxkcmVuKCksICgiQXQg
IiwgKnZhbHVlKSk7CisgICAgICAgICAgICAgICAgVkFMSURBVEUodmFsdWUtPnR5cGUoKSA9PSBW
b2lkLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbHVlT3du
ZXIuZ2V0KHZhbHVlKS0+bnVtU3VjY2Vzc29ycygpID09IG1fcHJvY2VkdXJlLm51bUVudHJ5cG9p
bnRzKCksICgiQXQgIiwgKnZhbHVlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CiAKICAgICAgICAgICAgIFZBTElEQVRFKCEodmFsdWUtPmVmZmVjdHMoKS53cml0ZXMg
JiYgdmFsdWUtPmtleSgpKSwgKCJBdCAiLCAqdmFsdWUpKTsKICAgICAgICAgfQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MTIsNiAr
NjEyLDcgQEAgRWZmZWN0cyBWYWx1ZTo6ZWZmZWN0cygpIGNvbnN0CiAgICAgY2FzZSBTd2l0Y2g6
CiAgICAgY2FzZSBSZXR1cm46CiAgICAgY2FzZSBPb3BzOgorICAgIGNhc2UgRW50cnlTd2l0Y2g6
CiAgICAgICAgIHJlc3VsdC50ZXJtaW5hbCA9IHRydWU7CiAgICAgICAgIGJyZWFrOwogICAgIH0K
QEAgLTc3NSw2ICs3NzYsNyBAQCBUeXBlIFZhbHVlOjp0eXBlRm9yKE9wY29kZSBvcGNvZGUsIFZh
bHVlCiAgICAgY2FzZSBCcmFuY2g6CiAgICAgY2FzZSBSZXR1cm46CiAgICAgY2FzZSBPb3BzOgor
ICAgIGNhc2UgRW50cnlTd2l0Y2g6CiAgICAgICAgIHJldHVybiBWb2lkOwogICAgIGNhc2UgU2Vs
ZWN0OgogICAgICAgICBBU1NFUlQoc2Vjb25kQ2hpbGQpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWx1ZS5oCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNzgsNiArMjc4LDcgQEAgcHJpdmF0ZToK
ICAgICAgICAgY2FzZSBQaGk6CiAgICAgICAgIGNhc2UgSnVtcDoKICAgICAgICAgY2FzZSBPb3Bz
OgorICAgICAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICAgICAgaWYgKFVOTElLRUxZKG51
bUFyZ3MpKQogICAgICAgICAgICAgICAgIGJhZE9wY29kZShvcGNvZGUsIG51bUFyZ3MpOwogICAg
ICAgICAgICAgYnJlYWs7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNwcAkocmV2
aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJCM0NvbnN0MzJWYWx1ZS5o
IgogI2luY2x1ZGUgIkIzQ29uc3RQdHJWYWx1ZS5oIgogI2luY2x1ZGUgIkIzRWZmZWN0cy5oIgor
I2luY2x1ZGUgIkIzR2VuZXJhdGUuaCIKICNpbmNsdWRlICJCM01hdGhFeHRyYXMuaCIKICNpbmNs
dWRlICJCM01lbW9yeVZhbHVlLmgiCiAjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKQEAgLTk0LDYg
Kzk1LDE2IEBAIFN0YXRpY0xvY2sgY3Jhc2hMb2NrOwogICAgICAgICBDUkFTSCgpOyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0g
d2hpbGUgKGZhbHNlKQogCisjZGVmaW5lIENIRUNLX0VRKHgsIHkpIGRvIHsgXAorICAgICAgICBh
dXRvIF9feCA9ICh4KTsgXAorICAgICAgICBhdXRvIF9feSA9ICh5KTsgXAorICAgICAgICBpZiAo
X194ID09IF9feSkgXAorICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY3Jhc2hMb2NrLmxv
Y2soKTsgXAorICAgICAgICBXVEZSZXBvcnRBc3NlcnRpb25GYWlsdXJlKF9fRklMRV9fLCBfX0xJ
TkVfXywgV1RGX1BSRVRUWV9GVU5DVElPTiwgdG9DU3RyaW5nKCN4ICIgPT0gIiAjeSwgIiAoIiAj
eCAiID09ICIsIF9feCwgIiwgIiAjeSAiID09ICIsIF9feSwgIikiKS5kYXRhKCkpOyBcCisgICAg
ICAgIENSQVNIKCk7IFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKwogVk0qIHZtOwogCiBzdGQ6OnVu
aXF1ZV9wdHI8Q29tcGlsYXRpb24+IGNvbXBpbGUoUHJvY2VkdXJlJiBwcm9jZWR1cmUsIHVuc2ln
bmVkIG9wdExldmVsID0gMSkKQEAgLTEwMiwxMyArMTEzLDE5IEBAIHN0ZDo6dW5pcXVlX3B0cjxD
b21waWxhdGlvbj4gY29tcGlsZShQcm8KIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5h
bWUuLi4gQXJndW1lbnRzPgotVCBpbnZva2UoY29uc3QgQ29tcGlsYXRpb24mIGNvZGUsIEFyZ3Vt
ZW50cy4uLiBhcmd1bWVudHMpCitUIGludm9rZShNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcHRyLCBB
cmd1bWVudHMuLi4gYXJndW1lbnRzKQogewotICAgIFQgKCpmdW5jdGlvbikoQXJndW1lbnRzLi4u
KSA9IGJpdHdpc2VfY2FzdDxUKCopKEFyZ3VtZW50cy4uLik+KGNvZGUuY29kZSgpLmV4ZWN1dGFi
bGVBZGRyZXNzKCkpOworICAgIFQgKCpmdW5jdGlvbikoQXJndW1lbnRzLi4uKSA9IGJpdHdpc2Vf
Y2FzdDxUKCopKEFyZ3VtZW50cy4uLik+KHB0ci5leGVjdXRhYmxlQWRkcmVzcygpKTsKICAgICBy
ZXR1cm4gZnVuY3Rpb24oYXJndW1lbnRzLi4uKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVCwg
dHlwZW5hbWUuLi4gQXJndW1lbnRzPgorVCBpbnZva2UoY29uc3QgQ29tcGlsYXRpb24mIGNvZGUs
IEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCit7CisgICAgcmV0dXJuIGludm9rZTxUPihjb2RlLmNv
ZGUoKSwgYXJndW1lbnRzLi4uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUu
Li4gQXJndW1lbnRzPgogVCBjb21waWxlQW5kUnVuKFByb2NlZHVyZSYgcHJvY2VkdXJlLCBBcmd1
bWVudHMuLi4gYXJndW1lbnRzKQogewogICAgIHJldHVybiBpbnZva2U8VD4oKmNvbXBpbGUocHJv
Y2VkdXJlKSwgYXJndW1lbnRzLi4uKTsKQEAgLTEyMzc3LDYgKzEyMzk0LDI4MyBAQCB2b2lkIHRl
c3RSZXNldFJlYWNoYWJpbGl0eURhbmdsaW5nUmVmZXJlCiAgICAgdmFsaWRhdGUocHJvYyk7CiB9
CiAKK3ZvaWQgdGVzdEVudHJ5U3dpdGNoU2ltcGxlKCkKK3sKKyAgICBQcm9jZWR1cmUgcHJvYzsK
KyAgICBwcm9jLnNldE51bUVudHJ5cG9pbnRzKDMpOworICAgIAorICAgIEJhc2ljQmxvY2sqIHJv
b3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogb25lID0gcHJvYy5hZGRCbG9j
aygpOworICAgIEJhc2ljQmxvY2sqIHR3byA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Js
b2NrKiB0aHJlZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICAKKyAgICByb290LT5hcHBlbmROZXc8
VmFsdWU+KHByb2MsIEVudHJ5U3dpdGNoLCBPcmlnaW4oKSk7CisgICAgcm9vdC0+YXBwZW5kU3Vj
Y2Vzc29yKEZyZXF1ZW50ZWRCbG9jayhvbmUpKTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNzb3Io
RnJlcXVlbnRlZEJsb2NrKHR3bykpOworICAgIHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVu
dGVkQmxvY2sodGhyZWUpKTsKKyAgICAKKyAgICBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAg
ICAgIHByb2MsIFJldHVybiwgT3JpZ2luKCksCisgICAgICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVl
PigKKyAgICAgICAgICAgIHByb2MsIEFkZCwgT3JpZ2luKCksCisgICAgICAgICAgICBvbmUtPmFw
cGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1l
bnRHUFIwKSwKKyAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHBy
b2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSk7CisgICAgCisgICAgdHdvLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBSZXR1cm4sIE9yaWdpbigpLAorICAgICAg
ICB0d28tPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBTdWIsIE9yaWdpbigp
LAorICAgICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCksCisgICAgICAgICAgICB0d28tPmFwcGVuZE5l
dzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIx
KSkpOworICAgIAorICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBS
ZXR1cm4sIE9yaWdpbigpLAorICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAg
ICAgICAgIHByb2MsIE11bCwgT3JpZ2luKCksCisgICAgICAgICAgICB0aHJlZS0+YXBwZW5kTmV3
PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjAp
LAorICAgICAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpOworICAgIAorICAgIHByZXBhcmVGb3JH
ZW5lcmF0aW9uKHByb2MpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQodm0pOworICAgIGdl
bmVyYXRlKHByb2MsIGppdCk7CisgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2bSwgaml0LCBu
dWxscHRyKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbE9uZSA9IGxpbmtCdWZmZXIubG9j
YXRpb25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgwKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwg
bGFiZWxUd28gPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMSkp
OworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVGhyZWUgPSBsaW5rQnVmZmVyLmxvY2F0aW9u
T2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMikpOworICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29k
ZVJlZiBjb2RlUmVmID0gRklOQUxJWkVfQ09ERShsaW5rQnVmZmVyLCAoInRlc3RiMyBjb21waWxh
dGlvbiIpKTsKKyAgICAKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJlbE9uZSwgMSwgMikgPT0g
Myk7CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIpID09IC0xKTsKKyAgICBD
SEVDSyhpbnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyKSA9PSAyKTsKKyAgICBDSEVDSyhpbnZv
a2U8aW50PihsYWJlbE9uZSwgLTEsIDIpID09IDEpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxh
YmVsVHdvLCAtMSwgMikgPT0gLTMpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUs
IC0xLCAyKSA9PSAtMik7Cit9CisKK3ZvaWQgdGVzdEVudHJ5U3dpdGNoV2l0aENvbW1vblBhdGhz
KCkKK3sKKyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBwcm9jLnNldE51bUVudHJ5cG9pbnRzKDMp
OworICAgIAorICAgIEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFz
aWNCbG9jayogb25lID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHR3byA9IHBy
b2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0aHJlZSA9IHByb2MuYWRkQmxvY2soKTsK
KyAgICBCYXNpY0Jsb2NrKiBlbmQgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgCisgICAgcm9vdC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBFbnRyeVN3aXRjaCwgT3JpZ2luKCkpOworICAgIHJvb3Qt
PmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxvY2sob25lKSk7CisgICAgcm9vdC0+YXBwZW5k
U3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0d28pKTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNz
b3IoRnJlcXVlbnRlZEJsb2NrKHRocmVlKSk7CisgICAgCisgICAgVXBzaWxvblZhbHVlKiB1cHNp
bG9uT25lID0gb25lLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3Jp
Z2luKCksCisgICAgICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2Ms
IEFkZCwgT3JpZ2luKCksCisgICAgICAgICAgICBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAg
ICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAgICAgIG9uZS0+
YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1
bWVudEdQUjApKSwKKyAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAg
ICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAgb25lLT5hcHBl
bmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50
R1BSMSkpKSk7CisgICAgb25lLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigp
KTsKKyAgICBvbmUtPnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2NrKGVuZCkpOworICAgIAor
ICAgIFVwc2lsb25WYWx1ZSogdXBzaWxvblR3byA9IHR3by0+YXBwZW5kTmV3PFVwc2lsb25WYWx1
ZT4oCisgICAgICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICB0d28tPmFwcGVuZE5ldzxWYWx1
ZT4oCisgICAgICAgICAgICBwcm9jLCBTdWIsIE9yaWdpbigpLAorICAgICAgICAgICAgdHdvLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwK
KyAgICAgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSksCisgICAgICAgICAgICB0d28tPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAg
ICAgICAgICAgICAgIHR3by0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdp
bigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSkpOworICAgIHR3by0+YXBwZW5kTmV3PFZhbHVl
Pihwcm9jLCBKdW1wLCBPcmlnaW4oKSk7CisgICAgdHdvLT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50
ZWRCbG9jayhlbmQpKTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25UaHJlZSA9IHRo
cmVlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksCisg
ICAgICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgTXVsLCBP
cmlnaW4oKSwKKyAgICAgICAgICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAg
ICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAgICB0aHJlZS0+YXBw
ZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVu
dEdQUjApKSwKKyAgICAgICAgICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAg
ICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAgICB0aHJlZS0+YXBw
ZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVu
dEdQUjEpKSkpOworICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdp
bigpKTsKKyAgICB0aHJlZS0+c2V0U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2soZW5kKSk7Cisg
ICAgCisgICAgVmFsdWUqIHBoaSA9IGVuZC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBQaGksIElu
dDMyLCBPcmlnaW4oKSk7CisgICAgdXBzaWxvbk9uZS0+c2V0UGhpKHBoaSk7CisgICAgdXBzaWxv
blR3by0+c2V0UGhpKHBoaSk7CisgICAgdXBzaWxvblRocmVlLT5zZXRQaGkocGhpKTsKKyAgICAK
KyAgICBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgIHByb2MsIFJldHVybiwgT3JpZ2lu
KCksCisgICAgICAgIGVuZC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIENo
aWxsTW9kLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIHBoaSwgZW5kLT5hcHBlbmROZXc8VmFsdWU+
KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAg
ICBlbmQtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5m
bzo6YXJndW1lbnRHUFIyKSkpKTsKKyAgICAKKyAgICBwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9j
KTsKKyAgICAKKyAgICBDQ2FsbEhlbHBlcnMgaml0KHZtKTsKKyAgICBnZW5lcmF0ZShwcm9jLCBq
aXQpOworICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcigqdm0sIGppdCwgbnVsbHB0cik7CisgICAg
Q29kZUxvY2F0aW9uTGFiZWwgbGFiZWxPbmUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5l
bnRyeXBvaW50TGFiZWwoMCkpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVHdvID0gbGlu
a0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDEpKTsKKyAgICBDb2RlTG9j
YXRpb25MYWJlbCBsYWJlbFRocmVlID0gbGlua0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlw
b2ludExhYmVsKDIpKTsKKyAgICAKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgY29kZVJlZiA9
IEZJTkFMSVpFX0NPREUobGlua0J1ZmZlciwgKCJ0ZXN0YjMgY29tcGlsYXRpb24iKSk7CisgICAg
CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxPbmUsIDEsIDIsIDEwKSwgMyk7CisgICAg
Q0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIsIDEwKSwgLTEpOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIsIDEwKSwgMik7CisgICAgQ0hFQ0tfRVEo
aW52b2tlPGludD4obGFiZWxPbmUsIC0xLCAyLCAxMCksIDEpOworICAgIENIRUNLX0VRKGludm9r
ZTxpbnQ+KGxhYmVsVHdvLCAtMSwgMiwgMTApLCAtMyk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGlu
dD4obGFiZWxUaHJlZSwgLTEsIDIsIDEwKSwgLTIpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+
KGxhYmVsT25lLCAxLCAyLCAyKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxU
d28sIDEsIDIsIDIpLCAtMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwg
MSwgMiwgMiksIDApOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwgMiwg
MiksIDEpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAtMSwgMiwgMiksIC0x
KTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwgMiksIDApOwor
ICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAxLCAyLCAwKSwgMCk7CisgICAgQ0hF
Q0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIsIDApLCAwKTsKKyAgICBDSEVDS19FUShp
bnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyLCAwKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tl
PGludD4obGFiZWxPbmUsIC0xLCAyLCAwKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4o
bGFiZWxUd28sIC0xLCAyLCAwKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxU
aHJlZSwgLTEsIDIsIDApLCAwKTsKK30KKwordm9pZCB0ZXN0RW50cnlTd2l0Y2hXaXRoQ29tbW9u
UGF0aHNBbmROb25Ucml2aWFsRW50cnlwb2ludCgpCit7CisgICAgUHJvY2VkdXJlIHByb2M7Cisg
ICAgcHJvYy5zZXROdW1FbnRyeXBvaW50cygzKTsKKyAgICAKKyAgICBCYXNpY0Jsb2NrKiByb290
ID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIG5lZ2F0ZSA9IHByb2MuYWRkQmxv
Y2soKTsKKyAgICBCYXNpY0Jsb2NrKiBkaXNwYXRjaCA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBC
YXNpY0Jsb2NrKiBvbmUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdHdvID0g
cHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHRocmVlID0gcHJvYy5hZGRCbG9jaygp
OworICAgIEJhc2ljQmxvY2sqIGVuZCA9IHByb2MuYWRkQmxvY2soKTsKKworICAgIFVwc2lsb25W
YWx1ZSogdXBzaWxvbkJhc2UgPSByb290LT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAg
ICAgcHJvYywgT3JpZ2luKCksIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBw
cm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICByb290LT5hcHBlbmROZXc8QXJndW1l
bnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCkpKTsKKyAg
ICByb290LT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigp
LAorICAgICAgICByb290LT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgQml0
QW5kLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1Zh
bHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIzKSwKKyAgICAgICAgICAg
IHJvb3QtPmFwcGVuZE5ldzxDb25zdFB0clZhbHVlPihwcm9jLCBPcmlnaW4oKSwgMHhmZikpKTsK
KyAgICByb290LT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9jayhuZWdhdGUpLCBGcmVxdWVu
dGVkQmxvY2soZGlzcGF0Y2gpKTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25OZWdh
dGUgPSBuZWdhdGUtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmln
aW4oKSwKKyAgICAgICAgbmVnYXRlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJv
YywgTmVnLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIG5lZ2F0ZS0+YXBwZW5kTmV3PFZhbHVlPigK
KyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAg
bmVnYXRlLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUklu
Zm86OmFyZ3VtZW50R1BSMCkpKSk7CisgICAgbmVnYXRlLT5hcHBlbmROZXc8VmFsdWU+KHByb2Ms
IEp1bXAsIE9yaWdpbigpKTsKKyAgICBuZWdhdGUtPnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJs
b2NrKGRpc3BhdGNoKSk7CisgICAgCisgICAgVmFsdWUqIGFyZzAgPSBkaXNwYXRjaC0+YXBwZW5k
TmV3PFZhbHVlPihwcm9jLCBQaGksIEludDMyLCBPcmlnaW4oKSk7CisgICAgdXBzaWxvbkJhc2Ut
PnNldFBoaShhcmcwKTsKKyAgICB1cHNpbG9uTmVnYXRlLT5zZXRQaGkoYXJnMCk7CisgICAgZGlz
cGF0Y2gtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRW50cnlTd2l0Y2gsIE9yaWdpbigpKTsKKyAg
ICBkaXNwYXRjaC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayhvbmUpKTsKKyAgICBk
aXNwYXRjaC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0d28pKTsKKyAgICBkaXNw
YXRjaC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0aHJlZSkpOworICAgIAorICAg
IFVwc2lsb25WYWx1ZSogdXBzaWxvbk9uZSA9IG9uZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4o
CisgICAgICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4o
CisgICAgICAgICAgICBwcm9jLCBBZGQsIE9yaWdpbigpLAorICAgICAgICAgICAgYXJnMCwgb25l
LT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4o
KSwKKyAgICAgICAgICAgICAgICBvbmUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9j
LCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpKTsKKyAgICBvbmUtPmFwcGVuZE5l
dzxWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIG9uZS0+c2V0U3VjY2Vzc29ycyhG
cmVxdWVudGVkQmxvY2soZW5kKSk7CisgICAgCisgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uVHdv
ID0gdHdvLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCks
CisgICAgICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIFN1Yiwg
T3JpZ2luKCksCisgICAgICAgICAgICBhcmcwLCB0d28tPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAg
ICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAgICAgIHR3by0+
YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1
bWVudEdQUjEpKSkpOworICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBKdW1wLCBPcmln
aW4oKSk7CisgICAgdHdvLT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9jayhlbmQpKTsKKyAg
ICAKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25UaHJlZSA9IHRocmVlLT5hcHBlbmROZXc8VXBz
aWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksCisgICAgICAgIHRocmVlLT5hcHBl
bmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgTXVsLCBPcmlnaW4oKSwKKyAgICAgICAg
ICAgIGFyZzAsIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2Ms
IFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PEFyZ3Vt
ZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSkpOwor
ICAgIHRocmVlLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpKTsKKyAgICB0
aHJlZS0+c2V0U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2soZW5kKSk7CisgICAgCisgICAgVmFs
dWUqIHBoaSA9IGVuZC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBQaGksIEludDMyLCBPcmlnaW4o
KSk7CisgICAgdXBzaWxvbk9uZS0+c2V0UGhpKHBoaSk7CisgICAgdXBzaWxvblR3by0+c2V0UGhp
KHBoaSk7CisgICAgdXBzaWxvblRocmVlLT5zZXRQaGkocGhpKTsKKyAgICAKKyAgICBlbmQtPmFw
cGVuZE5ldzxWYWx1ZT4oCisgICAgICAgIHByb2MsIFJldHVybiwgT3JpZ2luKCksCisgICAgICAg
IGVuZC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIENoaWxsTW9kLCBPcmln
aW4oKSwKKyAgICAgICAgICAgIHBoaSwgZW5kLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAg
ICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAgICBlbmQtPmFwcGVu
ZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRH
UFIyKSkpKTsKKyAgICAKKyAgICBwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jKTsKKyAgICAKKyAg
ICBDQ2FsbEhlbHBlcnMgaml0KHZtKTsKKyAgICBnZW5lcmF0ZShwcm9jLCBqaXQpOworICAgIExp
bmtCdWZmZXIgbGlua0J1ZmZlcigqdm0sIGppdCwgbnVsbHB0cik7CisgICAgQ29kZUxvY2F0aW9u
TGFiZWwgbGFiZWxPbmUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFi
ZWwoMCkpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVHdvID0gbGlua0J1ZmZlci5sb2Nh
dGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDEpKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBs
YWJlbFRocmVlID0gbGlua0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDIp
KTsKKyAgICAKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgY29kZVJlZiA9IEZJTkFMSVpFX0NP
REUobGlua0J1ZmZlciwgKCJ0ZXN0YjMgY29tcGlsYXRpb24iKSk7CisgICAgCisgICAgQ0hFQ0tf
RVEoaW52b2tlPGludD4obGFiZWxPbmUsIDEsIDIsIDEwLCBmYWxzZSksIDMpOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAxMCwgZmFsc2UpLCAtMSk7CisgICAgQ0hF
Q0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwgMiwgMTAsIGZhbHNlKSwgMik7CisgICAg
Q0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxPbmUsIC0xLCAyLCAxMCwgZmFsc2UpLCAxKTsKKyAg
ICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgLTEsIDIsIDEwLCBmYWxzZSksIC0zKTsK
KyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwgMTAsIGZhbHNlKSwg
LTIpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAxLCAyLCAxMCwgdHJ1ZSks
IDEpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAxMCwgdHJ1ZSks
IC0zKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyLCAxMCwgdHJ1
ZSksIC0yKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEsIDIsIDEwLCB0
cnVlKSwgMyk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIC0xLCAyLCAxMCwg
dHJ1ZSksIC0xKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwg
MTAsIHRydWUpLCAyKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgMSwgMiwg
MiwgZmFsc2UpLCAxKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgMSwgMiwg
MiwgZmFsc2UpLCAtMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwg
MiwgMiwgZmFsc2UpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEs
IDIsIDIsIGZhbHNlKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIC0x
LCAyLCAyLCBmYWxzZSksIC0xKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVl
LCAtMSwgMiwgMiwgZmFsc2UpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9u
ZSwgMSwgMiwgMCwgZmFsc2UpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3
bywgMSwgMiwgMCwgZmFsc2UpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRo
cmVlLCAxLCAyLCAwLCBmYWxzZSksIDApOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVs
T25lLCAtMSwgMiwgMCwgZmFsc2UpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJl
bFR3bywgLTEsIDIsIDAsIGZhbHNlKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFi
ZWxUaHJlZSwgLTEsIDIsIDAsIGZhbHNlKSwgMCk7Cit9CisKIC8vIE1ha2Ugc3VyZSB0aGUgY29t
cGlsZXIgZG9lcyBub3QgdHJ5IHRvIG9wdGltaXplIGFueXRoaW5nIG91dC4KIE5FVkVSX0lOTElO
RSBkb3VibGUgemVybygpCiB7CkBAIC0xMjM4OCw4ICsxMjY4Miw2IEBAIGRvdWJsZSBuZWdhdGl2
ZVplcm8oKQogICAgIHJldHVybiAtemVybygpOwogfQogCi0KLQogI2RlZmluZSBSVU4odGVzdCkg
ZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoIXNob3VsZFJ1bigj
dGVzdCkpICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXApAQCAtMTM3ODMsNiArMTQwNzUsMTAgQEAgdm9pZCBydW4oY29u
c3QgY2hhciogZmlsdGVyKQogICAgIFJVTih0ZXN0SW50ZXJwcmV0ZXIoKSk7CiAgICAgUlVOKHRl
c3RSZWR1Y2VTdHJlbmd0aENoZWNrQm90dG9tVXNlSW5Bbm90aGVyQmxvY2soKSk7CiAgICAgUlVO
KHRlc3RSZXNldFJlYWNoYWJpbGl0eURhbmdsaW5nUmVmZXJlbmNlKCkpOworICAgIAorICAgIFJV
Tih0ZXN0RW50cnlTd2l0Y2hTaW1wbGUoKSk7CisgICAgUlVOKHRlc3RFbnRyeVN3aXRjaFdpdGhD
b21tb25QYXRocygpKTsKKyAgICBSVU4odGVzdEVudHJ5U3dpdGNoV2l0aENvbW1vblBhdGhzQW5k
Tm9uVHJpdmlhbEVudHJ5cG9pbnQoKSk7CiAKICAgICBpZiAodGFza3MuaXNFbXB0eSgpKQogICAg
ICAgICB1c2FnZSgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2Rl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUu
Y3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiQjNC
YXNpY0Jsb2NrVXRpbHMuaCIKICNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgogI2luY2x1ZGUgIkIz
U3RhY2tTbG90LmgiCisjaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+CiAKIG5hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKIApAQCAtNzksMTggKzgwLDM4IEBAIEND
YWxsU3BlY2lhbCogQ29kZTo6Y0NhbGxTcGVjaWFsKCkKICAgICByZXR1cm4gbV9jQ2FsbFNwZWNp
YWw7CiB9CiAKK2Jvb2wgQ29kZTo6aXNFbnRyeXBvaW50KEJhc2ljQmxvY2sqIGJsb2NrKSBjb25z
dAoreworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuICFi
bG9jay0+aW5kZXgoKTsKKyAgICAKKyAgICBmb3IgKGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50
cnlwb2ludCA6IG1fZW50cnlwb2ludHMpIHsKKyAgICAgICAgaWYgKGVudHJ5cG9pbnQuYmxvY2so
KSA9PSBibG9jaykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKIHZvaWQgQ29kZTo6cmVzZXRSZWFjaGFiaWxpdHkoKQogewotICAgIHJlY29t
cHV0ZVByZWRlY2Vzc29ycyhtX2Jsb2Nrcyk7CisgICAgY2xlYXJQcmVkZWNlc3NvcnMobV9ibG9j
a3MpOworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgdXBkYXRlUHJl
ZGVjZXNzb3JzQWZ0ZXIobV9ibG9ja3NbMF0uZ2V0KCkpOworICAgIGVsc2UgeworICAgICAgICBm
b3IgKGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2ludCA6IG1fZW50cnlwb2ludHMpCisg
ICAgICAgICAgICB1cGRhdGVQcmVkZWNlc3NvcnNBZnRlcihlbnRyeXBvaW50LmJsb2NrKCkpOwor
ICAgIH0KICAgICAKICAgICBmb3IgKGF1dG8mIGJsb2NrIDogbV9ibG9ja3MpIHsKLSAgICAgICAg
aWYgKGlzQmxvY2tEZWFkKGJsb2NrLmdldCgpKSkKKyAgICAgICAgaWYgKGlzQmxvY2tEZWFkKGJs
b2NrLmdldCgpKSAmJiAhaXNFbnRyeXBvaW50KGJsb2NrLmdldCgpKSkKICAgICAgICAgICAgIGJs
b2NrID0gbnVsbHB0cjsKICAgICB9CiB9CiAKIHZvaWQgQ29kZTo6ZHVtcChQcmludFN0cmVhbSYg
b3V0KSBjb25zdAogeworICAgIGlmICghbV9lbnRyeXBvaW50cy5pc0VtcHR5KCkpCisgICAgICAg
IG91dC5wcmludCgiRW50cnlwb2ludHM6ICIsIGxpc3REdW1wKG1fZW50cnlwb2ludHMpLCAiXG4i
KTsKICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRoaXMpCiAgICAgICAgIG91dC5wcmlu
dChkZWVwRHVtcChibG9jaykpOwogICAgIGlmIChzdGFja1Nsb3RzKCkuc2l6ZSgpKSB7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkocmV2aXNpb24gMjAzNDQxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJBaXJUbXAuaCIKICNpbmNsdWRlICJCM0luZGV4
TWFwLmgiCiAjaW5jbHVkZSAiQjNTcGFyc2VDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiQ0NhbGxI
ZWxwZXJzLmgiCiAjaW5jbHVkZSAiUmVnaXN0ZXJBdE9mZnNldExpc3QuaCIKICNpbmNsdWRlICJT
dGFja0FsaWdubWVudC5oIgogCkBAIC0xMTksNiArMTIwLDMyIEBAIHB1YmxpYzoKICAgICAgICAg
bV9mcmFtZVNpemUgPSBmcmFtZVNpemU7CiAgICAgfQogCisgICAgLy8gTm90ZSB0aGF0IHRoaXMg
aXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHByb2MoKS5udW1FbnRyeXBvaW50cygpLiBUaGlzIHZh
bHVlIGhlcmUgbWF5IGJlIHplcm8KKyAgICAvLyB1bnRpbCB3ZSBsb3dlciBFbnRyeVN3aXRjaC4K
KyAgICB1bnNpZ25lZCBudW1FbnRyeXBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZW50cnlwb2lu
dHMuc2l6ZSgpOyB9CisgICAgY29uc3QgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50cnlwb2lu
dHMoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5cG9pbnRzOyB9CisgICAgY29uc3QgRnJlcXVlbnRl
ZEJsb2NrJiBlbnRyeXBvaW50KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX2VudHJ5
cG9pbnRzW2luZGV4XTsgfQorICAgIGJvb2wgaXNFbnRyeXBvaW50KEJhc2ljQmxvY2sqKSBjb25z
dDsKKyAgICAKKyAgICAvLyBUaGlzIGlzIGZvciB1c2UgYnkgbG93ZXJFbnRyeVN3aXRjaCgpLgor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KKyAgICB2b2lkIHNldEVudHJ5cG9pbnRzKFZl
Y3RvciYmIHZlY3RvcikKKyAgICB7CisgICAgICAgIG1fZW50cnlwb2ludHMgPSBzdGQ6OmZvcndh
cmQ8VmVjdG9yPih2ZWN0b3IpOworICAgIH0KKyAgICAKKyAgICBDQ2FsbEhlbHBlcnM6OkxhYmVs
IGVudHJ5cG9pbnRMYWJlbCh1bnNpZ25lZCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2VudHJ5cG9pbnRMYWJlbHNbaW5kZXhdOworICAgIH0KKyAgICAKKyAgICAvLyBUaGlz
IGlzIGZvciB1c2UgYnkgZ2VuZXJhdGUoKS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3I+
CisgICAgdm9pZCBzZXRFbnRyeXBvaW50TGFiZWxzKFZlY3RvciYmIHZlY3RvcikKKyAgICB7Cisg
ICAgICAgIG1fZW50cnlwb2ludExhYmVscyA9IHN0ZDo6Zm9yd2FyZDxWZWN0b3I+KHZlY3Rvcik7
CisgICAgfQorCiAgICAgY29uc3QgUmVnaXN0ZXJBdE9mZnNldExpc3QmIGNhbGxlZVNhdmVSZWdp
c3RlcnMoKSBjb25zdCB7IHJldHVybiBtX2NhbGxlZVNhdmVSZWdpc3RlcnM7IH0KICAgICBSZWdp
c3RlckF0T2Zmc2V0TGlzdCYgY2FsbGVlU2F2ZVJlZ2lzdGVycygpIHsgcmV0dXJuIG1fY2FsbGVl
U2F2ZVJlZ2lzdGVyczsgfQogCkBAIC0yMzUsNiArMjYyLDggQEAgcHJpdmF0ZToKICAgICB1bnNp
Z25lZCBtX2ZyYW1lU2l6ZSB7IDAgfTsKICAgICB1bnNpZ25lZCBtX2NhbGxBcmdBcmVhU2l6ZSB7
IDAgfTsKICAgICBSZWdpc3RlckF0T2Zmc2V0TGlzdCBtX2NhbGxlZVNhdmVSZWdpc3RlcnM7Cisg
ICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gbV9lbnRyeXBvaW50czsgLy8gVGhpcyBpcyBlbXB0
eSB1bnRpbCBhZnRlciBsb3dlckVudHJ5U3dpdGNoKCkuCisgICAgVmVjdG9yPENDYWxsSGVscGVy
czo6TGFiZWw+IG1fZW50cnlwb2ludExhYmVsczsgLy8gVGhpcyBpcyBlbXB0eSB1bnRpbCBjb2Rl
IGdlbmVyYXRpb24uCiAgICAgY29uc3QgY2hhciogbV9sYXN0UGhhc2VOYW1lOwogfTsKIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDdXN0b20uaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckN1c3RvbS5oCShyZXZpc2lvbiAyMDM0
NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckN1c3RvbS5oCSh3b3JraW5n
IGNvcHkpCkBAIC05MCw2ICs5MCwxMSBAQCBzdHJ1Y3QgUGF0Y2hDdXN0b20gewogICAgICAgICBy
ZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+aXNUZXJtaW5hbChpbnN0KTsKICAgICB9CiAK
KyAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdFZmZlY3RzKEluc3QmIGluc3QpCisgICAgeworICAg
ICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+aGFzTm9uQXJnRWZmZWN0cyhpbnN0
KTsKKyAgICB9CisKICAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdOb25Db250cm9sRWZmZWN0cyhJ
bnN0JiBpbnN0KQogICAgIHsKICAgICAgICAgcmV0dXJuIGluc3QuYXJnc1swXS5zcGVjaWFsKCkt
Pmhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKGluc3QpOwpAQCAtMTAyLDEwICsxMDcsMTggQEAg
c3RydWN0IFBhdGNoQ3VzdG9tIHsKICAgICB9CiB9OwogCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdWJ0
eXBlPgorc3RydWN0IENvbW1vbkN1c3RvbUJhc2UgeworICAgIHN0YXRpYyBib29sIGhhc05vbkFy
Z0VmZmVjdHMoSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdWJ0eXBlOjppc1Rl
cm1pbmFsKGluc3QpIHx8IFN1YnR5cGU6Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKGluc3Qp
OworICAgIH0KK307CisKIC8vIERlZmluaXRpb24gb2YgQ0NhbGwgaW5zdHJ1Y3Rpb24uIENDYWxs
IGlzIHVzZWQgZm9yIGhvdCBwYXRoIEMgZnVuY3Rpb24gY2FsbHMuIEl0J3MgbG93ZXJlZCB0byBh
CiAvLyBQYXRjaCB3aXRoIGFuIEFpciBDQ2FsbFNwZWNpYWwgYWxvbmcgd2l0aCBjb2RlIHRvIG1h
cnNoYWwgaW5zdHJ1Y3Rpb25zLiBUaGUgbG93ZXJpbmcgaGFwcGVucwogLy8gYmVmb3JlIHJlZ2lz
dGVyIGFsbG9jYXRpb24sIHNvIHRoYXQgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBzZWVzIHRoZSBj
bG9iYmVycy4KLXN0cnVjdCBDQ2FsbEN1c3RvbSB7CitzdHJ1Y3QgQ0NhbGxDdXN0b20gOiBwdWJs
aWMgQ29tbW9uQ3VzdG9tQmFzZTxDQ2FsbEN1c3RvbT4gewogICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CiAgICAgc3RhdGljIHZvaWQgZm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBG
dW5jdG9yJiBmdW5jdG9yKQogICAgIHsKQEAgLTE3MSw3ICsxODQsNyBAQCBzdHJ1Y3QgQ29sZEND
YWxsQ3VzdG9tIDogQ0NhbGxDdXN0b20gewogICAgIH0KIH07CiAKLXN0cnVjdCBTaHVmZmxlQ3Vz
dG9tIHsKK3N0cnVjdCBTaHVmZmxlQ3VzdG9tIDogcHVibGljIENvbW1vbkN1c3RvbUJhc2U8U2h1
ZmZsZUN1c3RvbT4gewogICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CiAgICAgc3RhdGlj
IHZvaWQgZm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQogICAg
IHsKQEAgLTIyMCw2ICsyMzMsNDcgQEAgc3RydWN0IFNodWZmbGVDdXN0b20gewogICAgIHN0YXRp
YyBDQ2FsbEhlbHBlcnM6Okp1bXAgZ2VuZXJhdGUoSW5zdCYsIENDYWxsSGVscGVycyYsIEdlbmVy
YXRpb25Db250ZXh0Jik7CiB9OwogCitzdHJ1Y3QgRW50cnlTd2l0Y2hDdXN0b20gOiBwdWJsaWMg
Q29tbW9uQ3VzdG9tQmFzZTxFbnRyeVN3aXRjaEN1c3RvbT4geworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIEZ1bmM+CisgICAgc3RhdGljIHZvaWQgZm9yRWFjaEFyZyhJbnN0JiwgY29uc3QgRnVuYyYp
CisgICAgeworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmd1bWVudHM+
CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEZvcm1TdGF0aWMoQXJndW1lbnRzLi4uKQorICAgIHsK
KyAgICAgICAgcmV0dXJuICFzaXplb2YuLi4oQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAg
c3RhdGljIGJvb2wgaXNWYWxpZEZvcm0oSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAgIHJldHVy
biBpbnN0LmFyZ3MuaXNFbXB0eSgpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBhZG1p
dHNTdGFjayhJbnN0JiwgdW5zaWduZWQpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICAgIAorICAgIHN0YXRpYyBib29sIGlzVGVybWluYWwoSW5zdCYpCisgICAgeworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGJvb2wgaGFzTm9uQXJn
Tm9uQ29udHJvbEVmZmVjdHMoSW5zdCYpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgc3RhdGljIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0ZShJbnN0JiwgQ0Nh
bGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyBz
aG91bGQgbmV2ZXIgYmUgcmVhY2hlZCBiZWNhdXNlIHdlIHNob3VsZCBoYXZlIGxvd2VyZWQgRW50
cnlTd2l0Y2ggYmVmb3JlCisgICAgICAgIC8vIGdlbmVyYXRpb24uCisgICAgICAgIFVOUkVBQ0hB
QkxFX0ZPUl9QTEFURk9STSgpOworICAgICAgICByZXR1cm4gQ0NhbGxIZWxwZXJzOjpKdW1wKCk7
CisgICAgfQorfTsKKwogfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgogCiAjZW5kaWYg
Ly8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
R2VuZXJhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyR2VuZXJhdGUuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckdlbmVyYXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBA
QAogI2luY2x1ZGUgIkFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgiCiAjaW5jbHVkZSAi
QWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oIgogI2luY2x1ZGUgIkFpckxvd2VyQWZ0ZXJSZWdBbGxv
Yy5oIgorI2luY2x1ZGUgIkFpckxvd2VyRW50cnlTd2l0Y2guaCIKICNpbmNsdWRlICJBaXJMb3dl
ck1hY3Jvcy5oIgogI2luY2x1ZGUgIkFpck9wY29kZVV0aWxzLmgiCiAjaW5jbHVkZSAiQWlyT3B0
aW1pemVCbG9ja09yZGVyLmgiCkBAIC0xMjcsMTAgKzEyOCw2IEBAIHZvaWQgcHJlcGFyZUZvckdl
bmVyYXRpb24oQ29kZSYgY29kZSkKICAgICAvLyBwaGFzZS4KICAgICBzaW1wbGlmeUNGRyhjb2Rl
KTsKIAotICAgIC8vIFRoaXMgc29ydHMgdGhlIGJhc2ljIGJsb2NrcyBpbiBDb2RlIHRvIGFjaGll
dmUgYW4gb3JkZXJpbmcgdGhhdCBtYXhpbWl6ZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIGhpZ2gK
LSAgICAvLyBmcmVxdWVuY3kgc3VjY2Vzc29yIGlzIGFsc28gdGhlIGZhbGwtdGhyb3VnaCB0YXJn
ZXQuCi0gICAgb3B0aW1pemVCbG9ja09yZGVyKGNvZGUpOwotCiAgICAgLy8gVGhpcyBpcyBuZWVk
ZWQgdG8gc2F0aXNmeSBhIHJlcXVpcmVtZW50IG9mIEIzOjpTdGFja21hcFZhbHVlLgogICAgIHJl
cG9ydFVzZWRSZWdpc3RlcnMoY29kZSk7CiAKQEAgLTEzOSw2ICsxMzYsMTYgQEAgdm9pZCBwcmVw
YXJlRm9yR2VuZXJhdGlvbihDb2RlJiBjb2RlKQogICAgIC8vIHVzZS4gV2UgX211c3RfIHJ1biB0
aGlzIGFmdGVyIHJlcG9ydFVzZWRSZWdpc3RlcnMoKSwgc2luY2UgdGhhdCBraWxscyB2YXJpYWJs
ZSBhc3NpZ25tZW50cwogICAgIC8vIHRoYXQgc2VlbSBkZWFkLiBMdWNraWx5LCB0aGlzIHBoYXNl
IGRvZXMgbm90IGNoYW5nZSByZWdpc3RlciBsaXZlbmVzcywgc28gdGhhdCdzIE9LLgogICAgIGZp
eFBhcnRpYWxSZWdpc3RlclN0YWxscyhjb2RlKTsKKyAgICAKKyAgICAvLyBBY3R1YWxseSBjcmVh
dGUgZW50cnlwb2ludHMuCisgICAgbG93ZXJFbnRyeVN3aXRjaChjb2RlKTsKKyAgICAKKyAgICAv
LyBUaGUgY29udHJvbCBmbG93IGdyYXBoIGNhbiBiZSBzaW1wbGlmaWVkIGZ1cnRoZXIgYWZ0ZXIg
d2UgaGF2ZSBsb3dlcmVkIEVudHJ5U3dpdGNoLgorICAgIHNpbXBsaWZ5Q0ZHKGNvZGUpOworCisg
ICAgLy8gVGhpcyBzb3J0cyB0aGUgYmFzaWMgYmxvY2tzIGluIENvZGUgdG8gYWNoaWV2ZSBhbiBv
cmRlcmluZyB0aGF0IG1heGltaXplcyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgaGlnaAorICAgIC8v
IGZyZXF1ZW5jeSBzdWNjZXNzb3IgaXMgYWxzbyB0aGUgZmFsbC10aHJvdWdoIHRhcmdldC4KKyAg
ICBvcHRpbWl6ZUJsb2NrT3JkZXIoY29kZSk7CiAKICAgICBpZiAoc2hvdWxkVmFsaWRhdGVJUigp
KQogICAgICAgICB2YWxpZGF0ZShjb2RlKTsKQEAgLTE1NywyMiArMTY0LDExIEBAIHZvaWQgZ2Vu
ZXJhdGUoQ29kZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKIAogICAgIERpc2FsbG93TWFjcm9TY3Jh
dGNoUmVnaXN0ZXJVc2FnZSBkaXNhbGxvd1NjcmF0Y2goaml0KTsKIAotICAgIC8vIEFuZCBub3cs
IHdlIGdlbmVyYXRlIGNvZGUuCi0gICAgaml0LmVtaXRGdW5jdGlvblByb2xvZ3VlKCk7Ci0gICAg
aWYgKGNvZGUuZnJhbWVTaXplKCkpCi0gICAgICAgIGppdC5hZGRQdHIoQ0NhbGxIZWxwZXJzOjpU
cnVzdGVkSW1tMzIoLWNvZGUuZnJhbWVTaXplKCkpLCBNYWNyb0Fzc2VtYmxlcjo6c3RhY2tQb2lu
dGVyUmVnaXN0ZXIpOwotCiAgICAgYXV0byBhcmdGb3IgPSBbJl0gKGNvbnN0IFJlZ2lzdGVyQXRP
ZmZzZXQmIGVudHJ5KSAtPiBDQ2FsbEhlbHBlcnM6OkFkZHJlc3MgewogICAgICAgICByZXR1cm4g
Q0NhbGxIZWxwZXJzOjpBZGRyZXNzKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBlbnRyeS5v
ZmZzZXQoKSk7CiAgICAgfTsKICAgICAKLSAgICBmb3IgKGNvbnN0IFJlZ2lzdGVyQXRPZmZzZXQm
IGVudHJ5IDogY29kZS5jYWxsZWVTYXZlUmVnaXN0ZXJzKCkpIHsKLSAgICAgICAgaWYgKGVudHJ5
LnJlZygpLmlzR1BSKCkpCi0gICAgICAgICAgICBqaXQuc3RvcmVQdHIoZW50cnkucmVnKCkuZ3By
KCksIGFyZ0ZvcihlbnRyeSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBqaXQuc3RvcmVE
b3VibGUoZW50cnkucmVnKCkuZnByKCksIGFyZ0ZvcihlbnRyeSkpOwotICAgIH0KLQorICAgIC8v
IEFuZCBub3csIHdlIGdlbmVyYXRlIGNvZGUuCiAgICAgR2VuZXJhdGlvbkNvbnRleHQgY29udGV4
dDsKICAgICBjb250ZXh0LmNvZGUgPSAmY29kZTsKICAgICBjb250ZXh0LmJsb2NrTGFiZWxzLnJl
c2l6ZShjb2RlLnNpemUoKSk7CkBAIC0yMDYsNiArMjAyLDIwIEBAIHZvaWQgZ2VuZXJhdGUoQ29k
ZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKICAgICAgICAgYmxvY2tKdW1wc1tibG9ja10ubGluaygm
aml0KTsKICAgICAgICAgQ0NhbGxIZWxwZXJzOjpMYWJlbCBsYWJlbCA9IGppdC5sYWJlbCgpOwog
ICAgICAgICAqY29udGV4dC5ibG9ja0xhYmVsc1tibG9ja10gPSBsYWJlbDsKKworICAgICAgICBp
ZiAoY29kZS5pc0VudHJ5cG9pbnQoYmxvY2spKSB7CisgICAgICAgICAgICBqaXQuZW1pdEZ1bmN0
aW9uUHJvbG9ndWUoKTsKKyAgICAgICAgICAgIGlmIChjb2RlLmZyYW1lU2l6ZSgpKQorICAgICAg
ICAgICAgICAgIGppdC5hZGRQdHIoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tMzIoLWNvZGUuZnJh
bWVTaXplKCkpLCBNYWNyb0Fzc2VtYmxlcjo6c3RhY2tQb2ludGVyUmVnaXN0ZXIpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBmb3IgKGNvbnN0IFJlZ2lzdGVyQXRPZmZzZXQmIGVudHJ5IDog
Y29kZS5jYWxsZWVTYXZlUmVnaXN0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnku
cmVnKCkuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICAgICAgaml0LnN0b3JlUHRyKGVudHJ5LnJl
ZygpLmdwcigpLCBhcmdGb3IoZW50cnkpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgIGppdC5zdG9yZURvdWJsZShlbnRyeS5yZWcoKS5mcHIoKSwgYXJnRm9yKGVu
dHJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIEFTU0VS
VChibG9jay0+c2l6ZSgpID49IDEpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
YmxvY2stPnNpemUoKSAtIDE7ICsraSkgewogICAgICAgICAgICAgY29udGV4dC5pbmRleEluQmxv
Y2sgPSBpOwpAQCAtMjY0LDYgKzI3NCwxMSBAQCB2b2lkIGdlbmVyYXRlKENvZGUmIGNvZGUsIEND
YWxsSGVscGVycyYgCiAgICAgCiAgICAgY29udGV4dC5jdXJyZW50QmxvY2sgPSBudWxscHRyOwog
ICAgIGNvbnRleHQuaW5kZXhJbkJsb2NrID0gVUlOVF9NQVg7CisgICAgCisgICAgVmVjdG9yPEND
YWxsSGVscGVyczo6TGFiZWw+IGVudHJ5cG9pbnRMYWJlbHMoY29kZS5udW1FbnRyeXBvaW50cygp
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBjb2RlLm51bUVudHJ5cG9pbnRzKCk7IGktLTspCisg
ICAgICAgIGVudHJ5cG9pbnRMYWJlbHNbaV0gPSAqY29udGV4dC5ibG9ja0xhYmVsc1tjb2RlLmVu
dHJ5cG9pbnQoaSkuYmxvY2soKV07CisgICAgY29kZS5zZXRFbnRyeXBvaW50TGFiZWxzKFdURk1v
dmUoZW50cnlwb2ludExhYmVscykpOwogCiAgICAgcGNUb09yaWdpbk1hcC5hcHBlbmRJdGVtKGpp
dC5sYWJlbCgpLCBPcmlnaW4oKSk7CiAgICAgLy8gRklYTUU6IE1ha2UgbGF0ZSBwYXRocyBoYXZl
IE9yaWdpbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTM2ODkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMb3dlckVu
dHJ5U3dpdGNoLmNwcAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJMb3dlckVudHJ5U3dpdGNoLmgiCisKKyNpZiBF
TkFCTEUoQjNfSklUKQorCisjaW5jbHVkZSAiQWlyQmxvY2tXb3JrbGlzdC5oIgorI2luY2x1ZGUg
IkFpckNvZGUuaCIKKyNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5oIgorI2luY2x1ZGUgIkFpclBo
YXNlU2NvcGUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5oIgorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3ZvaWQgbG93ZXJFbnRyeVN3aXRjaChD
b2RlJiBjb2RlKQoreworICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAibG93ZXJFbnRy
eVN3aXRjaCIpOworICAgIAorICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHNldCBvZiBibG9ja3MgdGhh
dCBzaG91bGQgYmUgZHVwbGljYXRlZC4KKyAgICBCbG9ja1dvcmtsaXN0IHdvcmtsaXN0OworICAg
IGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7CisgICAgICAgIGlmIChibG9jay0+bGFz
dCgpLm9wY29kZSA9PSBFbnRyeVN3aXRjaCkKKyAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goYmxv
Y2spOworICAgIH0KKyAgICAKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgZG9uJ3QgaGF2
ZSBhbnkgRW50cnlTd2l0Y2hlcy4gVGhhdCdzIGZpbmUuCisgICAgaWYgKHdvcmtsaXN0LnNlZW4o
KS5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50cnlwb2lu
dHMoY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKSwgRnJlcXVlbnRlZEJsb2NrKGNvZGVbMF0p
KTsKKyAgICAgICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZNb3ZlKGVudHJ5cG9pbnRzKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgd2hpbGUgKEJhc2ljQmxvY2sqIGJsb2Nr
ID0gd29ya2xpc3QucG9wKCkpCisgICAgICAgIHdvcmtsaXN0LnB1c2hBbGwoYmxvY2stPnByZWRl
Y2Vzc29ycygpKTsKKyAgICAKKyAgICBSRUxFQVNFX0FTU0VSVCh3b3JrbGlzdC5zYXcoY29kZVsw
XSkpOworICAgIAorICAgIFZlY3RvcjxGcmVxdWVuY3lDbGFzcz4gZW50cnlwb2ludEZyZXF1ZW5j
aWVzKGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCksIEZyZXF1ZW5jeUNsYXNzOjpSYXJlKTsK
KyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkgeworICAgICAgICBpZiAoYmxvY2st
Pmxhc3QoKS5vcGNvZGUgIT0gRW50cnlTd2l0Y2gpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBlbnRyeXBvaW50SW5kZXggPSBjb2RlLnByb2MoKS5udW1FbnRy
eXBvaW50cygpOyBlbnRyeXBvaW50SW5kZXgtLTspIHsKKyAgICAgICAgICAgIGVudHJ5cG9pbnRG
cmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdID0gbWF4RnJlcXVlbmN5KAorICAgICAgICAgICAg
ICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdLAorICAgICAgICAgICAg
ICAgIGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2ludEluZGV4KS5mcmVxdWVuY3koKSk7CisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgYXV0byBmaXhFbnRyeVN3aXRjaCA9IFsmXSAoQmFzaWNC
bG9jayogYmxvY2ssIHVuc2lnbmVkIGVudHJ5cG9pbnRJbmRleCkgeworICAgICAgICBpZiAoYmxv
Y2stPmxhc3QoKS5vcGNvZGUgIT0gRW50cnlTd2l0Y2gpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIEZyZXF1ZW50ZWRCbG9jayB0YXJnZXQgPSBibG9jay0+c3VjY2Vzc29yKGVudHJ5cG9p
bnRJbmRleCk7CisgICAgICAgIGJsb2NrLT5sYXN0KCkub3Bjb2RlID0gSnVtcDsKKyAgICAgICAg
YmxvY2stPnN1Y2Nlc3NvcnMoKS5yZXNpemUoMSk7CisgICAgICAgIGJsb2NrLT5zdWNjZXNzb3Io
MCkgPSB0YXJnZXQ7CisgICAgfTsKKyAgICAKKyAgICAvLyBOb3cgZHVwbGljYXRlIHRoZW0uCisg
ICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50cnlwb2ludHM7CisgICAgZW50cnlwb2ludHMu
YXBwZW5kKEZyZXF1ZW50ZWRCbG9jayhjb2RlWzBdLCBlbnRyeXBvaW50RnJlcXVlbmNpZXNbMF0p
KTsKKyAgICBJbmRleE1hcDxCYXNpY0Jsb2NrLCBCYXNpY0Jsb2NrKj4gbWFwKGNvZGUuc2l6ZSgp
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGVudHJ5cG9pbnRJbmRleCA9IDE7IGVudHJ5cG9pbnRJbmRl
eCA8IGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCk7ICsrZW50cnlwb2ludEluZGV4KSB7Cisg
ICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogd29y
a2xpc3Quc2VlbigpLnZhbHVlcyhjb2RlKSkgeworICAgICAgICAgICAgQmFzaWNCbG9jayogbmV3
QmxvY2sgPSBjb2RlLmFkZEJsb2NrKGJsb2NrLT5mcmVxdWVuY3koKSk7CisgICAgICAgICAgICBt
YXBbYmxvY2tdID0gbmV3QmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgZW50cnlwb2ludHMuYXBw
ZW5kKEZyZXF1ZW50ZWRCbG9jayhtYXBbY29kZVswXV0sIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tl
bnRyeXBvaW50SW5kZXhdKSk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiB3b3Jr
bGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKSB7CisgICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdC
bG9jayA9IG1hcFtibG9ja107CisgICAgICAgICAgICBmb3IgKGNvbnN0IEluc3QmIGluc3QgOiAq
YmxvY2spCisgICAgICAgICAgICAgICAgbmV3QmxvY2stPmFwcGVuZEluc3QoaW5zdCk7CisgICAg
ICAgICAgICBuZXdCbG9jay0+c3VjY2Vzc29ycygpID0gYmxvY2stPnN1Y2Nlc3NvcnMoKTsKKyAg
ICAgICAgICAgIGZvciAoQmFzaWNCbG9jayomIHN1Y2Nlc3NvciA6IG5ld0Jsb2NrLT5zdWNjZXNz
b3JCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIGlmIChCYXNpY0Jsb2NrKiByZXBsYWNlbWVu
dCA9IG1hcFtzdWNjZXNzb3JdKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSByZXBs
YWNlbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpeEVudHJ5U3dpdGNoKG5ld0Js
b2NrLCBlbnRyeXBvaW50SW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoQmFzaWNC
bG9jayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKQorICAgICAgICBmaXhF
bnRyeVN3aXRjaChibG9jaywgMCk7CisgICAgCisgICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZN
b3ZlKGVudHJ5cG9pbnRzKSk7CisgICAgY29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOworfQorCit9
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklU
KQorCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3
aXRjaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93
ZXJFbnRyeVN3aXRjaC5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKyNkZWZpbmUgQWlyTG93ZXJFbnRyeVN3aXRjaF9oCisK
KyNpZiBFTkFCTEUoQjNfSklUKQorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKKy8vIENvbnZlcnRzIGNvZGUgdGhhdCBzZWVt
cyB0byBoYXZlIG9uZSBlbnRyeXBvaW50IGFuZCBlbXVsYXRlcyBtdWx0aXBsZSBlbnRyeXBvaW50
cyB3aXRoCisvLyBFbnRyeVN3aXRjaCBpbnRvIGNvZGUgdGhhdCByZWFsbHkgaGFzIG11bHRpcGxl
IGVudHJ5cG9pbnRzLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBkdXBsaWNhdGluZworLy8gdGhl
IGJhY2t3YXJkcyB0cmFuc2l0aXZlIGNsb3N1cmUgZnJvbSBhbGwgRW50cnlTd2l0Y2hlcy4KK3Zv
aWQgbG93ZXJFbnRyeVN3aXRjaChDb2RlJik7CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
OjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCisKKyNlbmRpZiAvLyBBaXJMb3dlckVu
dHJ5U3dpdGNoX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNv
ZGUub3Bjb2Rlcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ck9wY29kZS5vcGNvZGVzCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCSh3b3JraW5nIGNvcHkpCkBAIC04NDksNiArODQ5
LDEwIEBAIFJldERvdWJsZSBVOkY6NjQgL3JldHVybgogCiBPb3BzIC90ZXJtaW5hbAogCisjIFRo
aXMgaXMgYSB0ZXJtaW5hbCBidXQgd2UgZXhwcmVzcyBpdCBhcyBhIEN1c3RvbSBiZWNhdXNlIHdl
IGRvbid0IHdhbnQgaXQgdG8gaGF2ZSBhIGNvZGUKKyMgZ2VuZXJhdG9yLgorY3VzdG9tIEVudHJ5
U3dpdGNoCisKICMgQSBTaHVmZmxlIGlzIGEgbXVsdGktc291cmNlLCBtdWx0aS1kZXN0aW5hdGlv
biBtb3ZlLiBJdCBzaW11bHRhbmVvdXNseSBkb2VzIG11bHRpcGxlIG1vdmVzIGF0IG9uY2UuCiAj
IFRoZSBtb3ZlcyBhcmUgc3BlY2lmaWVkIGFzIHRyaXBsZXRzIG9mIHNyYywgZHN0LCBhbmQgd2lk
dGguIEZvciBleGFtcGxlIHlvdSBjYW4gcmVxdWVzdCBhIHN3YXAgdGhpcwogIyB3YXk6CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcHRpbWl6ZUJs
b2NrT3JkZXIuY3BwCShyZXZpc2lvbiAyMDM0NDEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDE2
ICs4MSwyOCBAQCBWZWN0b3I8QmFzaWNCbG9jayo+IGJsb2Nrc0luT3B0aW1pemVkT3JkCiAgICAg
U29ydGVkU3VjY2Vzc29ycyBzb3J0ZWRTdWNjZXNzb3JzOwogICAgIFNvcnRlZFN1Y2Nlc3NvcnMg
c29ydGVkU2xvd1N1Y2Nlc3NvcnM7CiAgICAgCi0gICAgZmFzdFdvcmtsaXN0LnB1c2goY29kZVsw
XSk7CisgICAgLy8gV2UgZXhwZWN0IGVudHJ5cG9pbnQgbG93ZXJpbmcgdG8gaGF2ZSBhbHJlYWR5
IGhhcHBlbmVkLgorICAgIFJFTEVBU0VfQVNTRVJUKGNvZGUubnVtRW50cnlwb2ludHMoKSk7CisK
KyAgICBhdXRvIGFwcGVuZFN1Y2Nlc3NvciA9IFsmXSAoY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBi
bG9jaykgeworICAgICAgICBpZiAoYmxvY2suaXNSYXJlKCkpCisgICAgICAgICAgICBzb3J0ZWRT
bG93U3VjY2Vzc29ycy5hcHBlbmQoYmxvY2suYmxvY2soKSk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIHNvcnRlZFN1Y2Nlc3NvcnMuYXBwZW5kKGJsb2NrLmJsb2NrKCkpOworICAgIH07Cisg
ICAgCisgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBmaXJzdCBlbnRyeXBvaW50LCB3ZSBw
dXNoIHRoZW0gaW4gb3JkZXIgb2YgZnJlcXVlbmN5IGFuZCBmcmVxdWVuY3kKKyAgICAvLyBjbGFz
cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgY29kZS5udW1FbnRyeXBvaW50cygpOyAr
K2kpCisgICAgICAgIGFwcGVuZFN1Y2Nlc3Nvcihjb2RlLmVudHJ5cG9pbnQoaSkpOworICAgIAor
ICAgIC8vIEFsd2F5cyBwdXNoIHRoZSBwcmltYXJ5IHN1Y2Nlc3NvciBsYXN0IHNvIHRoYXQgaXQg
Z2V0cyBoaWdoZXN0IHByaW9yaXR5LgorICAgIGZhc3RXb3JrbGlzdC5wdXNoKGNvZGUuZW50cnlw
b2ludCgwKS5ibG9jaygpKTsKICAgICAKICAgICB3aGlsZSAoQmFzaWNCbG9jayogYmxvY2sgPSBm
YXN0V29ya2xpc3QucG9wKCkpIHsKICAgICAgICAgYmxvY2tzSW5PcmRlci5hcHBlbmQoYmxvY2sp
OwotICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nl
c3NvcnMoKSkgewotICAgICAgICAgICAgaWYgKHN1Y2Nlc3Nvci5pc1JhcmUoKSkKLSAgICAgICAg
ICAgICAgICBzb3J0ZWRTbG93U3VjY2Vzc29ycy5hcHBlbmQoc3VjY2Vzc29yLmJsb2NrKCkpOwot
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNvcnRlZFN1Y2Nlc3NvcnMuYXBwZW5k
KHN1Y2Nlc3Nvci5ibG9jaygpKTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKEZyZXF1ZW50ZWRC
bG9jayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkKKyAgICAgICAgICAgIGFwcGVu
ZFN1Y2Nlc3NvcihzdWNjZXNzb3IpOwogICAgICAgICBzb3J0ZWRTdWNjZXNzb3JzLnByb2Nlc3Mo
ZmFzdFdvcmtsaXN0KTsKICAgICB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyU3BlY2lhbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGVjaWFsLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjAsNiArNjAs
MTEgQEAgYm9vbCBTcGVjaWFsOjppc1Rlcm1pbmFsKEluc3QmKQogICAgIHJldHVybiBmYWxzZTsK
IH0KIAorYm9vbCBTcGVjaWFsOjpoYXNOb25BcmdFZmZlY3RzKEluc3QmKQoreworICAgIHJldHVy
biB0cnVlOworfQorCiBib29sIFNwZWNpYWw6Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKElu
c3QmKQogewogICAgIHJldHVybiB0cnVlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGVjaWFsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJTcGVjaWFsLmgJKHJldmlzaW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCSh3b3JraW5nIGNvcHkpCkBAIC05Miw2ICs5Miw5IEBA
IHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgaXNUZXJtaW5hbChJbnN0Jik7CiAKICAgICAvLyBC
eSBkZWZhdWx0LCB0aGlzIHJldHVybnMgdHJ1ZS4KKyAgICB2aXJ0dWFsIGJvb2wgaGFzTm9uQXJn
RWZmZWN0cyhJbnN0Jik7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0aGlzIHJldHVybnMgdHJ1ZS4K
ICAgICB2aXJ0dWFsIGJvb2wgaGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoSW5zdCYpOwogCiAg
ICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAkocmV2aXNpb24gMjAzNDQxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJWYWxpZGF0ZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgIkFpckNvZGUuaCIKICNpbmNsdWRlICJBaXJJ
bnN0SW5saW5lcy5oIgorI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCiAKIG5hbWVzcGFjZSBKU0Mg
eyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKIApAQCAtNTQsNyArNTUsNyBAQCBwdWJs
aWM6CiAgICAgICAgIEhhc2hTZXQ8U3RhY2tTbG90Kj4gdmFsaWRTbG90czsKICAgICAgICAgSGFz
aFNldDxCYXNpY0Jsb2NrKj4gdmFsaWRCbG9ja3M7CiAgICAgICAgIEhhc2hTZXQ8U3BlY2lhbCo+
IHZhbGlkU3BlY2lhbHM7Ci0KKyAgICAgICAgCiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxv
Y2sgOiBtX2NvZGUpCiAgICAgICAgICAgICB2YWxpZEJsb2Nrcy5hZGQoYmxvY2spOwogICAgICAg
ICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6IG1fY29kZS5zdGFja1Nsb3RzKCkpCkBAIC02Myw2ICs2
NCwxMCBAQCBwdWJsaWM6CiAgICAgICAgICAgICB2YWxpZFNwZWNpYWxzLmFkZChzcGVjaWFsKTsK
IAogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAg
ICAvLyBCbG9ja3MgdGhhdCBhcmUgZW50cnlwb2ludHMgbXVzdCBub3QgaGF2ZSBwcmVkZWNlc3Nv
cnMuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlzRW50cnlwb2ludChibG9jaykpCisgICAgICAg
ICAgICAgICAgVkFMSURBVEUoIWJsb2NrLT5udW1QcmVkZWNlc3NvcnMoKSwgKCJBdCBlbnRyeXBv
aW50ICIsICpibG9jaykpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7
CiAgICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwogICAg
ICAgICAgICAgICAgIGZvciAoQXJnJiBhcmcgOiBpbnN0LmFyZ3MpIHsKQEAgLTg5LDYgKzk0LDE0
IEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFKCZhcmcgPj0gJmlu
c3QuYXJnc1swXSwgKCJBdCAiLCBhcmcsICIgaW4gIiwgaW5zdCwgIiBpbiAiLCAqYmxvY2spKTsK
ICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFKCZhcmcgPD0gJmluc3QuYXJncy5sYXN0
KCksICgiQXQgIiwgYXJnLCAiIGluICIsIGluc3QsICIgaW4gIiwgKmJsb2NrKSk7CiAgICAgICAg
ICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRj
aCAoaW5zdC5vcGNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAg
ICAgICAgICAgICAgICAgICBWQUxJREFURShibG9jay0+bnVtU3VjY2Vzc29ycygpID09IG1fY29k
ZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKSwgKCJBdCAiLCBpbnN0LCAiIGluICIsICpibG9jaykp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNj
ZXNzb3JCbG9ja3MoKSkKICAgICAgICAgICAgICAgICBWQUxJREFURSh2YWxpZEJsb2Nrcy5jb250
YWlucyhzdWNjZXNzb3IpLCAoIkluICIsICpibG9jaykpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgkocmV2aXNpb24gMjAzNDQx
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCSh3
b3JraW5nIGNvcHkpCkBAIC0xMDQ2LDcgKzEwNDYsNyBAQCB3cml0ZUgoIk9wY29kZUdlbmVyYXRl
ZCIpIHsKICAgICAgICAgfCBvcGNvZGUgfAogICAgICAgICBpZiBvcGNvZGUuY3VzdG9tCiAgICAg
ICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvcGNvZGUubmFtZX06IgotICAgICAgICAgICAgb3V0
cC5wdXRzICJyZXR1cm4gI3tvcGNvZGUubmFtZX1DdXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xF
ZmZlY3RzKCp0aGlzKTsiCisgICAgICAgICAgICBvdXRwLnB1dHMgInJldHVybiAje29wY29kZS5u
YW1lfUN1c3RvbTo6aGFzTm9uQXJnRWZmZWN0cygqdGhpcyk7IgogICAgICAgICBlbmQKICAgICB9
CiAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKSW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMDM0NDEpCisrKyBT
b3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDE2
LTA3LTE5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAgQjMgc2hv
dWxkIHN1cHBvcnQgbXVsdGlwbGUgZW50cnlwb2ludHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTM5MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgICogd3RmL0dyYXBoTm9kZVdvcmtsaXN0Lmg6IEV4cG9z
ZSBzb21lIGhhbmR5IGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIChXVEY6OkdyYXBoTm9kZVdvcmts
aXN0Ojpwb3ApOgorICAgICAgICAoV1RGOjpHcmFwaE5vZGVXb3JrbGlzdDo6c2F3KToKKyAgICAg
ICAgKFdURjo6R3JhcGhOb2RlV29ya2xpc3Q6OnNlZW4pOgorICAgICAgICAqIHd0Zi9WZWN0b3JU
cmFpdHMuaDogRml4IGEgYnVnISBPdGhlcndpc2UgZmlsbGluZyBhIHZlY3RvciBvZiBieXRlLXNp
emVkIGVudW0gY2xhc3NlcyBkb2Vzbid0IHdvcmsuCisKIDIwMTYtMDctMTggIEFuZGVycyBDYXJs
c3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWJLaXQgbmlnaHRseSBmYWls
cyB0byBidWlsZCBvbiBtYWNPUyBTaWVycmEKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL0dyYXBoTm9k
ZVdvcmtsaXN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvR3JhcGhOb2RlV29ya2xp
c3QuaAkocmV2aXNpb24gMjAzNDQxKQorKysgU291cmNlL1dURi93dGYvR3JhcGhOb2RlV29ya2xp
c3QuaAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsOCBAQCBwdWJsaWM6CiAgICAgfQogCiAg
ICAgYm9vbCBzYXcoTm9kZSBub2RlKSB7IHJldHVybiBtX3NlZW4uY29udGFpbnMobm9kZSk7IH0K
KyAgICAKKyAgICBjb25zdCBTZXQmIHNlZW4oKSBjb25zdCB7IHJldHVybiBtX3NlZW47IH0KIAog
cHJpdmF0ZToKICAgICBTZXQgbV9zZWVuOwpJbmRleDogU291cmNlL1dURi93dGYvVmVjdG9yVHJh
aXRzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvVmVjdG9yVHJhaXRzLmgJKHJldmlz
aW9uIDIwMzQ0MSkKKysrIFNvdXJjZS9XVEYvd3RmL1ZlY3RvclRyYWl0cy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYs
IDIwMDcsIDIwMDgsIDIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgog
I2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR5cGVfdHJh
aXRzPgogCiBuYW1lc3BhY2UgV1RGIHsKIApAQCAtNTEsNyArNTIsNyBAQCBuYW1lc3BhY2UgV1RG
IHsKICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgY2FuSW5pdGlhbGl6ZVdpdGhNZW1zZXQgPSBm
YWxzZTsKICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgY2FuTW92ZVdpdGhNZW1jcHkgPSB0cnVl
OwogICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5Db3B5V2l0aE1lbWNweSA9IHRydWU7Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGNhbkZpbGxXaXRoTWVtc2V0ID0gc2l6ZW9mKFQpID09
IHNpemVvZihjaGFyKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgY2FuRmlsbFdpdGhNZW1z
ZXQgPSBzaXplb2YoVCkgPT0gc2l6ZW9mKGNoYXIpICYmIHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZh
bHVlOwogICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5Db21wYXJlV2l0aE1lbWNtcCA9IHRy
dWU7CiAgICAgfTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>284262</attachid>
            <date>2016-07-21 14:33:34 -0700</date>
            <delta_ts>2016-07-24 11:04:51 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>65935</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAzNTMwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyOCBA
QAorMjAxNi0wNy0xOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAg
IEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgdGVhY2hlcyBCMyBo
b3cgdG8gY29tcGlsZSBwcm9jZWR1cmVzIHdpdGggbXVsdGlwbGUgZW50cnlwb2ludHMgaW4gdGhl
IGJlc3Qgd2F5IGV2ZXIuCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBvaW50cyBh
cmUgdXNlZnVsLiBXZSBjb3VsZCB1c2UgdGhlbSB0byByZWR1Y2UgdGhlIGNvc3Qgb2YgY29tcGls
aW5nIE9TUgorICAgICAgICBlbnRyeXBvaW50cy4gV2UgY291bGQgdXNlIHRoZW0gdG8gaW1wbGVt
ZW50IGJldHRlciB0cnkvY2F0Y2guCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBv
aW50cyBhcmUgaGFyZCB0byBzdXBwb3J0LiBBbGwgb2YgYSBzdWRkZW4sIGFsbCBvZiB0aGUgY29k
ZSB0aGF0IGFzc3VtZWQKKyAgICAgICAgdGhhdCB0aGUgcm9vdCBibG9jayBpcyB0aGUgZW50cnlw
b2ludCB3b3VsZCBoYXZlIHRvIGJlIGNoYW5nZWQuIFRyYW5zZm9ybWF0aW9ucyBsaWtlCisgICAg
ICAgIG1vdmVDb25zdGFudHMoKSB3b3VsZCBoYXZlIHRvIGRvIGNyYXp5IHRoaW5ncyBpZiB0aGUg
ZXhpc3RlbmNlIG9mIG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIHByZXZlbnRlZCBpdCBm
cm9tIGZpbmRpbmcgYSBzaW5nbGUgY29tbW9uIGRvbWluYXRvci4KKyAgICAgICAgCisgICAgICAg
IFRoZXJlZm9yZSwgd2Ugd2FudCB0byBhZGQgbXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aG91dCBh
Y3R1YWxseSB0ZWFjaGluZyB0aGUgY29tcGlsZXIgdGhhdAorICAgICAgICB0aGVyZSBpcyBzdWNo
IGEgdGhpbmcuIFRoYXQncyBzb3J0IG9mIHdoYXQgdGhpcyBjaGFuZ2UgZG9lcy4KKyAgICAgICAg
CisgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBvcGNvZGUgdG8gYm90aCBCMyBhbmQgQWlyIGNhbGxl
ZCBFbnRyeVN3aXRjaC4gSXQncyBhIHRlcm1pbmFsIHRoYXQgdGFrZXMKKyAgICAgICAgb25lIG9y
IG1vcmUgc3VjY2Vzc29ycyBhbmQgbm8gdmFsdWUgY2hpbGRyZW4uIFRoZSBudW1iZXIgb2Ygc3Vj
Y2Vzc29ycyBtdXN0IG1hdGNoCisgICAgICAgIFByb2NlZHVyZTo6bnVtRW50cnlwb2ludHMoKSwg
d2hpY2ggY291bGQgYmUgYXJiaXRyYXJpbHkgbGFyZ2UuIFRoZSBzZW1hbnRpY3Mgb2YgRW50cnlT
d2l0Y2gKKyAgICAgICAgYXJlOgorICAgICAgICAKKyAgICAgICAgLSBFYWNoIG9mIHRoZSBlbnRy
eXBvaW50cyBzZXRzIGEgaGlkZGVuIEVudHJ5IHZhcmlhYmxlIHRvIHRoYXQgZW50cnlwb2ludCdz
IGluZGV4IGFuZCBqdW1wcworICAgICAgICAgIHRvIHRoZSBwcm9jZWR1cmUncyByb290IGJsb2Nr
LgorICAgICAgICAKKyAgICAgICAgLSBBbiBFbnRyeVN3aXRjaCBpcyBhIHN3aXRjaCBzdGF0ZW1l
bnQgb3ZlciB0aGlzIGhpZGRlbiBFbnRyeSB2YXJpYWJsZS4KKyAgICAgICAgCisgICAgICAgIFRo
ZSB3YXkgdGhhdCB3ZSBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyBpcyB0aGF0IEFpciBoYXMgYSB2
ZXJ5IGxhdGUgcGhhc2UgLSBhZnRlciBhbGwKKyAgICAgICAgcmVnaXN0ZXIgYW5kIHN0YWNrIGxh
eW91dCAtIHRoYXQgY2xvbmVzIGFsbCBjb2RlIHdoZXJlIHRoZSBFbnRyeSB2YXJpYWJsZSBpcyBs
aXZlOyBpLmUgYWxsCisgICAgICAgIGNvZGUgaW4gdGhlIGNsb3N1cmUgb3ZlciBwcmVkZWNlc3Nv
cnMgb2YgYWxsIGJsb2NrcyB0aGF0IGRvIEVudHJ5U3dpdGNoLgorICAgICAgICAKKyAgICAgICAg
VXN1YWxseSwgeW91IHdvdWxkIHVzZSB0aGlzIGJ5IGNyZWF0aW5nIGFuIEVudHJ5U3dpdGNoIGlu
IHRoZSByb290IGJsb2NrLCBidXQgeW91IGRvbid0CisgICAgICAgIGhhdmUgdG8gZG8gdGhhdC4g
SnVzdCByZW1lbWJlciB0aGF0IHRoZSBjb2RlIGJlZm9yZSBFbnRyeVN3aXRjaCBnZXRzIGNsb25l
ZCBmb3IgZWFjaAorICAgICAgICBlbnRyeXBvaW50LiBXZSBhbGxvdyBjbG9uaW5nIG9mIGFuIGFy
Yml0cmFyaWx5IGxhcmdlIGFtb3VudCBvZiBjb2RlIGJlY2F1c2UgcmVzdHJpY3RpbmcgaXQsCisg
ICAgICAgIGFuZCBzbyByZXN0cmljaW5nIHRoZSBwbGFjZW1lbnQgb2YgRW50cnlTd2l0Y2hlcywg
d291bGQgYmUgdW5lbGVnYW50LiBJdCB3b3VsZCBiZSBoYXJkIHRvCisgICAgICAgIHByZXNlcnZl
IHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGxvd2Vy
IGFueSB2YWx1ZSBiZWZvcmUgYW4KKyAgICAgICAgRW50cnlTd2l0Y2ggdG8gYSBjb250cm9sIGZs
b3cgZGlhbW9uZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZ2l2ZXMgdXMgYW4gZWFz
eS10by11c2Ugd2F5IHRvIHVzZSBCMyB0byBjb21waWxlIGNvZGUgd2l0aCBtdWx0aXBsZSBlbnRy
eXBvaW50cy4KKyAgICAgICAgSW5zaWRlIHRoZSBjb21waWxlciwgb25seSBjb2RlIHRoYXQgcnVu
cyB2ZXJ5IGxhdGUgaW4gQWlyIGhhcyB0byBrbm93IGFib3V0IHRoaXMgZmVhdHVyZS4KKyAgICAg
ICAgV2UgZ2V0IHRoZSBiZXN0IG9mIGJvdGggd29ybGRzIQorICAgICAgICAKKyAgICAgICAgQWxz
bywgSSBmaW5hbGx5IGdvdCByaWQgb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgeW91IGV4cGxpY2l0
bHkgY2FzdCBCYXNpY0Jsb2NrKiB0bworICAgICAgICBGcmVxdWVudGVkQmxvY2suIEkgY2FuIG5v
IGxvbmdlciByZW1lbWJlciB3aHkgSSB0aG91Z2h0IHRoYXQgd2FzIGEgZ29vZCBpZGVhLiBSZW1v
dmluZyBpdAorICAgICAgICBkb2Vzbid0IGNhdXNlIGFueSBwcm9ibGVtcyBhbmQgaXQgbWFrZXMg
Y29kZSBlYXNpZXIgdG8gd3JpdGUuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAg
ICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAq
IGIzL0IzQmFzaWNCbG9ja1V0aWxzLmg6CisgICAgICAgIChKU0M6OkIzOjp1cGRhdGVQcmVkZWNl
c3NvcnNBZnRlcik6CisgICAgICAgIChKU0M6OkIzOjpjbGVhclByZWRlY2Vzc29ycyk6CisgICAg
ICAgIChKU0M6OkIzOjpyZWNvbXB1dGVQcmVkZWNlc3NvcnMpOgorICAgICAgICAqIGIzL0IzRnJl
cXVlbmN5Q2xhc3MuaDoKKyAgICAgICAgKEpTQzo6QjM6Om1heEZyZXF1ZW5jeSk6CisgICAgICAg
ICogYjMvQjNHZW5lcmF0ZS5oOgorICAgICAgICAqIGIzL0IzTG93ZXJUb0Fpci5jcHA6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6Okxvd2VyVG9BaXI6Omxvd2VyKToKKyAgICAgICAgKiBiMy9CM01v
dmVDb25zdGFudHMuY3BwOgorICAgICAgICAqIGIzL0IzT3Bjb2RlLmNwcDoKKyAgICAgICAgKFdU
Rjo6cHJpbnRJbnRlcm5hbCk6CisgICAgICAgICogYjMvQjNPcGNvZGUuaDoKKyAgICAgICAgKiBi
My9CM1Byb2NlZHVyZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmlzRmFzdENv
bnN0YW50KToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6ZW50cnlwb2ludExhYmVsKToK
KyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6YWRkRGF0YVNlY3Rpb24pOgorICAgICAgICAq
IGIzL0IzUHJvY2VkdXJlLmg6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6Om51bUVudHJ5
cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6c2V0TnVtRW50cnlwb2ludHMp
OgorICAgICAgICAoSlNDOjpCMzo6UHJvY2VkdXJlOjpzZXRMYXN0UGhhc2VOYW1lKToKKyAgICAg
ICAgKiBiMy9CM1ZhbGlkYXRlLmNwcDoKKyAgICAgICAgKiBiMy9CM1ZhbHVlLmNwcDoKKyAgICAg
ICAgKEpTQzo6QjM6OlZhbHVlOjplZmZlY3RzKToKKyAgICAgICAgKEpTQzo6QjM6OlZhbHVlOjp0
eXBlRm9yKToKKyAgICAgICAgKiBiMy9CM1ZhbHVlLmg6CisgICAgICAgICogYjMvYWlyL0FpckNv
ZGUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpjQ2FsbFNwZWNpYWwpOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjppc0VudHJ5cG9pbnQpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpDb2RlOjpyZXNldFJlYWNoYWJpbGl0eSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6
OkNvZGU6OmR1bXApOgorICAgICAgICAqIGIzL2Fpci9BaXJDb2RlLmg6CisgICAgICAgIChKU0M6
OkIzOjpBaXI6OkNvZGU6OnNldEZyYW1lU2l6ZSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNv
ZGU6Om51bUVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlw
b2ludHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjplbnRyeXBvaW50KToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6c2V0RW50cnlwb2ludHMpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpDb2RlOjplbnRyeXBvaW50TGFiZWwpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpD
b2RlOjpzZXRFbnRyeXBvaW50TGFiZWxzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6
Y2FsbGVlU2F2ZVJlZ2lzdGVycyk6CisgICAgICAgICogYjMvYWlyL0FpckN1c3RvbS5oOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpQYXRjaEN1c3RvbTo6aXNUZXJtaW5hbCk6CisgICAgICAgIChK
U0M6OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpoYXNOb25BcmdFZmZlY3RzKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6UGF0Y2hDdXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6UGF0Y2hDdXN0b206OmdlbmVyYXRlKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6Q29tbW9uQ3VzdG9tQmFzZTo6aGFzTm9uQXJnRWZmZWN0cyk6CisgICAgICAg
IChKU0M6OkIzOjpBaXI6OkNDYWxsQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6Q29sZENDYWxsQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6U2h1ZmZsZUN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6
OkVudHJ5U3dpdGNoQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6
RW50cnlTd2l0Y2hDdXN0b206OmlzVmFsaWRGb3JtU3RhdGljKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206OmlzVmFsaWRGb3JtKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206OmFkbWl0c1N0YWNrKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6RW50cnlTd2l0Y2hDdXN0b206OmlzVGVybWluYWwpOgorICAgICAgICAoSlNDOjpCMzo6
QWlyOjpFbnRyeVN3aXRjaEN1c3RvbTo6aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMpOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpFbnRyeVN3aXRjaEN1c3RvbTo6Z2VuZXJhdGUpOgorICAgICAg
ICAqIGIzL2Fpci9BaXJHZW5lcmF0ZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OnByZXBh
cmVGb3JHZW5lcmF0aW9uKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Z2VuZXJhdGUpOgorICAg
ICAgICAqIGIzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcDogQWRkZWQuCisgICAgICAgIChK
U0M6OkIzOjpBaXI6Omxvd2VyRW50cnlTd2l0Y2gpOgorICAgICAgICAqIGIzL2Fpci9BaXJMb3dl
ckVudHJ5U3dpdGNoLmg6IEFkZGVkLgorICAgICAgICAqIGIzL2Fpci9BaXJPcGNvZGUub3Bjb2Rl
czoKKyAgICAgICAgKiBiMy9haXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcDoKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6YmxvY2tzSW5PcHRpbWl6ZWRPcmRlcik6CisgICAgICAgICogYjMvYWly
L0FpclNwZWNpYWwuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpTcGVjaWFsOjppc1Rlcm1p
bmFsKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6U3BlY2lhbDo6aGFzTm9uQXJnRWZmZWN0cyk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlNwZWNpYWw6Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZl
Y3RzKToKKyAgICAgICAgKiBiMy9haXIvQWlyU3BlY2lhbC5oOgorICAgICAgICAqIGIzL2Fpci9B
aXJWYWxpZGF0ZS5jcHA6CisgICAgICAgICogYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmI6Cisg
ICAgICAgICogYjMvdGVzdGIzLmNwcDoKKwogMjAxNi0wNy0yMSAgQ3NhYmEgT3N6dHJvZ29uw6Fj
ICA8b3NzeUB3ZWJraXQub3JnPgogCiAgICAgICAgIENsYXJpZnkgdGVzdGluZyBtb2RlIG5hbWVz
IGluIHJ1bi1qc2Mtc3RyZXNzLXRlc3RzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01h
a2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlz
dHMudHh0CShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VM
aXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTg5LDYgKzg5LDcgQEAgc2V0KEphdmFTY3JpcHRD
b3JlX1NPVVJDRVMKICAgICBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3Bw
CiAgICAgYjMvYWlyL0FpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuY3BwCiAgICAgYjMvYWlyL0Fpckxv
d2VyQWZ0ZXJSZWdBbGxvYy5jcHAKKyAgICBiMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAK
ICAgICBiMy9haXIvQWlyTG93ZXJNYWNyb3MuY3BwCiAgICAgYjMvYWlyL0Fpck9wdGltaXplQmxv
Y2tPcmRlci5jcHAKICAgICBiMy9haXIvQWlyUGhhc2VTY29wZS5jcHAKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBj
b3B5KQpAQCAtNjk4LDYgKzY5OCw4IEBACiAJCTBGREIyQ0VBMTc0ODk2QzcwMDdCM0MxQiAvKiBD
b25jdXJyZW50SklUTG9jay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEZEQjJDRTkxNzQ4OTZDNzAwN0IzQzFCIC8qIENvbmN1cnJlbnRKSVRMb2NrLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZEREJG
QjUxNjY2RUVEODAwQzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZEREJGQjIxNjY2RUVE
NTAwQzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuY3BwICovOyB9OwogCQkwRkRE
QkZCNjE2NjZFRURBMDBDNTVGRUYgLyogREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZEREJGQjMxNjY2RUVE
NTAwQzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCAqLzsgfTsKKwkJMEZERjcw
ODUxRDNGMkMyMjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZERjcwODMxRDNGMkMxRjAwOTI3
NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwICovOyB9OworCQkwRkRGNzA4NjFEM0YyQzI1
MDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZERjcwODQxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxv
d2VyRW50cnlTd2l0Y2guaCAqLzsgfTsKIAkJMEZFMDUwMTQxQUE5MDkxMTAwRDMzQjMzIC8qIEFy
Z3VtZW50c01vZGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDBGRTA1MDBDMUFBOTA5MTEwMEQzM0IzMyAvKiBBcmd1bWVudHNNb2RlLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZFMDUwMTUxQUE5MDkx
MTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50c09mZnNldC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkUwNTAwRDFBQTkwOTExMDBEMzNCMzMgLyog
RGlyZWN0QXJndW1lbnRzT2Zmc2V0LmNwcCAqLzsgfTsKIAkJMEZFMDUwMTYxQUE5MDkxMTAwRDMz
QjMzIC8qIERpcmVjdEFyZ3VtZW50c09mZnNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZFMDUwMEUxQUE5MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFy
Z3VtZW50c09mZnNldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7
IH07IH07CkBAIC0yODk4LDYgKzI5MDAsOCBAQAogCQkwRkRCMkNFOTE3NDg5NkM3MDA3QjNDMUIg
LyogQ29uY3VycmVudEpJVExvY2suaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
Q29uY3VycmVudEpJVExvY2suaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZEREJG
QjIxNjY2RUVENTAwQzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVt
cC5jcHA7IHBhdGggPSBkZmcvREZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRERCRkIzMTY2NkVFRDUwMEM1NUZFRiAvKiBERkdWYXJp
YWJsZUFjY2Vzc0RhdGFEdW1wLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERG
R1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaDsgcGF0aCA9IGRmZy9ERkdWYXJpYWJsZUFjY2Vzc0Rh
dGFEdW1wLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGREY3MDgzMUQzRjJDMUYw
MDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IEFpckxvd2VyRW50cnlTd2l0Y2guY3BwOyBwYXRoID0gYjMvYWlyL0Fp
ckxvd2VyRW50cnlTd2l0Y2guY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRkRG
NzA4NDFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBBaXJMb3dlckVudHJ5U3dpdGNoLmg7IHBhdGggPSBiMy9h
aXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
RkUwNTAwQzFBQTkwOTExMDBEMzNCMzMgLyogQXJndW1lbnRzTW9kZS5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBBcmd1bWVudHNNb2RlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTBGRTA1MDBEMUFBOTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZz
ZXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRGlyZWN0QXJndW1l
bnRzT2Zmc2V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZFMDUwMEUxQUE5
MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50c09mZnNldC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBEaXJlY3RBcmd1bWVudHNPZmZzZXQuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKQEAgLTQ4OTksNiArNDkwMyw4IEBACiAJCQkJMEZFMzRDMTgxQzRCMzlBRTAw
MDNBNTEyIC8qIEFpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuaCAqLywKIAkJCQkwRjYxODMyNTFDNDVC
RjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmNwcCAqLywKIAkJCQkwRjYxODMy
NjFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmggKi8sCisJCQkJMEZE
RjcwODMxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guY3BwICovLAorCQkJ
CTBGREY3MDg0MUQzRjJDMUYwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmggKi8sCiAJ
CQkJMEY2MTgzMjcxQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckxvd2VyTWFjcm9zLmNwcCAqLywKIAkJ
CQkwRjYxODMyODFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJNYWNyb3MuaCAqLywKIAkJCQky
NjQwOTFGQTFCRTJGRDQxMDA2ODREQjIgLyogQWlyT3Bjb2RlLm9wY29kZXMgKi8sCkBAIC04MDcy
LDYgKzgwNzgsNyBAQAogCQkJCUJDMThDNDYzMEUxNkY1Q0QwMEIzNDQ2MCAvKiBTb3VyY2VQcm92
aWRlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTQ5REMxNkMxMkVGMjk0RTAwMTg0QTFGIC8qIFNv
dXJjZVByb3ZpZGVyQ2FjaGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUU0OURDMTZEMTJFRjI5NTMw
MDE4NEExRiAvKiBTb3VyY2VQcm92aWRlckNhY2hlSXRlbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
MEZERjcwODYxRDNGMkMyNTAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guaCBpbiBIZWFk
ZXJzICovLAogCQkJCTBGQjdGMzlFMTVFRDhFNDYwMEYxNjdCMiAvKiBTcGFyc2VBcnJheVZhbHVl
TWFwLmggaW4gSGVhZGVycyAqLywKIAkJCQlBNzM4NjU1NDExODY5N0I0MDA1NDAyNzkgLyogU3Bl
Y2lhbGl6ZWRUaHVua0pJVC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEY1NTQxQjIxNjEzQzFGQjAw
Q0UzRTI1IC8qIFNwZWNpYWxQb2ludGVyLmggaW4gSGVhZGVycyAqLywKQEAgLTkzNzgsNiArOTM4
NSw3IEBACiAJCQkJMEYyNEU1NTAxN0VFMjc0OTAwQUJCMjE3IC8qIFJlcGF0Y2guY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJMEY2QjhBRDgxQzRFRERBMjAwOTY5MDUyIC8qIEIzRHVwbGljYXRlVGFp
bHMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNTI3NzczREUxQUFGODNBQzAwQkRFN0U4IC8qIFJ1
bnRpbWVUeXBlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTBGREY3MDg1MUQzRjJDMjIwMDkyNzQ0
OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNzcwMDky
MTQwMkZGM0MwMDc4RUIzOSAvKiBTYW1wbGluZ0NvdW50ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJNzkwNUJCNjgxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQkwRkUwNTAyNzFBQTkwOTU2MDBEMzNCMzMgLyogU2NvcGVkQXJndW1lbnRzLmNw
cCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNC
bG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jhc2ljQmxv
Y2suaAkocmV2aXNpb24gMjAzNTMwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFz
aWNCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC05Niw4ICs5Niw4IEBAIHB1YmxpYzoKICAgICAK
ICAgICB2b2lkIGNsZWFyU3VjY2Vzc29ycygpOwogICAgIEpTX0VYUE9SVF9QUklWQVRFIHZvaWQg
YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayk7Ci0gICAgdm9pZCBzZXRTdWNjZXNzb3Jz
KEZyZXF1ZW50ZWRCbG9jayk7Ci0gICAgdm9pZCBzZXRTdWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9j
aywgRnJlcXVlbnRlZEJsb2NrKTsKKyAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHNldFN1Y2Nl
c3NvcnMoRnJlcXVlbnRlZEJsb2NrKTsKKyAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHNldFN1
Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2NrLCBGcmVxdWVudGVkQmxvY2spOwogCiAgICAgQmFzaWNC
bG9jayogc3VjY2Vzc29yQmxvY2sodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nl
c3NvcihpbmRleCkuYmxvY2soKTsgfQogICAgIEJhc2ljQmxvY2sqJiBzdWNjZXNzb3JCbG9jayh1
bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gc3VjY2Vzc29yKGluZGV4KS5ibG9jaygpOyB9CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrVXRpbHMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrVXRpbHMuaAkocmV2aXNp
b24gMjAzNTMwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNCbG9ja1V0aWxz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTg2LDE0ICs4NiwxOCBAQCB2b2lkIHVwZGF0ZVByZWRlY2Vz
c29yc0FmdGVyKEJhc2ljQmxvY2sqCiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljQmxvY2s+
Ci12b2lkIHJlY29tcHV0ZVByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2lj
QmxvY2s+PiYgYmxvY2tzKQordm9pZCBjbGVhclByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1bmlx
dWVfcHRyPEJhc2ljQmxvY2s+PiYgYmxvY2tzKQogewotICAgIC8vIENsZWFyIGFsbCBwcmVkZWNl
c3NvciBsaXN0cyBmaXJzdC4KICAgICBmb3IgKGF1dG8mIGJsb2NrIDogYmxvY2tzKSB7CiAgICAg
ICAgIGlmIChibG9jaykKICAgICAgICAgICAgIGJsb2NrLT5wcmVkZWNlc3NvcnMoKS5yZXNpemUo
MCk7CiAgICAgfQorfQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgordm9pZCByZWNv
bXB1dGVQcmVkZWNlc3NvcnMoVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0Jsb2NrPj4mIGJs
b2NrcykKK3sKKyAgICBjbGVhclByZWRlY2Vzc29ycyhibG9ja3MpOwogICAgIHVwZGF0ZVByZWRl
Y2Vzc29yc0FmdGVyKGJsb2Nrc1swXS5nZXQoKSk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM0ZyZXF1ZW5jeUNsYXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAkocmV2aXNpb24gMjAzNTMwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAkod29ya2luZyBjb3B5KQpA
QCAtNDMsNiArNDMsMTMgQEAgZW51bSBjbGFzcyBGcmVxdWVuY3lDbGFzcyA6IHVpbnQ4X3Qgewog
ICAgIFJhcmUKIH07CiAKK2lubGluZSBGcmVxdWVuY3lDbGFzcyBtYXhGcmVxdWVuY3koRnJlcXVl
bmN5Q2xhc3MgYSwgRnJlcXVlbmN5Q2xhc3MgYikKK3sKKyAgICBpZiAoYSA9PSBGcmVxdWVuY3lD
bGFzczo6Tm9ybWFsKQorICAgICAgICByZXR1cm4gRnJlcXVlbmN5Q2xhc3M6Ok5vcm1hbDsKKyAg
ICByZXR1cm4gYjsKK30KKwogfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCiAKIG5hbWVzcGFjZSBX
VEYgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzR2VuZXJhdGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmF0ZS5oCShyZXZpc2lvbiAy
MDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmF0ZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKQEAgLTM5LDEyICszOSwxMiBAQCBuYW1lc3BhY2UgQWlyIHsgY2xhc3MgQ29kZTsgfQogCiAv
LyBUaGlzIHRha2VzIGEgQjM6OlByb2NlZHVyZSwgb3B0aW1pemVzIGl0IGluLXBsYWNlLCBsb3dl
cnMgaXQgdG8gQWlyLCBhbmQgcHJlcGFyZXMgdGhlIEFpciBmb3IKIC8vIGdlbmVyYXRpb24uCi12
b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKFByb2NlZHVyZSYsIHVuc2lnbmVkIG9wdExldmVsID0g
MSk7CitKU19FWFBPUlRfUFJJVkFURSB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKFByb2NlZHVy
ZSYsIHVuc2lnbmVkIG9wdExldmVsID0gMSk7CiAKIC8vIFRoaXMgdGFrZXMgYSBCMzo6UHJvY2Vk
dXJlIHRoYXQgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGdlbmVyYXRpb24gKGkuZS4gaXQgaGFzIGJl
ZW4gbG93ZXJlZCB0byBBaXIgYW5kCiAvLyB0aGUgQWlyIGhhcyBiZWVuIHByZXBhcmVkIGZvciBn
ZW5lcmF0aW9uKSBhbmQgZ2VuZXJhdGVzIGl0LiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIGNh
bGxpbmcKIC8vIEFpcjo6Z2VuZXJhdGUoKSBvbiB0aGUgUHJvY2VkdXJlOjpjb2RlKCkuCi12b2lk
IGdlbmVyYXRlKFByb2NlZHVyZSYsIENDYWxsSGVscGVycyYpOworSlNfRVhQT1JUX1BSSVZBVEUg
dm9pZCBnZW5lcmF0ZShQcm9jZWR1cmUmLCBDQ2FsbEhlbHBlcnMmKTsKIAogLy8gVGhpcyB0YWtl
cyBhIEIzOjpQcm9jZWR1cmUsIG9wdGltaXplcyBpdCBpbi1wbGFjZSwgYW5kIGxvd2VycyBpdCB0
byBBaXIuIFlvdSBjYW4gdGhlbiBnZW5lcmF0ZQogLy8gdGhlIEFpciB0byBtYWNoaW5lIGNvZGUg
dXNpbmcgQWlyOjpwcmVwYXJlRm9yR2VuZXJhdGlvbigpIGFuZCBBaXI6OmdlbmVyYXRlKCkgb24g
dGhlIFByb2NlZHVyZSdzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmlj
RnJlcXVlbnRlZEJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzR2VuZXJpY0ZyZXF1ZW50ZWRCbG9jay5oCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmljRnJlcXVlbnRlZEJsb2NrLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM5LDcgKzM5LDcgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CiB0ZW1w
bGF0ZTx0eXBlbmFtZSBCYXNpY0Jsb2NrPgogY2xhc3MgR2VuZXJpY0ZyZXF1ZW50ZWRCbG9jayB7
CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgR2VuZXJpY0ZyZXF1ZW50ZWRCbG9jaygKKyAgICBHZW5l
cmljRnJlcXVlbnRlZEJsb2NrKAogICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IG51bGxwdHIs
IEZyZXF1ZW5jeUNsYXNzIGZyZXF1ZW5jeSA9IEZyZXF1ZW5jeUNsYXNzOjpOb3JtYWwpCiAgICAg
ICAgIDogbV9ibG9jayhibG9jaykKICAgICAgICAgLCBtX2ZyZXF1ZW5jeShmcmVxdWVuY3kpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNMb3dlclRvQWlyLmNwcAkocmV2aXNpb24g
MjAzNTMwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTG93ZXJUb0Fpci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI0NDYsNiArMjQ0NiwxMSBAQCBwcml2YXRlOgogICAgICAgICAgICAg
YXBwZW5kKEFpcjo6T29wcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICBjYXNlIEIzOjpFbnRyeVN3aXRjaDogeworICAgICAgICAgICAgYXBw
ZW5kKEFpcjo6RW50cnlTd2l0Y2gpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAK
ICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzTW92ZUNvbnN0YW50cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzTW92ZUNvbnN0YW50cy5jcHAJKHJldmlzaW9uIDIwMzUzMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM01vdmVDb25zdGFudHMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYzoKICAgICAgICAgCiAgICAgICAgIGhvaXN0Q29u
c3RhbnRzKAogICAgICAgICAgICAgWyZdIChjb25zdCBWYWx1ZUtleSYga2V5KSAtPiBib29sIHsK
LSAgICAgICAgICAgICAgICByZXR1cm4ga2V5Lm9wY29kZSgpID09IENvbnN0MzIgfHwga2V5Lm9w
Y29kZSgpID09IENvbnN0NjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5vcGNvZGUoKSA9
PSBDb25zdDMyIHx8IGtleS5vcGNvZGUoKSA9PSBDb25zdDY0IHx8IGtleS5vcGNvZGUoKSA9PSBB
cmd1bWVudFJlZzsKICAgICAgICAgICAgIH0pOwogICAgIH0KIApJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNPcGNvZGUuY3BwCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTAsNiArMjkwLDkg
QEAgdm9pZCBwcmludEludGVybmFsKFByaW50U3RyZWFtJiBvdXQsIE9wYwogICAgIGNhc2UgU3dp
dGNoOgogICAgICAgICBvdXQucHJpbnQoIlN3aXRjaCIpOwogICAgICAgICByZXR1cm47CisgICAg
Y2FzZSBFbnRyeVN3aXRjaDoKKyAgICAgICAgb3V0LnByaW50KCJFbnRyeVN3aXRjaCIpOworICAg
ICAgICByZXR1cm47CiAgICAgY2FzZSBSZXR1cm46CiAgICAgICAgIG91dC5wcmludCgiUmV0dXJu
Iik7CiAgICAgICAgIHJldHVybjsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09w
Y29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5o
CShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMjE2LDYgKzIxNiwxMSBAQCBlbnVtIE9wY29kZSA6IGludDE2
X3QgewogCiAgICAgLy8gU3dpdGNoLiBTd2l0Y2hlcyBvdmVyIGVpdGhlciBJbnQzMiBvciBJbnQ2
NC4gVXNlcyB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuCiAgICAgU3dpdGNoLAorICAgIAorICAgIC8v
IE11bHRpcGxlIGVudHJ5cG9pbnQgYXJlIHN1cHBvcnRlZCB2aWEgdGhlIEVudHJ5U3dpdGNoIG9w
ZXJhdGlvbi4gUGxhY2UgdGhpcyBpbiB0aGUgcm9vdAorICAgIC8vIGJsb2NrIGFuZCBsaXN0IHRo
ZSBlbnRyeXBvaW50cyBhcyB0aGUgc3VjY2Vzc29ycy4gQWxsIGJsb2NrcyBiYWNrd2FyZHMtcmVh
Y2hhYmxlIGZyb20KKyAgICAvLyBFbnRyeVN3aXRjaCBhcmUgZHVwbGljYXRlZCBmb3IgZWFjaCBl
bnRyeXBvaW50LgorICAgIEVudHJ5U3dpdGNoLAogCiAgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQg
QjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWlyIHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBq
dXN0IHJldHVybiBhbnkKICAgICAvLyB0eXBlLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yODAsNiArMjgwLDEx
IEBAIGJvb2wgUHJvY2VkdXJlOjppc0Zhc3RDb25zdGFudChjb25zdCBWYWwKICAgICByZXR1cm4g
bV9mYXN0Q29uc3RhbnRzLmNvbnRhaW5zKGNvbnN0YW50KTsKIH0KIAorQ0NhbGxIZWxwZXJzOjpM
YWJlbCBQcm9jZWR1cmU6OmVudHJ5cG9pbnRMYWJlbCh1bnNpZ25lZCBpbmRleCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9jb2RlLT5lbnRyeXBvaW50TGFiZWwoaW5kZXgpOworfQorCiB2b2lkKiBQ
cm9jZWR1cmU6OmFkZERhdGFTZWN0aW9uKHNpemVfdCBzaXplKQogewogICAgIGlmICghc2l6ZSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1Byb2NlZHVyZS5oCShyZXZpc2lvbiAyMDM1
MzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuaAkod29ya2luZyBj
b3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkIzU3BhcnNlQ29sbGVjdGlvbi5oIgog
I2luY2x1ZGUgIkIzVHlwZS5oIgogI2luY2x1ZGUgIkIzVmFsdWVLZXkuaCIKKyNpbmNsdWRlICJD
Q2FsbEhlbHBlcnMuaCIKICNpbmNsdWRlICJQdXJlTmFOLmgiCiAjaW5jbHVkZSAiUmVnaXN0ZXJB
dE9mZnNldExpc3QuaCIKICNpbmNsdWRlIDx3dGYvQmFnLmg+CkBAIC01Nyw2ICs1OCwxMyBAQCBj
bGFzcyBWYXJpYWJsZTsKIAogbmFtZXNwYWNlIEFpciB7IGNsYXNzIENvZGU7IH0KIAorLy8gVGhp
cyByZXByZXNlbnRzIEIzJ3MgdmlldyBvZiBhIHBpZWNlIG9mIGNvZGUuIE5vdGUgdGhhdCB0aGlz
IG9iamVjdCBtdXN0IGV4aXN0IGluIGEgMToxCisvLyByZWxhdGlvbnNoaXAgd2l0aCBBaXI6OkNv
ZGUuIEIzOjpQcm9jZWR1cmUgYW5kIEFpcjo6Q29kZSBhcmUganVzdCBkaWZmZXJlbnQgZmFjYWRl
cyBvZiB0aGUgQjMKKy8vIGNvbXBpbGVyJ3Mga25vd2xlZGdlIGFib3V0IGEgcGllY2Ugb2YgY29k
ZS4gU29tZSBraW5kcyBvZiBzdGF0ZSBhcmVuJ3QgcGVyZmVjdCBmaXRzIGZvciBlaXRoZXIKKy8v
IFByb2NlZHVyZSBvciBDb2RlLCBhbmQgYXJlIHBsYWNlZCBpbiBvbmUgb3IgdGhlIG90aGVyIGJh
c2VkIG9uIGNvbnZlbmllbmNlLiBQcm9jZWR1cmUgYWx3YXlzCisvLyBhbGxvY2F0ZXMgYSBDb2Rl
LCBhbmQgYSBDb2RlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dCBhbiBvd25pbmcgUHJvY2Vk
dXJlIGFuZCB0aGV5IGFsd2F5cworLy8gaGF2ZSByZWZlcmVuY2VzIHRvIGVhY2ggb3RoZXIuCisK
IGNsYXNzIFByb2NlZHVyZSB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsK
ICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKQEAgLTIwOSw2ICsyMTcsMTQgQEAgcHVibGlj
OgogCiAgICAgdm9pZCBhZGRGYXN0Q29uc3RhbnQoY29uc3QgVmFsdWVLZXkmKTsKICAgICBib29s
IGlzRmFzdENvbnN0YW50KGNvbnN0IFZhbHVlS2V5Jik7CisgICAgCisgICAgdW5zaWduZWQgbnVt
RW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX251bUVudHJ5cG9pbnRzOyB9CisgICAgdm9p
ZCBzZXROdW1FbnRyeXBvaW50cyh1bnNpZ25lZCBudW1FbnRyeXBvaW50cykgeyBtX251bUVudHJ5
cG9pbnRzID0gbnVtRW50cnlwb2ludHM7IH0KKyAgICAKKyAgICAvLyBPbmx5IGNhbGwgdGhpcyBh
ZnRlciBjb2RlIGdlbmVyYXRpb24gaXMgY29tcGxldGUuIE5vdGUgdGhhdCB0aGUgbGFiZWwgZm9y
IHRoZSAwdGggZW50cnlwb2ludAorICAgIC8vIHNob3VsZCBwb2ludCB0byBleGFjdGx5IHdoZXJl
IHRoZSBjb2RlIGdlbmVyYXRpb24gY3Vyc29yIHdhcyBiZWZvcmUgeW91IHN0YXJ0ZWQgZ2VuZXJh
dGluZworICAgIC8vIGNvZGUuCisgICAgSlNfRVhQT1JUX1BSSVZBVEUgQ0NhbGxIZWxwZXJzOjpM
YWJlbCBlbnRyeXBvaW50TGFiZWwodW5zaWduZWQgZW50cnlwb2ludEluZGV4KSBjb25zdDsKIAog
ICAgIC8vIFRoZSBuYW1lIGhhcyB0byBiZSBhIHN0cmluZyBsaXRlcmFsLCBzaW5jZSB3ZSBkb24n
dCBkbyBhbnkgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBzdHJpbmcuCiAgICAgdm9pZCBzZXRM
YXN0UGhhc2VOYW1lKGNvbnN0IGNoYXIqIG5hbWUpCkBAIC0yNjEsNiArMjc3LDcgQEAgcHJpdmF0
ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBtX2NmZzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8
RG9taW5hdG9ycz4gbV9kb21pbmF0b3JzOwogICAgIEhhc2hTZXQ8VmFsdWVLZXk+IG1fZmFzdENv
bnN0YW50czsKKyAgICB1bnNpZ25lZCBtX251bUVudHJ5cG9pbnRzIHsgMSB9OwogICAgIGNvbnN0
IGNoYXIqIG1fbGFzdFBoYXNlTmFtZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8T3BhcXVlQnlwcm9k
dWN0cz4gbV9ieXByb2R1Y3RzOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxBaXI6OkNvZGU+IG1fY29k
ZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWxpZGF0ZS5jcHAJKHJldmlzaW9u
IDIwMzUzMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDE0LDcgKzQxNCwxMyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGNhc2VWYWx1ZXMuc2l6ZSgpOyArK2kpCiAgICAgICAg
ICAgICAgICAgICAgIFZBTElEQVRFKGNhc2VWYWx1ZXNbaSAtIDFdICE9IGNhc2VWYWx1ZXNbaV0s
ICgiQXQgIiwgKnZhbHVlLCAiLCBjYXNlVmFsdWUgPSAiLCBjYXNlVmFsdWVzW2ldKSk7CiAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CisgICAgICAgICAgICAgICAgVkFMSURBVEUoIXZhbHVl
LT5udW1DaGlsZHJlbigpLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAgICAgICAgICAgIFZBTElE
QVRFKHZhbHVlLT50eXBlKCkgPT0gVm9pZCwgKCJBdCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAg
ICAgICBWQUxJREFURSh2YWx1ZU93bmVyLmdldCh2YWx1ZSktPm51bVN1Y2Nlc3NvcnMoKSA9PSBt
X3Byb2NlZHVyZS5udW1FbnRyeXBvaW50cygpLCAoIkF0ICIsICp2YWx1ZSkpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBWQUxJREFURSghKHZh
bHVlLT5lZmZlY3RzKCkud3JpdGVzICYmIHZhbHVlLT5rZXkoKSksICgiQXQgIiwgKnZhbHVlKSk7
CiAgICAgICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYWx1ZS5jcHAJKHJldmlz
aW9uIDIwMzUzMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNjEyLDYgKzYxMiw3IEBAIEVmZmVjdHMgVmFsdWU6OmVmZmVjdHMoKSBj
b25zdAogICAgIGNhc2UgU3dpdGNoOgogICAgIGNhc2UgUmV0dXJuOgogICAgIGNhc2UgT29wczoK
KyAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICByZXN1bHQudGVybWluYWwgPSB0cnVlOwog
ICAgICAgICBicmVhazsKICAgICB9CkBAIC03OTAsNiArNzkxLDcgQEAgVHlwZSBWYWx1ZTo6dHlw
ZUZvcihPcGNvZGUgb3Bjb2RlLCBWYWx1ZQogICAgIGNhc2UgQnJhbmNoOgogICAgIGNhc2UgUmV0
dXJuOgogICAgIGNhc2UgT29wczoKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAgICByZXR1
cm4gVm9pZDsKICAgICBjYXNlIFNlbGVjdDoKICAgICAgICAgQVNTRVJUKHNlY29uZENoaWxkKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkocmV2aXNpb24gMjAzNTMwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjgz
LDYgKzI4Myw3IEBAIHByaXZhdGU6CiAgICAgICAgIGNhc2UgUGhpOgogICAgICAgICBjYXNlIEp1
bXA6CiAgICAgICAgIGNhc2UgT29wczoKKyAgICAgICAgY2FzZSBFbnRyeVN3aXRjaDoKICAgICAg
ICAgICAgIGlmIChVTkxJS0VMWShudW1BcmdzKSkKICAgICAgICAgICAgICAgICBiYWRPcGNvZGUo
b3Bjb2RlLCBudW1BcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL3Rlc3RiMy5jcHAJKHJldmlzaW9uIDIwMzUzMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy90ZXN0YjMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5j
bHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKICNpbmNsdWRlICJCM0NvbnN0UHRyVmFsdWUuaCIKICNp
bmNsdWRlICJCM0VmZmVjdHMuaCIKKyNpbmNsdWRlICJCM0dlbmVyYXRlLmgiCiAjaW5jbHVkZSAi
QjNNYXRoRXh0cmFzLmgiCiAjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgogI2luY2x1ZGUgIkIz
UHJvY2VkdXJlLmgiCkBAIC05NCw2ICs5NSwxNiBAQCBTdGF0aWNMb2NrIGNyYXNoTG9jazsKICAg
ICAgICAgQ1JBU0goKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlIChmYWxzZSkKIAorI2RlZmluZSBDSEVDS19FUSh4
LCB5KSBkbyB7IFwKKyAgICAgICAgYXV0byBfX3ggPSAoeCk7IFwKKyAgICAgICAgYXV0byBfX3kg
PSAoeSk7IFwKKyAgICAgICAgaWYgKF9feCA9PSBfX3kpIFwKKyAgICAgICAgICAgIGJyZWFrOyBc
CisgICAgICAgIGNyYXNoTG9jay5sb2NrKCk7IFwKKyAgICAgICAgV1RGUmVwb3J0QXNzZXJ0aW9u
RmFpbHVyZShfX0ZJTEVfXywgX19MSU5FX18sIFdURl9QUkVUVFlfRlVOQ1RJT04sIHRvQ1N0cmlu
ZygjeCAiID09ICIgI3ksICIgKCIgI3ggIiA9PSAiLCBfX3gsICIsICIgI3kgIiA9PSAiLCBfX3ks
ICIpIikuZGF0YSgpKTsgXAorICAgICAgICBDUkFTSCgpOyBcCisgICAgfSB3aGlsZSAoZmFsc2Up
CisKIFZNKiB2bTsKIAogc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uPiBjb21waWxlKFByb2Nl
ZHVyZSYgcHJvY2VkdXJlLCB1bnNpZ25lZCBvcHRMZXZlbCA9IDEpCkBAIC0xMDIsMTMgKzExMywx
OSBAQCBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb24+IGNvbXBpbGUoUHJvCiB9CiAKIHRlbXBs
YXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KLVQgaW52b2tlKGNvbnN0IENv
bXBpbGF0aW9uJiBjb2RlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQorVCBpbnZva2UoTWFjcm9B
c3NlbWJsZXJDb2RlUHRyIHB0ciwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKIHsKLSAgICBUICgq
ZnVuY3Rpb24pKEFyZ3VtZW50cy4uLikgPSBiaXR3aXNlX2Nhc3Q8VCgqKShBcmd1bWVudHMuLi4p
Pihjb2RlLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpKTsKKyAgICBUICgqZnVuY3Rpb24pKEFy
Z3VtZW50cy4uLikgPSBiaXR3aXNlX2Nhc3Q8VCgqKShBcmd1bWVudHMuLi4pPihwdHIuZXhlY3V0
YWJsZUFkZHJlc3MoKSk7CiAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZ3VtZW50cy4uLik7CiB9CiAK
IHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KK1QgaW52b2tlKGNv
bnN0IENvbXBpbGF0aW9uJiBjb2RlLCBBcmd1bWVudHMuLi4gYXJndW1lbnRzKQoreworICAgIHJl
dHVybiBpbnZva2U8VD4oY29kZS5jb2RlKCksIGFyZ3VtZW50cy4uLik7Cit9CisKK3RlbXBsYXRl
PHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KIFQgY29tcGlsZUFuZFJ1bihQcm9j
ZWR1cmUmIHByb2NlZHVyZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKIHsKICAgICByZXR1cm4g
aW52b2tlPFQ+KCpjb21waWxlKHByb2NlZHVyZSksIGFyZ3VtZW50cy4uLik7CkBAIC0xMjM3Nyw2
ICsxMjM5NCwzNDMgQEAgdm9pZCB0ZXN0UmVzZXRSZWFjaGFiaWxpdHlEYW5nbGluZ1JlZmVyZQog
ICAgIHZhbGlkYXRlKHByb2MpOwogfQogCit2b2lkIHRlc3RFbnRyeVN3aXRjaFNpbXBsZSgpCit7
CisgICAgUHJvY2VkdXJlIHByb2M7CisgICAgcHJvYy5zZXROdW1FbnRyeXBvaW50cygzKTsKKyAg
ICAKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxv
Y2sqIG9uZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0d28gPSBwcm9jLmFk
ZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhyZWUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAg
CisgICAgcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBFbnRyeVN3aXRjaCwgT3JpZ2luKCkp
OworICAgIHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxvY2sob25lKSk7CisgICAg
cm9vdC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0d28pKTsKKyAgICByb290LT5h
cHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJsb2NrKHRocmVlKSk7CisgICAgCisgICAgb25lLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBSZXR1cm4sIE9yaWdpbigpLAorICAgICAg
ICBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBBZGQsIE9yaWdpbigp
LAorICAgICAgICAgICAgb25lLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCksCisgICAgICAgICAgICBvbmUtPmFwcGVuZE5l
dzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIx
KSkpOworICAgIAorICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgcHJvYywgUmV0
dXJuLCBPcmlnaW4oKSwKKyAgICAgICAgdHdvLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAg
ICAgcHJvYywgU3ViLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIHR3by0+YXBwZW5kTmV3PEFyZ3Vt
ZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApLAorICAg
ICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCks
IEdQUkluZm86OmFyZ3VtZW50R1BSMSkpKTsKKyAgICAKKyAgICB0aHJlZS0+YXBwZW5kTmV3PFZh
bHVlPigKKyAgICAgICAgcHJvYywgUmV0dXJuLCBPcmlnaW4oKSwKKyAgICAgICAgdGhyZWUtPmFw
cGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBNdWwsIE9yaWdpbigpLAorICAgICAg
ICAgICAgdGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwg
R1BSSW5mbzo6YXJndW1lbnRHUFIwKSwKKyAgICAgICAgICAgIHRocmVlLT5hcHBlbmROZXc8QXJn
dW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpKTsK
KyAgICAKKyAgICBwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jKTsKKyAgICAKKyAgICBDQ2FsbEhl
bHBlcnMgaml0KHZtKTsKKyAgICBnZW5lcmF0ZShwcm9jLCBqaXQpOworICAgIExpbmtCdWZmZXIg
bGlua0J1ZmZlcigqdm0sIGppdCwgbnVsbHB0cik7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFi
ZWxPbmUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMCkpOwor
ICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVHdvID0gbGlua0J1ZmZlci5sb2NhdGlvbk9mKHBy
b2MuZW50cnlwb2ludExhYmVsKDEpKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbFRocmVl
ID0gbGlua0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDIpKTsKKyAgICAK
KyAgICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgY29kZVJlZiA9IEZJTkFMSVpFX0NPREUobGlua0J1
ZmZlciwgKCJ0ZXN0YjMgY29tcGlsYXRpb24iKSk7CisgICAgCisgICAgQ0hFQ0soaW52b2tlPGlu
dD4obGFiZWxPbmUsIDEsIDIpID09IDMpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVHdv
LCAxLCAyKSA9PSAtMSk7CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwgMikg
PT0gMik7CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxPbmUsIC0xLCAyKSA9PSAxKTsKKyAg
ICBDSEVDSyhpbnZva2U8aW50PihsYWJlbFR3bywgLTEsIDIpID09IC0zKTsKKyAgICBDSEVDSyhp
bnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMikgPT0gLTIpOworfQorCit2b2lkIHRlc3RFbnRy
eVN3aXRjaFdpdGhDb21tb25QYXRocygpCit7CisgICAgUHJvY2VkdXJlIHByb2M7CisgICAgcHJv
Yy5zZXROdW1FbnRyeXBvaW50cygzKTsKKyAgICAKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJv
Yy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIG9uZSA9IHByb2MuYWRkQmxvY2soKTsKKyAg
ICBCYXNpY0Jsb2NrKiB0d28gPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhy
ZWUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZW5kID0gcHJvYy5hZGRCbG9j
aygpOworICAgIAorICAgIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRW50cnlTd2l0Y2gs
IE9yaWdpbigpKTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJsb2NrKG9u
ZSkpOworICAgIHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxvY2sodHdvKSk7Cisg
ICAgcm9vdC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0aHJlZSkpOworICAgIAor
ICAgIFVwc2lsb25WYWx1ZSogdXBzaWxvbk9uZSA9IG9uZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1
ZT4oCisgICAgICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICBvbmUtPmFwcGVuZE5ldzxWYWx1
ZT4oCisgICAgICAgICAgICBwcm9jLCBBZGQsIE9yaWdpbigpLAorICAgICAgICAgICAgb25lLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwK
KyAgICAgICAgICAgICAgICBvbmUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSksCisgICAgICAgICAgICBvbmUtPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAg
ICAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdp
bigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSkpOworICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVl
Pihwcm9jLCBKdW1wLCBPcmlnaW4oKSk7CisgICAgb25lLT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50
ZWRCbG9jayhlbmQpKTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25Ud28gPSB0d28t
PmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4oKSwKKyAgICAg
ICAgdHdvLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgU3ViLCBPcmlnaW4o
KSwKKyAgICAgICAgICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBw
cm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJn
dW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCkpLAor
ICAgICAgICAgICAgdHdvLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2Ms
IFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxBcmd1bWVu
dFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpKTsKKyAg
ICB0d28tPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIHR3by0+
c2V0U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2soZW5kKSk7CisgICAgCisgICAgVXBzaWxvblZh
bHVlKiB1cHNpbG9uVGhyZWUgPSB0aHJlZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4oCisgICAg
ICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAg
ICAgICAgICAgIHByb2MsIE11bCwgT3JpZ2luKCksCisgICAgICAgICAgICB0aHJlZS0+YXBwZW5k
TmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAg
ICAgICAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmln
aW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSksCisgICAgICAgICAgICB0aHJlZS0+YXBwZW5k
TmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAg
ICAgICAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmln
aW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpKTsKKyAgICB0aHJlZS0+YXBwZW5kTmV3PFZh
bHVlPihwcm9jLCBKdW1wLCBPcmlnaW4oKSk7CisgICAgdGhyZWUtPnNldFN1Y2Nlc3NvcnMoRnJl
cXVlbnRlZEJsb2NrKGVuZCkpOworICAgIAorICAgIFZhbHVlKiBwaGkgPSBlbmQtPmFwcGVuZE5l
dzxWYWx1ZT4ocHJvYywgUGhpLCBJbnQzMiwgT3JpZ2luKCkpOworICAgIHVwc2lsb25PbmUtPnNl
dFBoaShwaGkpOworICAgIHVwc2lsb25Ud28tPnNldFBoaShwaGkpOworICAgIHVwc2lsb25UaHJl
ZS0+c2V0UGhpKHBoaSk7CisgICAgCisgICAgZW5kLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAg
ICBwcm9jLCBSZXR1cm4sIE9yaWdpbigpLAorICAgICAgICBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4o
CisgICAgICAgICAgICBwcm9jLCBDaGlsbE1vZCwgT3JpZ2luKCksCisgICAgICAgICAgICBwaGks
IGVuZC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3Jp
Z2luKCksCisgICAgICAgICAgICAgICAgZW5kLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4o
cHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMikpKSk7CisgICAgCisgICAgcHJl
cGFyZUZvckdlbmVyYXRpb24ocHJvYyk7CisgICAgCisgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSk7
CisgICAgZ2VuZXJhdGUocHJvYywgaml0KTsKKyAgICBMaW5rQnVmZmVyIGxpbmtCdWZmZXIoKnZt
LCBqaXQsIG51bGxwdHIpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsT25lID0gbGlua0J1
ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDApKTsKKyAgICBDb2RlTG9jYXRp
b25MYWJlbCBsYWJlbFR3byA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihwcm9jLmVudHJ5cG9pbnRM
YWJlbCgxKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxUaHJlZSA9IGxpbmtCdWZmZXIu
bG9jYXRpb25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgyKSk7CisgICAgCisgICAgTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIGNvZGVSZWYgPSBGSU5BTElaRV9DT0RFKGxpbmtCdWZmZXIsICgidGVzdGIz
IGNvbXBpbGF0aW9uIikpOworICAgIAorICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25l
LCAxLCAyLCAxMCksIDMpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAy
LCAxMCksIC0xKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyLCAx
MCksIDIpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwgMiwgMTApLCAx
KTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgLTEsIDIsIDEwKSwgLTMpOwor
ICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIC0xLCAyLCAxMCksIC0yKTsKKyAg
ICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgMSwgMiwgMiksIDEpOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAyKSwgLTEpOworICAgIENIRUNLX0VRKGlu
dm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIsIDIpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8
aW50PihsYWJlbE9uZSwgLTEsIDIsIDIpLCAxKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50Pihs
YWJlbFR3bywgLTEsIDIsIDIpLCAtMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxU
aHJlZSwgLTEsIDIsIDIpLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwg
MSwgMiwgMCksIDApOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAw
KSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwgMiwgMCksIDAp
OworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwgMiwgMCksIDApOworICAg
IENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAtMSwgMiwgMCksIDApOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIC0xLCAyLCAwKSwgMCk7Cit9CisKK3ZvaWQgdGVz
dEVudHJ5U3dpdGNoV2l0aENvbW1vblBhdGhzQW5kTm9uVHJpdmlhbEVudHJ5cG9pbnQoKQorewor
ICAgIFByb2NlZHVyZSBwcm9jOworICAgIHByb2Muc2V0TnVtRW50cnlwb2ludHMoMyk7CisgICAg
CisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2Nr
KiBuZWdhdGUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZGlzcGF0Y2ggPSBw
cm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogb25lID0gcHJvYy5hZGRCbG9jaygpOwor
ICAgIEJhc2ljQmxvY2sqIHR3byA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0
aHJlZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiBlbmQgPSBwcm9jLmFkZEJs
b2NrKCk7CisKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25CYXNlID0gcm9vdC0+YXBwZW5kTmV3
PFVwc2lsb25WYWx1ZT4oCisgICAgICAgIHByb2MsIE9yaWdpbigpLCByb290LT5hcHBlbmROZXc8
VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAg
cm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZv
Ojphcmd1bWVudEdQUjApKSk7CisgICAgcm9vdC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAg
cHJvYywgQnJhbmNoLCBPcmlnaW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5kTmV3PFZhbHVlPigK
KyAgICAgICAgICAgIHByb2MsIEJpdEFuZCwgT3JpZ2luKCksCisgICAgICAgICAgICByb290LT5h
cHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3Vt
ZW50R1BSMyksCisgICAgICAgICAgICByb290LT5hcHBlbmROZXc8Q29uc3RQdHJWYWx1ZT4ocHJv
YywgT3JpZ2luKCksIDB4ZmYpKSk7CisgICAgcm9vdC0+c2V0U3VjY2Vzc29ycyhGcmVxdWVudGVk
QmxvY2sobmVnYXRlKSwgRnJlcXVlbnRlZEJsb2NrKGRpc3BhdGNoKSk7CisgICAgCisgICAgVXBz
aWxvblZhbHVlKiB1cHNpbG9uTmVnYXRlID0gbmVnYXRlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVl
PigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksCisgICAgICAgIG5lZ2F0ZS0+YXBwZW5kTmV3PFZh
bHVlPigKKyAgICAgICAgICAgIHByb2MsIE5lZywgT3JpZ2luKCksCisgICAgICAgICAgICBuZWdh
dGUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdp
bigpLAorICAgICAgICAgICAgICAgIG5lZ2F0ZS0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+
KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApKSkpOworICAgIG5lZ2F0ZS0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBKdW1wLCBPcmlnaW4oKSk7CisgICAgbmVnYXRlLT5zZXRT
dWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9jayhkaXNwYXRjaCkpOworICAgIAorICAgIFZhbHVlKiBh
cmcwID0gZGlzcGF0Y2gtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBJbnQzMiwgT3JpZ2lu
KCkpOworICAgIHVwc2lsb25CYXNlLT5zZXRQaGkoYXJnMCk7CisgICAgdXBzaWxvbk5lZ2F0ZS0+
c2V0UGhpKGFyZzApOworICAgIGRpc3BhdGNoLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEVudHJ5
U3dpdGNoLCBPcmlnaW4oKSk7CisgICAgZGlzcGF0Y2gtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVu
dGVkQmxvY2sob25lKSk7CisgICAgZGlzcGF0Y2gtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVk
QmxvY2sodHdvKSk7CisgICAgZGlzcGF0Y2gtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxv
Y2sodGhyZWUpKTsKKyAgICAKKyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25PbmUgPSBvbmUtPmFw
cGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4oKSwKKyAgICAgICAg
b25lLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgQWRkLCBPcmlnaW4oKSwK
KyAgICAgICAgICAgIGFyZzAsIG9uZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAg
ICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAgb25lLT5hcHBlbmROZXc8
QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkp
KSk7CisgICAgb25lLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpKTsKKyAg
ICBvbmUtPnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2NrKGVuZCkpOworICAgIAorICAgIFVw
c2lsb25WYWx1ZSogdXBzaWxvblR3byA9IHR3by0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4oCisg
ICAgICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICB0d28tPmFwcGVuZE5ldzxWYWx1ZT4oCisg
ICAgICAgICAgICBwcm9jLCBTdWIsIE9yaWdpbigpLAorICAgICAgICAgICAgYXJnMCwgdHdvLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwK
KyAgICAgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpKTsKKyAgICB0d28tPmFwcGVuZE5ldzxW
YWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIHR3by0+c2V0U3VjY2Vzc29ycyhGcmVx
dWVudGVkQmxvY2soZW5kKSk7CisgICAgCisgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uVGhyZWUg
PSB0aHJlZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4oCisgICAgICAgIHByb2MsIE9yaWdpbigp
LAorICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIE11
bCwgT3JpZ2luKCksCisgICAgICAgICAgICBhcmcwLCB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPigK
KyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAg
dGhyZWUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5m
bzo6YXJndW1lbnRHUFIxKSkpKTsKKyAgICB0aHJlZS0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBK
dW1wLCBPcmlnaW4oKSk7CisgICAgdGhyZWUtPnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2Nr
KGVuZCkpOworICAgIAorICAgIFZhbHVlKiBwaGkgPSBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4ocHJv
YywgUGhpLCBJbnQzMiwgT3JpZ2luKCkpOworICAgIHVwc2lsb25PbmUtPnNldFBoaShwaGkpOwor
ICAgIHVwc2lsb25Ud28tPnNldFBoaShwaGkpOworICAgIHVwc2lsb25UaHJlZS0+c2V0UGhpKHBo
aSk7CisgICAgCisgICAgZW5kLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBSZXR1
cm4sIE9yaWdpbigpLAorICAgICAgICBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAg
ICBwcm9jLCBDaGlsbE1vZCwgT3JpZ2luKCksCisgICAgICAgICAgICBwaGksIGVuZC0+YXBwZW5k
TmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAg
ICAgICAgICAgICAgZW5kLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2lu
KCksIEdQUkluZm86OmFyZ3VtZW50R1BSMikpKSk7CisgICAgCisgICAgcHJlcGFyZUZvckdlbmVy
YXRpb24ocHJvYyk7CisgICAgCisgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSk7CisgICAgZ2VuZXJh
dGUocHJvYywgaml0KTsKKyAgICBMaW5rQnVmZmVyIGxpbmtCdWZmZXIoKnZtLCBqaXQsIG51bGxw
dHIpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsT25lID0gbGlua0J1ZmZlci5sb2NhdGlv
bk9mKHByb2MuZW50cnlwb2ludExhYmVsKDApKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJl
bFR3byA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgxKSk7Cisg
ICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxUaHJlZSA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihw
cm9jLmVudHJ5cG9pbnRMYWJlbCgyKSk7CisgICAgCisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUmVm
IGNvZGVSZWYgPSBGSU5BTElaRV9DT0RFKGxpbmtCdWZmZXIsICgidGVzdGIzIGNvbXBpbGF0aW9u
IikpOworICAgIAorICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAxLCAyLCAxMCwg
ZmFsc2UpLCAzKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgMSwgMiwgMTAs
IGZhbHNlKSwgLTEpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIs
IDEwLCBmYWxzZSksIDIpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwg
MiwgMTAsIGZhbHNlKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIC0x
LCAyLCAxMCwgZmFsc2UpLCAtMyk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJl
ZSwgLTEsIDIsIDEwLCBmYWxzZSksIC0yKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJl
bE9uZSwgMSwgMiwgMTAsIHRydWUpLCAxKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJl
bFR3bywgMSwgMiwgMTAsIHRydWUpLCAtMyk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFi
ZWxUaHJlZSwgMSwgMiwgMTAsIHRydWUpLCAtMik7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4o
bGFiZWxPbmUsIC0xLCAyLCAxMCwgdHJ1ZSksIDMpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+
KGxhYmVsVHdvLCAtMSwgMiwgMTAsIHRydWUpLCAtMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGlu
dD4obGFiZWxUaHJlZSwgLTEsIDIsIDEwLCB0cnVlKSwgMik7CisgICAgQ0hFQ0tfRVEoaW52b2tl
PGludD4obGFiZWxPbmUsIDEsIDIsIDIsIGZhbHNlKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tl
PGludD4obGFiZWxUd28sIDEsIDIsIDIsIGZhbHNlKSwgLTEpOworICAgIENIRUNLX0VRKGludm9r
ZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIsIDIsIGZhbHNlKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52
b2tlPGludD4obGFiZWxPbmUsIC0xLCAyLCAyLCBmYWxzZSksIDEpOworICAgIENIRUNLX0VRKGlu
dm9rZTxpbnQ+KGxhYmVsVHdvLCAtMSwgMiwgMiwgZmFsc2UpLCAtMSk7CisgICAgQ0hFQ0tfRVEo
aW52b2tlPGludD4obGFiZWxUaHJlZSwgLTEsIDIsIDIsIGZhbHNlKSwgMCk7CisgICAgQ0hFQ0tf
RVEoaW52b2tlPGludD4obGFiZWxPbmUsIDEsIDIsIDAsIGZhbHNlKSwgMCk7CisgICAgQ0hFQ0tf
RVEoaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIsIDAsIGZhbHNlKSwgMCk7CisgICAgQ0hFQ0tf
RVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwgMiwgMCwgZmFsc2UpLCAwKTsKKyAgICBDSEVD
S19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEsIDIsIDAsIGZhbHNlKSwgMCk7CisgICAgQ0hF
Q0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIC0xLCAyLCAwLCBmYWxzZSksIDApOworICAgIENI
RUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIC0xLCAyLCAwLCBmYWxzZSksIDApOworfQor
Cit2b2lkIHRlc3RFbnRyeVN3aXRjaExvb3AoKQoreworICAgIC8vIFRoaXMgaXMgYSBjb21wbGV0
ZWx5IGFic3VyZCB1c2Ugb2YgRW50cnlTd2l0Y2gsIHdoZXJlIGl0IGltcGFjdHMgdGhlIGxvb3Ag
Y29uZGl0aW9uLiBUaGlzCisgICAgLy8gc2hvdWxkIGNhdXNlIGR1cGxpY2F0aW9uIG9mIGVpdGhl
ciBuZWFybHkgdGhlIGVudGlyZSBQcm9jZWR1cmUuIEF0IHRpbWUgb2Ygd3JpdGluZywgd2UgZW5k
ZWQKKyAgICAvLyB1cCBkdXBsaWNhdGluZyBhbGwgb2YgaXQsIHdoaWNoIGlzIGZpbmUuIEl0J3Mg
aW1wb3J0YW50IHRvIHRlc3QgdGhpcyBjYXNlLCB0byBtYWtlIHN1cmUgdGhhdAorICAgIC8vIHRo
ZSBkdXBsaWNhdGlvbiBhbGdvcml0aG0gY2FuIGhhbmRsZSBpbnRlcmVzdGluZyBjb250cm9sIGZs
b3cuCisgICAgCisgICAgUHJvY2VkdXJlIHByb2M7CisgICAgcHJvYy5zZXROdW1FbnRyeXBvaW50
cygyKTsKKyAgICAKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworICAg
IEJhc2ljQmxvY2sqIGxvb3BIZWFkZXIgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9j
ayogbG9vcEZvb3RlciA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiBlbmQgPSBw
cm9jLmFkZEJsb2NrKCk7CisKKyAgICBVcHNpbG9uVmFsdWUqIGluaXRpYWxWYWx1ZSA9IHJvb3Qt
PmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4oKSwgcm9vdC0+
YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAg
ICAgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4o
KSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSkpOworICAgIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4o
cHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIHJvb3QtPnNldFN1Y2Nlc3NvcnMobG9vcEhlYWRl
cik7CisgICAgCisgICAgVmFsdWUqIHZhbHVlSW5Mb29wID0gbG9vcEhlYWRlci0+YXBwZW5kTmV3
PFZhbHVlPihwcm9jLCBQaGksIEludDMyLCBPcmlnaW4oKSk7CisgICAgaW5pdGlhbFZhbHVlLT5z
ZXRQaGkodmFsdWVJbkxvb3ApOworICAgIFZhbHVlKiBuZXdWYWx1ZSA9IGxvb3BIZWFkZXItPmFw
cGVuZE5ldzxWYWx1ZT4oCisgICAgICAgIHByb2MsIEFkZCwgT3JpZ2luKCksIHZhbHVlSW5Mb29w
LAorICAgICAgICBsb29wSGVhZGVyLT5hcHBlbmROZXc8Q29uc3QzMlZhbHVlPihwcm9jLCBPcmln
aW4oKSwgMSkpOworICAgIGxvb3BIZWFkZXItPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRW50cnlT
d2l0Y2gsIE9yaWdpbigpKTsKKyAgICBsb29wSGVhZGVyLT5hcHBlbmRTdWNjZXNzb3IoZW5kKTsK
KyAgICBsb29wSGVhZGVyLT5hcHBlbmRTdWNjZXNzb3IobG9vcEZvb3Rlcik7CisgICAgCisgICAg
bG9vcEZvb3Rlci0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4ocHJvYywgT3JpZ2luKCksIG5ld1Zh
bHVlLCB2YWx1ZUluTG9vcCk7CisgICAgbG9vcEZvb3Rlci0+YXBwZW5kTmV3PFZhbHVlPigKKyAg
ICAgICAgcHJvYywgQnJhbmNoLCBPcmlnaW4oKSwKKyAgICAgICAgbG9vcEZvb3Rlci0+YXBwZW5k
TmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIExlc3NUaGFuLCBPcmlnaW4oKSwgbmV3VmFs
dWUsCisgICAgICAgICAgICBsb29wRm9vdGVyLT5hcHBlbmROZXc8Q29uc3QzMlZhbHVlPihwcm9j
LCBPcmlnaW4oKSwgMTAwKSkpOworICAgIGxvb3BGb290ZXItPnNldFN1Y2Nlc3NvcnMobG9vcEhl
YWRlciwgZW5kKTsKKyAgICAKKyAgICBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUmV0dXJu
LCBPcmlnaW4oKSwgbmV3VmFsdWUpOworICAgIAorICAgIHByZXBhcmVGb3JHZW5lcmF0aW9uKHBy
b2MpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQodm0pOworICAgIGdlbmVyYXRlKHByb2Ms
IGppdCk7CisgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2bSwgaml0LCBudWxscHRyKTsKKyAg
ICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbE9uZSA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihwcm9j
LmVudHJ5cG9pbnRMYWJlbCgwKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxUd28gPSBs
aW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMSkpOworICAgIAorICAg
IE1hY3JvQXNzZW1ibGVyQ29kZVJlZiBjb2RlUmVmID0gRklOQUxJWkVfQ09ERShsaW5rQnVmZmVy
LCAoInRlc3RiMyBjb21waWxhdGlvbiIpKTsKKworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVs
T25lLCAwKSA9PSAxKTsKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJlbE9uZSwgNDIpID09IDQz
KTsKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJlbE9uZSwgMTAwMCkgPT0gMTAwMSk7CisgICAg
CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxUd28sIDApID09IDEwMCk7CisgICAgQ0hFQ0so
aW52b2tlPGludD4obGFiZWxUd28sIDQyKSA9PSAxMDApOworICAgIENIRUNLKGludm9rZTxpbnQ+
KGxhYmVsVHdvLCAxMDAwKSA9PSAxMDAxKTsKK30KKwogdm9pZCB0ZXN0U29tZUVhcmx5UmVnaXN0
ZXIoKQogewogICAgIGF1dG8gcnVuID0gWyZdIChib29sIHN1Y2NlZWQpIHsKQEAgLTEyNDMxLDgg
KzEyNzg1LDYgQEAgZG91YmxlIG5lZ2F0aXZlWmVybygpCiAgICAgcmV0dXJuIC16ZXJvKCk7CiB9
CiAKLQotCiAjZGVmaW5lIFJVTih0ZXN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBc
CiAgICAgICAgIGlmICghc2hvdWxkUnVuKCN0ZXN0KSkgICAgICAgICAgICAgICAgICBcCiAgICAg
ICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMzgyNiw2
ICsxNDE3OCwxMiBAQCB2b2lkIHJ1bihjb25zdCBjaGFyKiBmaWx0ZXIpCiAgICAgUlVOKHRlc3RJ
bnRlcnByZXRlcigpKTsKICAgICBSVU4odGVzdFJlZHVjZVN0cmVuZ3RoQ2hlY2tCb3R0b21Vc2VJ
bkFub3RoZXJCbG9jaygpKTsKICAgICBSVU4odGVzdFJlc2V0UmVhY2hhYmlsaXR5RGFuZ2xpbmdS
ZWZlcmVuY2UoKSk7CisgICAgCisgICAgUlVOKHRlc3RFbnRyeVN3aXRjaFNpbXBsZSgpKTsKKyAg
ICBSVU4odGVzdEVudHJ5U3dpdGNoV2l0aENvbW1vblBhdGhzKCkpOworICAgIFJVTih0ZXN0RW50
cnlTd2l0Y2hXaXRoQ29tbW9uUGF0aHNBbmROb25Ucml2aWFsRW50cnlwb2ludCgpKTsKKyAgICBS
VU4odGVzdEVudHJ5U3dpdGNoTG9vcCgpKTsKKwogICAgIFJVTih0ZXN0U29tZUVhcmx5UmVnaXN0
ZXIoKSk7CiAKICAgICBpZiAodGFza3MuaXNFbXB0eSgpKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICsz
Miw3IEBACiAjaW5jbHVkZSAiQjNCYXNpY0Jsb2NrVXRpbHMuaCIKICNpbmNsdWRlICJCM1Byb2Nl
ZHVyZS5oIgogI2luY2x1ZGUgIkIzU3RhY2tTbG90LmgiCisjaW5jbHVkZSA8d3RmL0xpc3REdW1w
Lmg+CiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKIApA
QCAtNzksMTggKzgwLDM4IEBAIENDYWxsU3BlY2lhbCogQ29kZTo6Y0NhbGxTcGVjaWFsKCkKICAg
ICByZXR1cm4gbV9jQ2FsbFNwZWNpYWw7CiB9CiAKK2Jvb2wgQ29kZTo6aXNFbnRyeXBvaW50KEJh
c2ljQmxvY2sqIGJsb2NrKSBjb25zdAoreworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuICFibG9jay0+aW5kZXgoKTsKKyAgICAKKyAgICBmb3IgKGNvbnN0
IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2ludCA6IG1fZW50cnlwb2ludHMpIHsKKyAgICAgICAg
aWYgKGVudHJ5cG9pbnQuYmxvY2soKSA9PSBibG9jaykKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgQ29kZTo6cmVzZXRSZWFjaGFi
aWxpdHkoKQogewotICAgIHJlY29tcHV0ZVByZWRlY2Vzc29ycyhtX2Jsb2Nrcyk7CisgICAgY2xl
YXJQcmVkZWNlc3NvcnMobV9ibG9ja3MpOworICAgIGlmIChtX2VudHJ5cG9pbnRzLmlzRW1wdHko
KSkKKyAgICAgICAgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIobV9ibG9ja3NbMF0uZ2V0KCkpOwor
ICAgIGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IEZyZXF1ZW50ZWRCbG9jayYgZW50cnlwb2lu
dCA6IG1fZW50cnlwb2ludHMpCisgICAgICAgICAgICB1cGRhdGVQcmVkZWNlc3NvcnNBZnRlcihl
bnRyeXBvaW50LmJsb2NrKCkpOworICAgIH0KICAgICAKICAgICBmb3IgKGF1dG8mIGJsb2NrIDog
bV9ibG9ja3MpIHsKLSAgICAgICAgaWYgKGlzQmxvY2tEZWFkKGJsb2NrLmdldCgpKSkKKyAgICAg
ICAgaWYgKGlzQmxvY2tEZWFkKGJsb2NrLmdldCgpKSAmJiAhaXNFbnRyeXBvaW50KGJsb2NrLmdl
dCgpKSkKICAgICAgICAgICAgIGJsb2NrID0gbnVsbHB0cjsKICAgICB9CiB9CiAKIHZvaWQgQ29k
ZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAogeworICAgIGlmICghbV9lbnRyeXBvaW50
cy5pc0VtcHR5KCkpCisgICAgICAgIG91dC5wcmludCgiRW50cnlwb2ludHM6ICIsIGxpc3REdW1w
KG1fZW50cnlwb2ludHMpLCAiXG4iKTsKICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogKnRo
aXMpCiAgICAgICAgIG91dC5wcmludChkZWVwRHVtcChibG9jaykpOwogICAgIGlmIChzdGFja1Ns
b3RzKCkuc2l6ZSgpKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNv
ZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUu
aAkocmV2aXNpb24gMjAzNTMwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
b2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJBaXJUbXAu
aCIKICNpbmNsdWRlICJCM0luZGV4TWFwLmgiCiAjaW5jbHVkZSAiQjNTcGFyc2VDb2xsZWN0aW9u
LmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCiAjaW5jbHVkZSAiUmVnaXN0ZXJBdE9mZnNl
dExpc3QuaCIKICNpbmNsdWRlICJTdGFja0FsaWdubWVudC5oIgogCkBAIC0xMTksNiArMTIwLDMy
IEBAIHB1YmxpYzoKICAgICAgICAgbV9mcmFtZVNpemUgPSBmcmFtZVNpemU7CiAgICAgfQogCisg
ICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHByb2MoKS5udW1F
bnRyeXBvaW50cygpLiBUaGlzIHZhbHVlIGhlcmUgbWF5IGJlIHplcm8KKyAgICAvLyB1bnRpbCB3
ZSBsb3dlciBFbnRyeVN3aXRjaC4KKyAgICB1bnNpZ25lZCBudW1FbnRyeXBvaW50cygpIGNvbnN0
IHsgcmV0dXJuIG1fZW50cnlwb2ludHMuc2l6ZSgpOyB9CisgICAgY29uc3QgVmVjdG9yPEZyZXF1
ZW50ZWRCbG9jaz4gZW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5cG9pbnRzOyB9
CisgICAgY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBlbnRyeXBvaW50KHVuc2lnbmVkIGluZGV4KSBj
b25zdCB7IHJldHVybiBtX2VudHJ5cG9pbnRzW2luZGV4XTsgfQorICAgIGJvb2wgaXNFbnRyeXBv
aW50KEJhc2ljQmxvY2sqKSBjb25zdDsKKyAgICAKKyAgICAvLyBUaGlzIGlzIGZvciB1c2UgYnkg
bG93ZXJFbnRyeVN3aXRjaCgpLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KKyAgICB2
b2lkIHNldEVudHJ5cG9pbnRzKFZlY3RvciYmIHZlY3RvcikKKyAgICB7CisgICAgICAgIG1fZW50
cnlwb2ludHMgPSBzdGQ6OmZvcndhcmQ8VmVjdG9yPih2ZWN0b3IpOworICAgIH0KKyAgICAKKyAg
ICBDQ2FsbEhlbHBlcnM6OkxhYmVsIGVudHJ5cG9pbnRMYWJlbCh1bnNpZ25lZCBpbmRleCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2VudHJ5cG9pbnRMYWJlbHNbaW5kZXhdOworICAg
IH0KKyAgICAKKyAgICAvLyBUaGlzIGlzIGZvciB1c2UgYnkgZ2VuZXJhdGUoKS4KKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBWZWN0b3I+CisgICAgdm9pZCBzZXRFbnRyeXBvaW50TGFiZWxzKFZlY3Rv
ciYmIHZlY3RvcikKKyAgICB7CisgICAgICAgIG1fZW50cnlwb2ludExhYmVscyA9IHN0ZDo6Zm9y
d2FyZDxWZWN0b3I+KHZlY3Rvcik7CisgICAgfQorCiAgICAgY29uc3QgUmVnaXN0ZXJBdE9mZnNl
dExpc3QmIGNhbGxlZVNhdmVSZWdpc3RlcnMoKSBjb25zdCB7IHJldHVybiBtX2NhbGxlZVNhdmVS
ZWdpc3RlcnM7IH0KICAgICBSZWdpc3RlckF0T2Zmc2V0TGlzdCYgY2FsbGVlU2F2ZVJlZ2lzdGVy
cygpIHsgcmV0dXJuIG1fY2FsbGVlU2F2ZVJlZ2lzdGVyczsgfQogCkBAIC0yMzUsNiArMjYyLDgg
QEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2ZyYW1lU2l6ZSB7IDAgfTsKICAgICB1bnNpZ25l
ZCBtX2NhbGxBcmdBcmVhU2l6ZSB7IDAgfTsKICAgICBSZWdpc3RlckF0T2Zmc2V0TGlzdCBtX2Nh
bGxlZVNhdmVSZWdpc3RlcnM7CisgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gbV9lbnRyeXBv
aW50czsgLy8gVGhpcyBpcyBlbXB0eSB1bnRpbCBhZnRlciBsb3dlckVudHJ5U3dpdGNoKCkuCisg
ICAgVmVjdG9yPENDYWxsSGVscGVyczo6TGFiZWw+IG1fZW50cnlwb2ludExhYmVsczsgLy8gVGhp
cyBpcyBlbXB0eSB1bnRpbCBjb2RlIGdlbmVyYXRpb24uCiAgICAgY29uc3QgY2hhciogbV9sYXN0
UGhhc2VOYW1lOwogfTsKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
dXN0b20uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckN1
c3RvbS5oCShyZXZpc2lvbiAyMDM1MzApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpckN1c3RvbS5oCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCwxMSBAQCBzdHJ1Y3QgUGF0
Y2hDdXN0b20gewogICAgICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+aXNUZXJt
aW5hbChpbnN0KTsKICAgICB9CiAKKyAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdFZmZlY3RzKElu
c3QmIGluc3QpCisgICAgeworICAgICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+
aGFzTm9uQXJnRWZmZWN0cyhpbnN0KTsKKyAgICB9CisKICAgICBzdGF0aWMgYm9vbCBoYXNOb25B
cmdOb25Db250cm9sRWZmZWN0cyhJbnN0JiBpbnN0KQogICAgIHsKICAgICAgICAgcmV0dXJuIGlu
c3QuYXJnc1swXS5zcGVjaWFsKCktPmhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKGluc3QpOwpA
QCAtMTAyLDEwICsxMDcsMTggQEAgc3RydWN0IFBhdGNoQ3VzdG9tIHsKICAgICB9CiB9OwogCit0
ZW1wbGF0ZTx0eXBlbmFtZSBTdWJ0eXBlPgorc3RydWN0IENvbW1vbkN1c3RvbUJhc2UgeworICAg
IHN0YXRpYyBib29sIGhhc05vbkFyZ0VmZmVjdHMoSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAg
IHJldHVybiBTdWJ0eXBlOjppc1Rlcm1pbmFsKGluc3QpIHx8IFN1YnR5cGU6Omhhc05vbkFyZ05v
bkNvbnRyb2xFZmZlY3RzKGluc3QpOworICAgIH0KK307CisKIC8vIERlZmluaXRpb24gb2YgQ0Nh
bGwgaW5zdHJ1Y3Rpb24uIENDYWxsIGlzIHVzZWQgZm9yIGhvdCBwYXRoIEMgZnVuY3Rpb24gY2Fs
bHMuIEl0J3MgbG93ZXJlZCB0byBhCiAvLyBQYXRjaCB3aXRoIGFuIEFpciBDQ2FsbFNwZWNpYWwg
YWxvbmcgd2l0aCBjb2RlIHRvIG1hcnNoYWwgaW5zdHJ1Y3Rpb25zLiBUaGUgbG93ZXJpbmcgaGFw
cGVucwogLy8gYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24sIHNvIHRoYXQgdGhlIHJlZ2lzdGVy
IGFsbG9jYXRvciBzZWVzIHRoZSBjbG9iYmVycy4KLXN0cnVjdCBDQ2FsbEN1c3RvbSB7CitzdHJ1
Y3QgQ0NhbGxDdXN0b20gOiBwdWJsaWMgQ29tbW9uQ3VzdG9tQmFzZTxDQ2FsbEN1c3RvbT4gewog
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CiAgICAgc3RhdGljIHZvaWQgZm9yRWFjaEFy
ZyhJbnN0JiBpbnN0LCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKQogICAgIHsKQEAgLTE3MSw3ICsx
ODQsNyBAQCBzdHJ1Y3QgQ29sZENDYWxsQ3VzdG9tIDogQ0NhbGxDdXN0b20gewogICAgIH0KIH07
CiAKLXN0cnVjdCBTaHVmZmxlQ3VzdG9tIHsKK3N0cnVjdCBTaHVmZmxlQ3VzdG9tIDogcHVibGlj
IENvbW1vbkN1c3RvbUJhc2U8U2h1ZmZsZUN1c3RvbT4gewogICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CiAgICAgc3RhdGljIHZvaWQgZm9yRWFjaEFyZyhJbnN0JiBpbnN0LCBjb25zdCBG
dW5jdG9yJiBmdW5jdG9yKQogICAgIHsKQEAgLTIyMCw2ICsyMzMsNDcgQEAgc3RydWN0IFNodWZm
bGVDdXN0b20gewogICAgIHN0YXRpYyBDQ2FsbEhlbHBlcnM6Okp1bXAgZ2VuZXJhdGUoSW5zdCYs
IENDYWxsSGVscGVycyYsIEdlbmVyYXRpb25Db250ZXh0Jik7CiB9OwogCitzdHJ1Y3QgRW50cnlT
d2l0Y2hDdXN0b20gOiBwdWJsaWMgQ29tbW9uQ3VzdG9tQmFzZTxFbnRyeVN3aXRjaEN1c3RvbT4g
eworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgc3RhdGljIHZvaWQgZm9yRWFjaEFy
ZyhJbnN0JiwgY29uc3QgRnVuYyYpCisgICAgeworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZS4uLiBBcmd1bWVudHM+CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEZvcm1TdGF0aWMo
QXJndW1lbnRzLi4uKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFzaXplb2YuLi4oQXJndW1lbnRz
KTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEZvcm0oSW5zdCYgaW5zdCkK
KyAgICB7CisgICAgICAgIHJldHVybiBpbnN0LmFyZ3MuaXNFbXB0eSgpOworICAgIH0KKyAgICAK
KyAgICBzdGF0aWMgYm9vbCBhZG1pdHNTdGFjayhJbnN0JiwgdW5zaWduZWQpCisgICAgeworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBib29sIGlzVGVybWlu
YWwoSW5zdCYpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
c3RhdGljIGJvb2wgaGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoSW5zdCYpCisgICAgeworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIENDYWxsSGVscGVyczo6SnVt
cCBnZW5lcmF0ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKQorICAg
IHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCBiZWNhdXNlIHdlIHNo
b3VsZCBoYXZlIGxvd2VyZWQgRW50cnlTd2l0Y2ggYmVmb3JlCisgICAgICAgIC8vIGdlbmVyYXRp
b24uCisgICAgICAgIFVOUkVBQ0hBQkxFX0ZPUl9QTEFURk9STSgpOworICAgICAgICByZXR1cm4g
Q0NhbGxIZWxwZXJzOjpKdW1wKCk7CisgICAgfQorfTsKKwogfSB9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6QjM6OkFpcgogCiAjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3BwCShyZXZpc2lvbiAyMDM1MzApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVyYXRlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgIkFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmgiCiAjaW5jbHVkZSAiQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oIgogI2luY2x1ZGUg
IkFpckxvd2VyQWZ0ZXJSZWdBbGxvYy5oIgorI2luY2x1ZGUgIkFpckxvd2VyRW50cnlTd2l0Y2gu
aCIKICNpbmNsdWRlICJBaXJMb3dlck1hY3Jvcy5oIgogI2luY2x1ZGUgIkFpck9wY29kZVV0aWxz
LmgiCiAjaW5jbHVkZSAiQWlyT3B0aW1pemVCbG9ja09yZGVyLmgiCkBAIC0xMjcsMTAgKzEyOCw2
IEBAIHZvaWQgcHJlcGFyZUZvckdlbmVyYXRpb24oQ29kZSYgY29kZSkKICAgICAvLyBwaGFzZS4K
ICAgICBzaW1wbGlmeUNGRyhjb2RlKTsKIAotICAgIC8vIFRoaXMgc29ydHMgdGhlIGJhc2ljIGJs
b2NrcyBpbiBDb2RlIHRvIGFjaGlldmUgYW4gb3JkZXJpbmcgdGhhdCBtYXhpbWl6ZXMgdGhlIGxp
a2VsaWhvb2QgdGhhdCBhIGhpZ2gKLSAgICAvLyBmcmVxdWVuY3kgc3VjY2Vzc29yIGlzIGFsc28g
dGhlIGZhbGwtdGhyb3VnaCB0YXJnZXQuCi0gICAgb3B0aW1pemVCbG9ja09yZGVyKGNvZGUpOwot
CiAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gc2F0aXNmeSBhIHJlcXVpcmVtZW50IG9mIEIzOjpT
dGFja21hcFZhbHVlLgogICAgIHJlcG9ydFVzZWRSZWdpc3RlcnMoY29kZSk7CiAKQEAgLTEzOSw2
ICsxMzYsMTYgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBjb2RlKQogICAgIC8v
IHVzZS4gV2UgX211c3RfIHJ1biB0aGlzIGFmdGVyIHJlcG9ydFVzZWRSZWdpc3RlcnMoKSwgc2lu
Y2UgdGhhdCBraWxscyB2YXJpYWJsZSBhc3NpZ25tZW50cwogICAgIC8vIHRoYXQgc2VlbSBkZWFk
LiBMdWNraWx5LCB0aGlzIHBoYXNlIGRvZXMgbm90IGNoYW5nZSByZWdpc3RlciBsaXZlbmVzcywg
c28gdGhhdCdzIE9LLgogICAgIGZpeFBhcnRpYWxSZWdpc3RlclN0YWxscyhjb2RlKTsKKyAgICAK
KyAgICAvLyBBY3R1YWxseSBjcmVhdGUgZW50cnlwb2ludHMuCisgICAgbG93ZXJFbnRyeVN3aXRj
aChjb2RlKTsKKyAgICAKKyAgICAvLyBUaGUgY29udHJvbCBmbG93IGdyYXBoIGNhbiBiZSBzaW1w
bGlmaWVkIGZ1cnRoZXIgYWZ0ZXIgd2UgaGF2ZSBsb3dlcmVkIEVudHJ5U3dpdGNoLgorICAgIHNp
bXBsaWZ5Q0ZHKGNvZGUpOworCisgICAgLy8gVGhpcyBzb3J0cyB0aGUgYmFzaWMgYmxvY2tzIGlu
IENvZGUgdG8gYWNoaWV2ZSBhbiBvcmRlcmluZyB0aGF0IG1heGltaXplcyB0aGUgbGlrZWxpaG9v
ZCB0aGF0IGEgaGlnaAorICAgIC8vIGZyZXF1ZW5jeSBzdWNjZXNzb3IgaXMgYWxzbyB0aGUgZmFs
bC10aHJvdWdoIHRhcmdldC4KKyAgICBvcHRpbWl6ZUJsb2NrT3JkZXIoY29kZSk7CiAKICAgICBp
ZiAoc2hvdWxkVmFsaWRhdGVJUigpKQogICAgICAgICB2YWxpZGF0ZShjb2RlKTsKQEAgLTE1Nywy
MiArMTY0LDExIEBAIHZvaWQgZ2VuZXJhdGUoQ29kZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKIAog
ICAgIERpc2FsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2FnZSBkaXNhbGxvd1NjcmF0Y2goaml0
KTsKIAotICAgIC8vIEFuZCBub3csIHdlIGdlbmVyYXRlIGNvZGUuCi0gICAgaml0LmVtaXRGdW5j
dGlvblByb2xvZ3VlKCk7Ci0gICAgaWYgKGNvZGUuZnJhbWVTaXplKCkpCi0gICAgICAgIGppdC5h
ZGRQdHIoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tMzIoLWNvZGUuZnJhbWVTaXplKCkpLCBNYWNy
b0Fzc2VtYmxlcjo6c3RhY2tQb2ludGVyUmVnaXN0ZXIpOwotCiAgICAgYXV0byBhcmdGb3IgPSBb
Jl0gKGNvbnN0IFJlZ2lzdGVyQXRPZmZzZXQmIGVudHJ5KSAtPiBDQ2FsbEhlbHBlcnM6OkFkZHJl
c3MgewogICAgICAgICByZXR1cm4gQ0NhbGxIZWxwZXJzOjpBZGRyZXNzKEdQUkluZm86OmNhbGxG
cmFtZVJlZ2lzdGVyLCBlbnRyeS5vZmZzZXQoKSk7CiAgICAgfTsKICAgICAKLSAgICBmb3IgKGNv
bnN0IFJlZ2lzdGVyQXRPZmZzZXQmIGVudHJ5IDogY29kZS5jYWxsZWVTYXZlUmVnaXN0ZXJzKCkp
IHsKLSAgICAgICAgaWYgKGVudHJ5LnJlZygpLmlzR1BSKCkpCi0gICAgICAgICAgICBqaXQuc3Rv
cmVQdHIoZW50cnkucmVnKCkuZ3ByKCksIGFyZ0ZvcihlbnRyeSkpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICBqaXQuc3RvcmVEb3VibGUoZW50cnkucmVnKCkuZnByKCksIGFyZ0ZvcihlbnRy
eSkpOwotICAgIH0KLQorICAgIC8vIEFuZCBub3csIHdlIGdlbmVyYXRlIGNvZGUuCiAgICAgR2Vu
ZXJhdGlvbkNvbnRleHQgY29udGV4dDsKICAgICBjb250ZXh0LmNvZGUgPSAmY29kZTsKICAgICBj
b250ZXh0LmJsb2NrTGFiZWxzLnJlc2l6ZShjb2RlLnNpemUoKSk7CkBAIC0yMDYsNiArMjAyLDIw
IEBAIHZvaWQgZ2VuZXJhdGUoQ29kZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKICAgICAgICAgYmxv
Y2tKdW1wc1tibG9ja10ubGluaygmaml0KTsKICAgICAgICAgQ0NhbGxIZWxwZXJzOjpMYWJlbCBs
YWJlbCA9IGppdC5sYWJlbCgpOwogICAgICAgICAqY29udGV4dC5ibG9ja0xhYmVsc1tibG9ja10g
PSBsYWJlbDsKKworICAgICAgICBpZiAoY29kZS5pc0VudHJ5cG9pbnQoYmxvY2spKSB7CisgICAg
ICAgICAgICBqaXQuZW1pdEZ1bmN0aW9uUHJvbG9ndWUoKTsKKyAgICAgICAgICAgIGlmIChjb2Rl
LmZyYW1lU2l6ZSgpKQorICAgICAgICAgICAgICAgIGppdC5hZGRQdHIoQ0NhbGxIZWxwZXJzOjpU
cnVzdGVkSW1tMzIoLWNvZGUuZnJhbWVTaXplKCkpLCBNYWNyb0Fzc2VtYmxlcjo6c3RhY2tQb2lu
dGVyUmVnaXN0ZXIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGNvbnN0IFJlZ2lz
dGVyQXRPZmZzZXQmIGVudHJ5IDogY29kZS5jYWxsZWVTYXZlUmVnaXN0ZXJzKCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoZW50cnkucmVnKCkuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICAgICAg
aml0LnN0b3JlUHRyKGVudHJ5LnJlZygpLmdwcigpLCBhcmdGb3IoZW50cnkpKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGppdC5zdG9yZURvdWJsZShlbnRyeS5y
ZWcoKS5mcHIoKSwgYXJnRm9yKGVudHJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgCiAgICAgICAgIEFTU0VSVChibG9jay0+c2l6ZSgpID49IDEpOwogICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgYmxvY2stPnNpemUoKSAtIDE7ICsraSkgewogICAgICAgICAg
ICAgY29udGV4dC5pbmRleEluQmxvY2sgPSBpOwpAQCAtMjY0LDYgKzI3NCwxMSBAQCB2b2lkIGdl
bmVyYXRlKENvZGUmIGNvZGUsIENDYWxsSGVscGVycyYgCiAgICAgCiAgICAgY29udGV4dC5jdXJy
ZW50QmxvY2sgPSBudWxscHRyOwogICAgIGNvbnRleHQuaW5kZXhJbkJsb2NrID0gVUlOVF9NQVg7
CisgICAgCisgICAgVmVjdG9yPENDYWxsSGVscGVyczo6TGFiZWw+IGVudHJ5cG9pbnRMYWJlbHMo
Y29kZS5udW1FbnRyeXBvaW50cygpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBjb2RlLm51bUVu
dHJ5cG9pbnRzKCk7IGktLTspCisgICAgICAgIGVudHJ5cG9pbnRMYWJlbHNbaV0gPSAqY29udGV4
dC5ibG9ja0xhYmVsc1tjb2RlLmVudHJ5cG9pbnQoaSkuYmxvY2soKV07CisgICAgY29kZS5zZXRF
bnRyeXBvaW50TGFiZWxzKFdURk1vdmUoZW50cnlwb2ludExhYmVscykpOwogCiAgICAgcGNUb09y
aWdpbk1hcC5hcHBlbmRJdGVtKGppdC5sYWJlbCgpLCBPcmlnaW4oKSk7CiAgICAgLy8gRklYTUU6
IE1ha2UgbGF0ZSBwYXRocyBoYXZlIE9yaWdpbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNTM2ODkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcAkobm9uZXhpc3RlbnQpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBaXJMb3dlckVu
dHJ5U3dpdGNoLmgiCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCisjaW5jbHVkZSAiQWlyQmxvY2tX
b3JrbGlzdC5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKyNpbmNsdWRlICJBaXJJbnN0SW5saW5l
cy5oIgorI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5o
IgorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK3Zv
aWQgbG93ZXJFbnRyeVN3aXRjaChDb2RlJiBjb2RlKQoreworICAgIFBoYXNlU2NvcGUgcGhhc2VT
Y29wZShjb2RlLCAibG93ZXJFbnRyeVN3aXRjaCIpOworICAgIAorICAgIC8vIEZpZ3VyZSBvdXQg
dGhlIHNldCBvZiBibG9ja3MgdGhhdCBzaG91bGQgYmUgZHVwbGljYXRlZC4KKyAgICBCbG9ja1dv
cmtsaXN0IHdvcmtsaXN0OworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7Cisg
ICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSA9PSBFbnRyeVN3aXRjaCkKKyAgICAgICAg
ICAgIHdvcmtsaXN0LnB1c2goYmxvY2spOworICAgIH0KKyAgICAKKyAgICAvLyBJdCdzIHBvc3Np
YmxlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbnkgRW50cnlTd2l0Y2hlcy4gVGhhdCdzIGZpbmUuCisg
ICAgaWYgKHdvcmtsaXN0LnNlZW4oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPEZyZXF1
ZW50ZWRCbG9jaz4gZW50cnlwb2ludHMoY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKSwgRnJl
cXVlbnRlZEJsb2NrKGNvZGVbMF0pKTsKKyAgICAgICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZN
b3ZlKGVudHJ5cG9pbnRzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgd2hp
bGUgKEJhc2ljQmxvY2sqIGJsb2NrID0gd29ya2xpc3QucG9wKCkpCisgICAgICAgIHdvcmtsaXN0
LnB1c2hBbGwoYmxvY2stPnByZWRlY2Vzc29ycygpKTsKKyAgICAKKyAgICBSRUxFQVNFX0FTU0VS
VCh3b3JrbGlzdC5zYXcoY29kZVswXSkpOworICAgIAorICAgIFZlY3RvcjxGcmVxdWVuY3lDbGFz
cz4gZW50cnlwb2ludEZyZXF1ZW5jaWVzKGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCksIEZy
ZXF1ZW5jeUNsYXNzOjpSYXJlKTsKKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkg
eworICAgICAgICBpZiAoYmxvY2stPmxhc3QoKS5vcGNvZGUgIT0gRW50cnlTd2l0Y2gpCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBlbnRyeXBvaW50SW5kZXgg
PSBjb2RlLnByb2MoKS5udW1FbnRyeXBvaW50cygpOyBlbnRyeXBvaW50SW5kZXgtLTspIHsKKyAg
ICAgICAgICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdID0gbWF4RnJl
cXVlbmN5KAorICAgICAgICAgICAgICAgIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50
SW5kZXhdLAorICAgICAgICAgICAgICAgIGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2ludEluZGV4
KS5mcmVxdWVuY3koKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXV0byBmaXhFbnRy
eVN3aXRjaCA9IFsmXSAoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIGVudHJ5cG9pbnRJbmRl
eCkgeworICAgICAgICBpZiAoYmxvY2stPmxhc3QoKS5vcGNvZGUgIT0gRW50cnlTd2l0Y2gpCisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayB0YXJnZXQgPSBibG9j
ay0+c3VjY2Vzc29yKGVudHJ5cG9pbnRJbmRleCk7CisgICAgICAgIGJsb2NrLT5sYXN0KCkub3Bj
b2RlID0gSnVtcDsKKyAgICAgICAgYmxvY2stPnN1Y2Nlc3NvcnMoKS5yZXNpemUoMSk7CisgICAg
ICAgIGJsb2NrLT5zdWNjZXNzb3IoMCkgPSB0YXJnZXQ7CisgICAgfTsKKyAgICAKKyAgICAvLyBO
b3cgZHVwbGljYXRlIHRoZW0uCisgICAgVmVjdG9yPEZyZXF1ZW50ZWRCbG9jaz4gZW50cnlwb2lu
dHM7CisgICAgZW50cnlwb2ludHMuYXBwZW5kKEZyZXF1ZW50ZWRCbG9jayhjb2RlWzBdLCBlbnRy
eXBvaW50RnJlcXVlbmNpZXNbMF0pKTsKKyAgICBJbmRleE1hcDxCYXNpY0Jsb2NrLCBCYXNpY0Js
b2NrKj4gbWFwKGNvZGUuc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGVudHJ5cG9pbnRJbmRl
eCA9IDE7IGVudHJ5cG9pbnRJbmRleCA8IGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCk7ICsr
ZW50cnlwb2ludEluZGV4KSB7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogd29ya2xpc3Quc2VlbigpLnZhbHVlcyhjb2RlKSkKKyAgICAgICAg
ICAgIG1hcFtibG9ja10gPSBjb2RlLmFkZEJsb2NrKGJsb2NrLT5mcmVxdWVuY3koKSk7CisgICAg
ICAgIGVudHJ5cG9pbnRzLmFwcGVuZChGcmVxdWVudGVkQmxvY2sobWFwW2NvZGVbMF1dLCBlbnRy
eXBvaW50RnJlcXVlbmNpZXNbZW50cnlwb2ludEluZGV4XSkpOworICAgICAgICBmb3IgKEJhc2lj
QmxvY2sqIGJsb2NrIDogd29ya2xpc3Quc2VlbigpLnZhbHVlcyhjb2RlKSkgeworICAgICAgICAg
ICAgQmFzaWNCbG9jayogbmV3QmxvY2sgPSBtYXBbYmxvY2tdOworICAgICAgICAgICAgZm9yIChj
b25zdCBJbnN0JiBpbnN0IDogKmJsb2NrKQorICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5hcHBl
bmRJbnN0KGluc3QpOworICAgICAgICAgICAgbmV3QmxvY2stPnN1Y2Nlc3NvcnMoKSA9IGJsb2Nr
LT5zdWNjZXNzb3JzKCk7CisgICAgICAgICAgICBmb3IgKEJhc2ljQmxvY2sqJiBzdWNjZXNzb3Ig
OiBuZXdCbG9jay0+c3VjY2Vzc29yQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQmFz
aWNCbG9jayogcmVwbGFjZW1lbnQgPSBtYXBbc3VjY2Vzc29yXSkKKyAgICAgICAgICAgICAgICAg
ICAgc3VjY2Vzc29yID0gcmVwbGFjZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBm
aXhFbnRyeVN3aXRjaChuZXdCbG9jaywgZW50cnlwb2ludEluZGV4KTsKKyAgICAgICAgfQorICAg
IH0KKyAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogd29ya2xpc3Quc2VlbigpLnZhbHVlcyhj
b2RlKSkKKyAgICAgICAgZml4RW50cnlTd2l0Y2goYmxvY2ssIDApOworICAgIAorICAgIGNvZGUu
c2V0RW50cnlwb2ludHMoV1RGTW92ZShlbnRyeXBvaW50cykpOworICAgIGNvZGUucmVzZXRSZWFj
aGFiaWxpdHkoKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5k
aWYgLy8gRU5BQkxFKEIzX0pJVCkKKworCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guaAkobm9uZXhpc3RlbnQpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpZm5kZWYgQWlyTG93ZXJFbnRyeVN3aXRjaF9oCisjZGVmaW5lIEFpckxv
d2VyRW50cnlTd2l0Y2hfaAorCisjaWYgRU5BQkxFKEIzX0pJVCkKKworbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCisvLyBDb252
ZXJ0cyBjb2RlIHRoYXQgc2VlbXMgdG8gaGF2ZSBvbmUgZW50cnlwb2ludCBhbmQgZW11bGF0ZXMg
bXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aAorLy8gRW50cnlTd2l0Y2ggaW50byBjb2RlIHRoYXQg
cmVhbGx5IGhhcyBtdWx0aXBsZSBlbnRyeXBvaW50cy4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkg
ZHVwbGljYXRpbmcKKy8vIHRoZSBiYWNrd2FyZHMgdHJhbnNpdGl2ZSBjbG9zdXJlIGZyb20gYWxs
IEVudHJ5U3dpdGNoZXMuCit2b2lkIGxvd2VyRW50cnlTd2l0Y2goQ29kZSYpOworCit9IH0gfSAv
LyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCisj
ZW5kaWYgLy8gQWlyTG93ZXJFbnRyeVN3aXRjaF9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyT3Bjb2RlLm9wY29kZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2RlcwkocmV2aXNpb24gMjAzNTMwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwkod29ya2luZyBj
b3B5KQpAQCAtODQ5LDYgKzg0OSwxMCBAQCBSZXREb3VibGUgVTpGOjY0IC9yZXR1cm4KIAogT29w
cyAvdGVybWluYWwKIAorIyBUaGlzIGlzIGEgdGVybWluYWwgYnV0IHdlIGV4cHJlc3MgaXQgYXMg
YSBDdXN0b20gYmVjYXVzZSB3ZSBkb24ndCB3YW50IGl0IHRvIGhhdmUgYSBjb2RlCisjIGdlbmVy
YXRvci4KK2N1c3RvbSBFbnRyeVN3aXRjaAorCiAjIEEgU2h1ZmZsZSBpcyBhIG11bHRpLXNvdXJj
ZSwgbXVsdGktZGVzdGluYXRpb24gbW92ZS4gSXQgc2ltdWx0YW5lb3VzbHkgZG9lcyBtdWx0aXBs
ZSBtb3ZlcyBhdCBvbmNlLgogIyBUaGUgbW92ZXMgYXJlIHNwZWNpZmllZCBhcyB0cmlwbGV0cyBv
ZiBzcmMsIGRzdCwgYW5kIHdpZHRoLiBGb3IgZXhhbXBsZSB5b3UgY2FuIHJlcXVlc3QgYSBzd2Fw
IHRoaXMKICMgd2F5OgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcHRp
bWl6ZUJsb2NrT3JkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcAkocmV2aXNpb24gMjAzNTMwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC04MSwxNiArODEsMjggQEAgVmVjdG9yPEJhc2ljQmxvY2sqPiBibG9ja3NJ
bk9wdGltaXplZE9yZAogICAgIFNvcnRlZFN1Y2Nlc3NvcnMgc29ydGVkU3VjY2Vzc29yczsKICAg
ICBTb3J0ZWRTdWNjZXNzb3JzIHNvcnRlZFNsb3dTdWNjZXNzb3JzOwogICAgIAotICAgIGZhc3RX
b3JrbGlzdC5wdXNoKGNvZGVbMF0pOworICAgIC8vIFdlIGV4cGVjdCBlbnRyeXBvaW50IGxvd2Vy
aW5nIHRvIGhhdmUgYWxyZWFkeSBoYXBwZW5lZC4KKyAgICBSRUxFQVNFX0FTU0VSVChjb2RlLm51
bUVudHJ5cG9pbnRzKCkpOworCisgICAgYXV0byBhcHBlbmRTdWNjZXNzb3IgPSBbJl0gKGNvbnN0
IEZyZXF1ZW50ZWRCbG9jayYgYmxvY2spIHsKKyAgICAgICAgaWYgKGJsb2NrLmlzUmFyZSgpKQor
ICAgICAgICAgICAgc29ydGVkU2xvd1N1Y2Nlc3NvcnMuYXBwZW5kKGJsb2NrLmJsb2NrKCkpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBzb3J0ZWRTdWNjZXNzb3JzLmFwcGVuZChibG9jay5i
bG9jaygpKTsKKyAgICB9OworICAgIAorICAgIC8vIEZvciBldmVyeXRoaW5nIGJ1dCB0aGUgZmly
c3QgZW50cnlwb2ludCwgd2UgcHVzaCB0aGVtIGluIG9yZGVyIG9mIGZyZXF1ZW5jeSBhbmQgZnJl
cXVlbmN5CisgICAgLy8gY2xhc3MuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGNvZGUu
bnVtRW50cnlwb2ludHMoKTsgKytpKQorICAgICAgICBhcHBlbmRTdWNjZXNzb3IoY29kZS5lbnRy
eXBvaW50KGkpKTsKKyAgICAKKyAgICAvLyBBbHdheXMgcHVzaCB0aGUgcHJpbWFyeSBzdWNjZXNz
b3IgbGFzdCBzbyB0aGF0IGl0IGdldHMgaGlnaGVzdCBwcmlvcml0eS4KKyAgICBmYXN0V29ya2xp
c3QucHVzaChjb2RlLmVudHJ5cG9pbnQoMCkuYmxvY2soKSk7CiAgICAgCiAgICAgd2hpbGUgKEJh
c2ljQmxvY2sqIGJsb2NrID0gZmFzdFdvcmtsaXN0LnBvcCgpKSB7CiAgICAgICAgIGJsb2Nrc0lu
T3JkZXIuYXBwZW5kKGJsb2NrKTsKLSAgICAgICAgZm9yIChGcmVxdWVudGVkQmxvY2smIHN1Y2Nl
c3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpIHsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzb3Iu
aXNSYXJlKCkpCi0gICAgICAgICAgICAgICAgc29ydGVkU2xvd1N1Y2Nlc3NvcnMuYXBwZW5kKHN1
Y2Nlc3Nvci5ibG9jaygpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzb3J0
ZWRTdWNjZXNzb3JzLmFwcGVuZChzdWNjZXNzb3IuYmxvY2soKSk7Ci0gICAgICAgIH0KKyAgICAg
ICAgZm9yIChGcmVxdWVudGVkQmxvY2smIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkp
CisgICAgICAgICAgICBhcHBlbmRTdWNjZXNzb3Ioc3VjY2Vzc29yKTsKICAgICAgICAgc29ydGVk
U3VjY2Vzc29ycy5wcm9jZXNzKGZhc3RXb3JrbGlzdCk7CiAgICAgfQogCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5jcHAJKHJldmlzaW9uIDIwMzUzMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYwLDYgKzYwLDExIEBAIGJvb2wgU3BlY2lhbDo6aXNUZXJtaW5hbChJbnN0JikK
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU3BlY2lhbDo6aGFzTm9uQXJnRWZmZWN0cyhJ
bnN0JikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBTcGVjaWFsOjpoYXNOb25BcmdO
b25Db250cm9sRWZmZWN0cyhJbnN0JikKIHsKICAgICByZXR1cm4gdHJ1ZTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCShyZXZpc2lvbiAyMDM1MzApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclNwZWNpYWwuaAkod29ya2luZyBjb3B5
KQpAQCAtOTIsNiArOTIsOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGlzVGVybWluYWwo
SW5zdCYpOwogCiAgICAgLy8gQnkgZGVmYXVsdCwgdGhpcyByZXR1cm5zIHRydWUuCisgICAgdmly
dHVhbCBib29sIGhhc05vbkFyZ0VmZmVjdHMoSW5zdCYpOworCisgICAgLy8gQnkgZGVmYXVsdCwg
dGhpcyByZXR1cm5zIHRydWUuCiAgICAgdmlydHVhbCBib29sIGhhc05vbkFyZ05vbkNvbnRyb2xF
ZmZlY3RzKEluc3QmKTsKIAogICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJWYWxpZGF0ZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJWYWxpZGF0ZS5jcHAJKHJldmlz
aW9uIDIwMzUzMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVmFsaWRhdGUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlICJBaXJDb2Rl
LmgiCiAjaW5jbHVkZSAiQWlySW5zdElubGluZXMuaCIKKyNpbmNsdWRlICJCM1Byb2NlZHVyZS5o
IgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CiAKQEAg
LTU0LDcgKzU1LDcgQEAgcHVibGljOgogICAgICAgICBIYXNoU2V0PFN0YWNrU2xvdCo+IHZhbGlk
U2xvdHM7CiAgICAgICAgIEhhc2hTZXQ8QmFzaWNCbG9jayo+IHZhbGlkQmxvY2tzOwogICAgICAg
ICBIYXNoU2V0PFNwZWNpYWwqPiB2YWxpZFNwZWNpYWxzOwotCisgICAgICAgIAogICAgICAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKQogICAgICAgICAgICAgdmFsaWRCbG9ja3Mu
YWRkKGJsb2NrKTsKICAgICAgICAgZm9yIChTdGFja1Nsb3QqIHNsb3QgOiBtX2NvZGUuc3RhY2tT
bG90cygpKQpAQCAtNjMsNiArNjQsMTAgQEAgcHVibGljOgogICAgICAgICAgICAgdmFsaWRTcGVj
aWFscy5hZGQoc3BlY2lhbCk7CiAKICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1f
Y29kZSkgeworICAgICAgICAgICAgLy8gQmxvY2tzIHRoYXQgYXJlIGVudHJ5cG9pbnRzIG11c3Qg
bm90IGhhdmUgcHJlZGVjZXNzb3JzLgorICAgICAgICAgICAgaWYgKG1fY29kZS5pc0VudHJ5cG9p
bnQoYmxvY2spKQorICAgICAgICAgICAgICAgIFZBTElEQVRFKCFibG9jay0+bnVtUHJlZGVjZXNz
b3JzKCksICgiQXQgZW50cnlwb2ludCAiLCAqYmxvY2spKTsKKyAgICAgICAgICAgIAogICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6
ZSgpOyArK2luc3RJbmRleCkgewogICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+
YXQoaW5zdEluZGV4KTsKICAgICAgICAgICAgICAgICBmb3IgKEFyZyYgYXJnIDogaW5zdC5hcmdz
KSB7CkBAIC04OSw2ICs5NCwxNCBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBW
QUxJREFURSgmYXJnID49ICZpbnN0LmFyZ3NbMF0sICgiQXQgIiwgYXJnLCAiIGluICIsIGluc3Qs
ICIgaW4gIiwgKmJsb2NrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJREFURSgmYXJn
IDw9ICZpbnN0LmFyZ3MubGFzdCgpLCAoIkF0ICIsIGFyZywgIiBpbiAiLCBpbnN0LCAiIGluICIs
ICpibG9jaykpOwogICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBzd2l0Y2ggKGluc3Qub3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgY2Fz
ZSBFbnRyeVN3aXRjaDoKKyAgICAgICAgICAgICAgICAgICAgVkFMSURBVEUoYmxvY2stPm51bVN1
Y2Nlc3NvcnMoKSA9PSBtX2NvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCksICgiQXQgIiwgaW5z
dCwgIiBpbiAiLCAqYmxvY2spKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNj
ZXNzb3IgOiBibG9jay0+c3VjY2Vzc29yQmxvY2tzKCkpCiAgICAgICAgICAgICAgICAgVkFMSURB
VEUodmFsaWRCbG9ja3MuY29udGFpbnMoc3VjY2Vzc29yKSwgKCJJbiAiLCAqYmxvY2spKTsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dlbmVyYXRvci5yYgo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL29wY29kZV9nZW5lcmF0b3Iu
cmIJKHJldmlzaW9uIDIwMzUzMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bj
b2RlX2dlbmVyYXRvci5yYgkod29ya2luZyBjb3B5KQpAQCAtMTA0Niw3ICsxMDQ2LDcgQEAgd3Jp
dGVIKCJPcGNvZGVHZW5lcmF0ZWQiKSB7CiAgICAgICAgIHwgb3Bjb2RlIHwKICAgICAgICAgaWYg
b3Bjb2RlLmN1c3RvbQogICAgICAgICAgICAgb3V0cC5wdXRzICJjYXNlICN7b3Bjb2RlLm5hbWV9
OiIKLSAgICAgICAgICAgIG91dHAucHV0cyAicmV0dXJuICN7b3Bjb2RlLm5hbWV9Q3VzdG9tOjpo
YXNOb25BcmdOb25Db250cm9sRWZmZWN0cygqdGhpcyk7IgorICAgICAgICAgICAgb3V0cC5wdXRz
ICJyZXR1cm4gI3tvcGNvZGUubmFtZX1DdXN0b206Omhhc05vbkFyZ0VmZmVjdHMoKnRoaXMpOyIK
ICAgICAgICAgZW5kCiAgICAgfQogICAgIG91dHAucHV0cyAiZGVmYXVsdDoiCkluZGV4OiBTb3Vy
Y2UvV1RGL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL0NoYW5nZUxvZwkocmV2
aXNpb24gMjAzNTMwKQorKysgU291cmNlL1dURi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwxNiBAQAorMjAxNi0wNy0xOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29t
PgorCisgICAgICAgIEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHd0Zi9HcmFwaE5v
ZGVXb3JrbGlzdC5oOiBFeHBvc2Ugc29tZSBoYW5keSBmdW5jdGlvbmFsaXR5LgorICAgICAgICAo
V1RGOjpHcmFwaE5vZGVXb3JrbGlzdDo6cG9wKToKKyAgICAgICAgKFdURjo6R3JhcGhOb2RlV29y
a2xpc3Q6OnNhdyk6CisgICAgICAgIChXVEY6OkdyYXBoTm9kZVdvcmtsaXN0OjpzZWVuKToKKyAg
ICAgICAgKiB3dGYvVmVjdG9yVHJhaXRzLmg6IEZpeCBhIGJ1ZyEgT3RoZXJ3aXNlIGZpbGxpbmcg
YSB2ZWN0b3Igb2YgYnl0ZS1zaXplZCBlbnVtIGNsYXNzZXMgZG9lc24ndCB3b3JrLgorCiAyMDE2
LTA3LTIwICBSYWplZXYgTWlzcmEgIDxyYWplZXZtaXNyYWZvcmFwcGxlQGdtYWlsLmNvbT4KIAog
ICAgICAgICBSZW1vdmUgdW5uZWNlc3NhcnkgaWYgY2hlY2sgZnJvbSBQYXJraW5nTG90LmNwcApJ
bmRleDogU291cmNlL1dURi93dGYvR3JhcGhOb2RlV29ya2xpc3QuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlzdC5oCShyZXZpc2lvbiAyMDM1MzApCisrKyBT
b3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC02Myw2
ICs2Myw4IEBAIHB1YmxpYzoKICAgICB9CiAKICAgICBib29sIHNhdyhOb2RlIG5vZGUpIHsgcmV0
dXJuIG1fc2Vlbi5jb250YWlucyhub2RlKTsgfQorICAgIAorICAgIGNvbnN0IFNldCYgc2Vlbigp
IGNvbnN0IHsgcmV0dXJuIG1fc2VlbjsgfQogCiBwcml2YXRlOgogICAgIFNldCBtX3NlZW47Cklu
ZGV4OiBTb3VyY2UvV1RGL3d0Zi9WZWN0b3JUcmFpdHMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V1RGL3d0Zi9WZWN0b3JUcmFpdHMuaAkocmV2aXNpb24gMjAzNTMwKQorKysgU291cmNlL1dURi93
dGYvVmVjdG9yVHJhaXRzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICog
Q29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAxNiBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI1LDYgKzI1LDcg
QEAKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRl
IDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAKIG5hbWVzcGFjZSBXVEYgewogCkBA
IC01MSw3ICs1Miw3IEBAIG5hbWVzcGFjZSBXVEYgewogICAgICAgICBzdGF0aWMgY29uc3QgYm9v
bCBjYW5Jbml0aWFsaXplV2l0aE1lbXNldCA9IGZhbHNlOwogICAgICAgICBzdGF0aWMgY29uc3Qg
Ym9vbCBjYW5Nb3ZlV2l0aE1lbWNweSA9IHRydWU7CiAgICAgICAgIHN0YXRpYyBjb25zdCBib29s
IGNhbkNvcHlXaXRoTWVtY3B5ID0gdHJ1ZTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgY2Fu
RmlsbFdpdGhNZW1zZXQgPSBzaXplb2YoVCkgPT0gc2l6ZW9mKGNoYXIpOworICAgICAgICBzdGF0
aWMgY29uc3QgYm9vbCBjYW5GaWxsV2l0aE1lbXNldCA9IHNpemVvZihUKSA9PSBzaXplb2YoY2hh
cikgJiYgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWU7CiAgICAgICAgIHN0YXRpYyBjb25zdCBi
b29sIGNhbkNvbXBhcmVXaXRoTWVtY21wID0gdHJ1ZTsKICAgICB9OwogCg==
</data>
<flag name="review"
          id="307915"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>284448</attachid>
            <date>2016-07-24 11:04:51 -0700</date>
            <delta_ts>2016-07-24 11:10:35 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>71159</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyOCBA
QAorMjAxNi0wNy0xOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAg
IEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAgICAgICBSZXZpZXdl
ZCBieSBTYWFtIEJhcmF0aS4KKyAgICAgICAgCisgICAgICAgIFRoaXMgdGVhY2hlcyBCMyBob3cg
dG8gY29tcGlsZSBwcm9jZWR1cmVzIHdpdGggbXVsdGlwbGUgZW50cnlwb2ludHMgaW4gdGhlIGJl
c3Qgd2F5IGV2ZXIuCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBvaW50cyBhcmUg
dXNlZnVsLiBXZSBjb3VsZCB1c2UgdGhlbSB0byByZWR1Y2UgdGhlIGNvc3Qgb2YgY29tcGlsaW5n
IE9TUgorICAgICAgICBlbnRyeXBvaW50cy4gV2UgY291bGQgdXNlIHRoZW0gdG8gaW1wbGVtZW50
IGJldHRlciB0cnkvY2F0Y2guCisgICAgICAgIAorICAgICAgICBNdWx0aXBsZSBlbnRyeXBvaW50
cyBhcmUgaGFyZCB0byBzdXBwb3J0LiBBbGwgb2YgYSBzdWRkZW4sIGFsbCBvZiB0aGUgY29kZSB0
aGF0IGFzc3VtZWQKKyAgICAgICAgdGhhdCB0aGUgcm9vdCBibG9jayBpcyB0aGUgZW50cnlwb2lu
dCB3b3VsZCBoYXZlIHRvIGJlIGNoYW5nZWQuIFRyYW5zZm9ybWF0aW9ucyBsaWtlCisgICAgICAg
IG1vdmVDb25zdGFudHMoKSB3b3VsZCBoYXZlIHRvIGRvIGNyYXp5IHRoaW5ncyBpZiB0aGUgZXhp
c3RlbmNlIG9mIG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIHByZXZlbnRlZCBpdCBmcm9t
IGZpbmRpbmcgYSBzaW5nbGUgY29tbW9uIGRvbWluYXRvci4KKyAgICAgICAgCisgICAgICAgIFRo
ZXJlZm9yZSwgd2Ugd2FudCB0byBhZGQgbXVsdGlwbGUgZW50cnlwb2ludHMgd2l0aG91dCBhY3R1
YWxseSB0ZWFjaGluZyB0aGUgY29tcGlsZXIgdGhhdAorICAgICAgICB0aGVyZSBpcyBzdWNoIGEg
dGhpbmcuIFRoYXQncyBzb3J0IG9mIHdoYXQgdGhpcyBjaGFuZ2UgZG9lcy4KKyAgICAgICAgCisg
ICAgICAgIFRoaXMgYWRkcyBhIG5ldyBvcGNvZGUgdG8gYm90aCBCMyBhbmQgQWlyIGNhbGxlZCBF
bnRyeVN3aXRjaC4gSXQncyBhIHRlcm1pbmFsIHRoYXQgdGFrZXMKKyAgICAgICAgb25lIG9yIG1v
cmUgc3VjY2Vzc29ycyBhbmQgbm8gdmFsdWUgY2hpbGRyZW4uIFRoZSBudW1iZXIgb2Ygc3VjY2Vz
c29ycyBtdXN0IG1hdGNoCisgICAgICAgIFByb2NlZHVyZTo6bnVtRW50cnlwb2ludHMoKSwgd2hp
Y2ggY291bGQgYmUgYXJiaXRyYXJpbHkgbGFyZ2UuIFRoZSBzZW1hbnRpY3Mgb2YgRW50cnlTd2l0
Y2gKKyAgICAgICAgYXJlOgorICAgICAgICAKKyAgICAgICAgLSBFYWNoIG9mIHRoZSBlbnRyeXBv
aW50cyBzZXRzIGEgaGlkZGVuIEVudHJ5IHZhcmlhYmxlIHRvIHRoYXQgZW50cnlwb2ludCdzIGlu
ZGV4IGFuZCBqdW1wcworICAgICAgICAgIHRvIHRoZSBwcm9jZWR1cmUncyByb290IGJsb2NrLgor
ICAgICAgICAKKyAgICAgICAgLSBBbiBFbnRyeVN3aXRjaCBpcyBhIHN3aXRjaCBzdGF0ZW1lbnQg
b3ZlciB0aGlzIGhpZGRlbiBFbnRyeSB2YXJpYWJsZS4KKyAgICAgICAgCisgICAgICAgIFRoZSB3
YXkgdGhhdCB3ZSBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcyBpcyB0aGF0IEFpciBoYXMgYSB2ZXJ5
IGxhdGUgcGhhc2UgLSBhZnRlciBhbGwKKyAgICAgICAgcmVnaXN0ZXIgYW5kIHN0YWNrIGxheW91
dCAtIHRoYXQgY2xvbmVzIGFsbCBjb2RlIHdoZXJlIHRoZSBFbnRyeSB2YXJpYWJsZSBpcyBsaXZl
OyBpLmUgYWxsCisgICAgICAgIGNvZGUgaW4gdGhlIGNsb3N1cmUgb3ZlciBwcmVkZWNlc3NvcnMg
b2YgYWxsIGJsb2NrcyB0aGF0IGRvIEVudHJ5U3dpdGNoLgorICAgICAgICAKKyAgICAgICAgVXN1
YWxseSwgeW91IHdvdWxkIHVzZSB0aGlzIGJ5IGNyZWF0aW5nIGFuIEVudHJ5U3dpdGNoIGluIHRo
ZSByb290IGJsb2NrLCBidXQgeW91IGRvbid0CisgICAgICAgIGhhdmUgdG8gZG8gdGhhdC4gSnVz
dCByZW1lbWJlciB0aGF0IHRoZSBjb2RlIGJlZm9yZSBFbnRyeVN3aXRjaCBnZXRzIGNsb25lZCBm
b3IgZWFjaAorICAgICAgICBlbnRyeXBvaW50LiBXZSBhbGxvdyBjbG9uaW5nIG9mIGFuIGFyYml0
cmFyaWx5IGxhcmdlIGFtb3VudCBvZiBjb2RlIGJlY2F1c2UgcmVzdHJpY3RpbmcgaXQsCisgICAg
ICAgIGFuZCBzbyByZXN0cmljaW5nIHRoZSBwbGFjZW1lbnQgb2YgRW50cnlTd2l0Y2hlcywgd291
bGQgYmUgdW5lbGVnYW50LiBJdCB3b3VsZCBiZSBoYXJkIHRvCisgICAgICAgIHByZXNlcnZlIHRo
aXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGxvd2VyIGFu
eSB2YWx1ZSBiZWZvcmUgYW4KKyAgICAgICAgRW50cnlTd2l0Y2ggdG8gYSBjb250cm9sIGZsb3cg
ZGlhbW9uZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggZ2l2ZXMgdXMgYW4gZWFzeS10
by11c2Ugd2F5IHRvIHVzZSBCMyB0byBjb21waWxlIGNvZGUgd2l0aCBtdWx0aXBsZSBlbnRyeXBv
aW50cy4KKyAgICAgICAgSW5zaWRlIHRoZSBjb21waWxlciwgb25seSBjb2RlIHRoYXQgcnVucyB2
ZXJ5IGxhdGUgaW4gQWlyIGhhcyB0byBrbm93IGFib3V0IHRoaXMgZmVhdHVyZS4KKyAgICAgICAg
V2UgZ2V0IHRoZSBiZXN0IG9mIGJvdGggd29ybGRzIQorICAgICAgICAKKyAgICAgICAgQWxzbywg
SSBmaW5hbGx5IGdvdCByaWQgb2YgdGhlIHJlcXVpcmVtZW50IHRoYXQgeW91IGV4cGxpY2l0bHkg
Y2FzdCBCYXNpY0Jsb2NrKiB0bworICAgICAgICBGcmVxdWVudGVkQmxvY2suIEkgY2FuIG5vIGxv
bmdlciByZW1lbWJlciB3aHkgSSB0aG91Z2h0IHRoYXQgd2FzIGEgZ29vZCBpZGVhLiBSZW1vdmlu
ZyBpdAorICAgICAgICBkb2Vzbid0IGNhdXNlIGFueSBwcm9ibGVtcyBhbmQgaXQgbWFrZXMgY29k
ZSBlYXNpZXIgdG8gd3JpdGUuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAg
KiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGIz
L0IzQmFzaWNCbG9ja1V0aWxzLmg6CisgICAgICAgIChKU0M6OkIzOjp1cGRhdGVQcmVkZWNlc3Nv
cnNBZnRlcik6CisgICAgICAgIChKU0M6OkIzOjpjbGVhclByZWRlY2Vzc29ycyk6CisgICAgICAg
IChKU0M6OkIzOjpyZWNvbXB1dGVQcmVkZWNlc3NvcnMpOgorICAgICAgICAqIGIzL0IzRnJlcXVl
bmN5Q2xhc3MuaDoKKyAgICAgICAgKEpTQzo6QjM6Om1heEZyZXF1ZW5jeSk6CisgICAgICAgICog
YjMvQjNHZW5lcmF0ZS5oOgorICAgICAgICAqIGIzL0IzTG93ZXJUb0Fpci5jcHA6CisgICAgICAg
IChKU0M6OkIzOjpBaXI6Okxvd2VyVG9BaXI6Omxvd2VyKToKKyAgICAgICAgKiBiMy9CM01vdmVD
b25zdGFudHMuY3BwOgorICAgICAgICAqIGIzL0IzT3Bjb2RlLmNwcDoKKyAgICAgICAgKFdURjo6
cHJpbnRJbnRlcm5hbCk6CisgICAgICAgICogYjMvQjNPcGNvZGUuaDoKKyAgICAgICAgKiBiMy9C
M1Byb2NlZHVyZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6OmlzRmFzdENvbnN0
YW50KToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6ZW50cnlwb2ludExhYmVsKToKKyAg
ICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6YWRkRGF0YVNlY3Rpb24pOgorICAgICAgICAqIGIz
L0IzUHJvY2VkdXJlLmg6CisgICAgICAgIChKU0M6OkIzOjpQcm9jZWR1cmU6Om51bUVudHJ5cG9p
bnRzKToKKyAgICAgICAgKEpTQzo6QjM6OlByb2NlZHVyZTo6c2V0TnVtRW50cnlwb2ludHMpOgor
ICAgICAgICAoSlNDOjpCMzo6UHJvY2VkdXJlOjpzZXRMYXN0UGhhc2VOYW1lKToKKyAgICAgICAg
KiBiMy9CM1ZhbGlkYXRlLmNwcDoKKyAgICAgICAgKiBiMy9CM1ZhbHVlLmNwcDoKKyAgICAgICAg
KEpTQzo6QjM6OlZhbHVlOjplZmZlY3RzKToKKyAgICAgICAgKEpTQzo6QjM6OlZhbHVlOjp0eXBl
Rm9yKToKKyAgICAgICAgKiBiMy9CM1ZhbHVlLmg6CisgICAgICAgICogYjMvYWlyL0FpckNvZGUu
Y3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpjQ2FsbFNwZWNpYWwpOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpDb2RlOjppc0VudHJ5cG9pbnQpOgorICAgICAgICAoSlNDOjpCMzo6
QWlyOjpDb2RlOjpyZXNldFJlYWNoYWJpbGl0eSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNv
ZGU6OmR1bXApOgorICAgICAgICAqIGIzL2Fpci9BaXJDb2RlLmg6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6OkNvZGU6OnNldEZyYW1lU2l6ZSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNvZGU6
Om51bUVudHJ5cG9pbnRzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6ZW50cnlwb2lu
dHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjplbnRyeXBvaW50KToKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6Q29kZTo6c2V0RW50cnlwb2ludHMpOgorICAgICAgICAoSlNDOjpCMzo6
QWlyOjpDb2RlOjplbnRyeXBvaW50TGFiZWwpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2Rl
OjpzZXRFbnRyeXBvaW50TGFiZWxzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q29kZTo6Y2Fs
bGVlU2F2ZVJlZ2lzdGVycyk6CisgICAgICAgICogYjMvYWlyL0FpckN1c3RvbS5oOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpQYXRjaEN1c3RvbTo6aXNUZXJtaW5hbCk6CisgICAgICAgIChKU0M6
OkIzOjpBaXI6OlBhdGNoQ3VzdG9tOjpoYXNOb25BcmdFZmZlY3RzKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6UGF0Y2hDdXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6UGF0Y2hDdXN0b206OmdlbmVyYXRlKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6Q29tbW9uQ3VzdG9tQmFzZTo6aGFzTm9uQXJnRWZmZWN0cyk6CisgICAgICAgIChK
U0M6OkIzOjpBaXI6OkNDYWxsQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6Q29sZENDYWxsQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6U2h1ZmZsZUN1c3RvbTo6Zm9yRWFjaEFyZyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkVu
dHJ5U3dpdGNoQ3VzdG9tOjpmb3JFYWNoQXJnKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6RW50
cnlTd2l0Y2hDdXN0b206OmlzVmFsaWRGb3JtU3RhdGljKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6RW50cnlTd2l0Y2hDdXN0b206OmlzVmFsaWRGb3JtKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6RW50cnlTd2l0Y2hDdXN0b206OmFkbWl0c1N0YWNrKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6RW50cnlTd2l0Y2hDdXN0b206OmlzVGVybWluYWwpOgorICAgICAgICAoSlNDOjpCMzo6QWly
OjpFbnRyeVN3aXRjaEN1c3RvbTo6aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMpOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpFbnRyeVN3aXRjaEN1c3RvbTo6Z2VuZXJhdGUpOgorICAgICAgICAq
IGIzL2Fpci9BaXJHZW5lcmF0ZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OnByZXBhcmVG
b3JHZW5lcmF0aW9uKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Z2VuZXJhdGUpOgorICAgICAg
ICAqIGIzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6
OkIzOjpBaXI6Omxvd2VyRW50cnlTd2l0Y2gpOgorICAgICAgICAqIGIzL2Fpci9BaXJMb3dlckVu
dHJ5U3dpdGNoLmg6IEFkZGVkLgorICAgICAgICAqIGIzL2Fpci9BaXJPcGNvZGUub3Bjb2RlczoK
KyAgICAgICAgKiBiMy9haXIvQWlyT3B0aW1pemVCbG9ja09yZGVyLmNwcDoKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6YmxvY2tzSW5PcHRpbWl6ZWRPcmRlcik6CisgICAgICAgICogYjMvYWlyL0Fp
clNwZWNpYWwuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpTcGVjaWFsOjppc1Rlcm1pbmFs
KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6U3BlY2lhbDo6aGFzTm9uQXJnRWZmZWN0cyk6Cisg
ICAgICAgIChKU0M6OkIzOjpBaXI6OlNwZWNpYWw6Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3Rz
KToKKyAgICAgICAgKiBiMy9haXIvQWlyU3BlY2lhbC5oOgorICAgICAgICAqIGIzL2Fpci9BaXJW
YWxpZGF0ZS5jcHA6CisgICAgICAgICogYjMvYWlyL29wY29kZV9nZW5lcmF0b3IucmI6CisgICAg
ICAgICogYjMvdGVzdGIzLmNwcDoKKwogMjAxNi0wNy0yMiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9A
YXBwbGUuY29tPgogCiAgICAgICAgIFtCM10gRnVzaW5nIGltbWVkaWF0ZXMgaW50byB0ZXN0IGlu
c3RydWN0aW9ucyBzaG91bGQgd29yayBhZ2FpbgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFr
ZUxpc3RzLnR4dAkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NN
YWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC04OSw2ICs4OSw3IEBAIHNldChKYXZhU2Ny
aXB0Q29yZV9TT1VSQ0VTCiAgICAgYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
LmNwcAogICAgIGIzL2Fpci9BaXJMb2dSZWdpc3RlclByZXNzdXJlLmNwcAogICAgIGIzL2Fpci9B
aXJMb3dlckFmdGVyUmVnQWxsb2MuY3BwCisgICAgYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2gu
Y3BwCiAgICAgYjMvYWlyL0Fpckxvd2VyTWFjcm9zLmNwcAogICAgIGIzL2Fpci9BaXJPcHRpbWl6
ZUJsb2NrT3JkZXIuY3BwCiAgICAgYjMvYWlyL0FpclBoYXNlU2NvcGUuY3BwCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTcwMiw2ICs3MDIsOCBAQAogCQkwRkRCMkNFQTE3NDg5NkM3MDA3QjNDMUIg
LyogQ29uY3VycmVudEpJVExvY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGREIyQ0U5MTc0ODk2QzcwMDdCM0MxQiAvKiBDb25jdXJyZW50SklUTG9j
ay5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBG
RERCRkI1MTY2NkVFRDgwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vzc0RhdGFEdW1wLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRERCRkIyMTY2
NkVFRDUwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vzc0RhdGFEdW1wLmNwcCAqLzsgfTsKIAkJ
MEZEREJGQjYxNjY2RUVEQTAwQzU1RkVGIC8qIERGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRERCRkIzMTY2
NkVFRDUwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vzc0RhdGFEdW1wLmggKi87IH07CisJCTBG
REY3MDg1MUQzRjJDMjIwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGREY3MDgzMUQzRjJDMUYw
MDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcCAqLzsgfTsKKwkJMEZERjcwODYxRDNG
MkMyNTAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGREY3MDg0MUQzRjJDMUYwMDkyNzQ0OSAvKiBB
aXJMb3dlckVudHJ5U3dpdGNoLmggKi87IH07CiAJCTBGRTA1MDE0MUFBOTA5MTEwMEQzM0IzMyAv
KiBBcmd1bWVudHNNb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAwRkUwNTAwQzFBQTkwOTExMDBEMzNCMzMgLyogQXJndW1lbnRzTW9kZS5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGRTA1MDE1MUFB
OTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZFMDUwMEQxQUE5MDkxMTAwRDMzQjMz
IC8qIERpcmVjdEFyZ3VtZW50c09mZnNldC5jcHAgKi87IH07CiAJCTBGRTA1MDE2MUFBOTA5MTEw
MEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRTA1MDBFMUFBOTA5MTEwMEQzM0IzMyAvKiBEaXJl
Y3RBcmd1bWVudHNPZmZzZXQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRl
LCApOyB9OyB9OwpAQCAtMjkxMSw2ICsyOTEzLDggQEAKIAkJMEZEQjJDRTkxNzQ4OTZDNzAwN0Iz
QzFCIC8qIENvbmN1cnJlbnRKSVRMb2NrLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IENvbmN1cnJlbnRKSVRMb2NrLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBG
RERCRkIyMTY2NkVFRDUwMEM1NUZFRiAvKiBERkdWYXJpYWJsZUFjY2Vzc0RhdGFEdW1wLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1ZhcmlhYmxlQWNjZXNzRGF0
YUR1bXAuY3BwOyBwYXRoID0gZGZnL0RGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkREQkZCMzE2NjZFRUQ1MDBDNTVGRUYgLyogREZH
VmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBERkdWYXJpYWJsZUFjY2Vzc0RhdGFEdW1wLmg7IHBhdGggPSBkZmcvREZHVmFyaWFibGVBY2Nl
c3NEYXRhRHVtcC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRkRGNzA4MzFEM0Yy
QzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IG5hbWUgPSBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcDsgcGF0aCA9IGIzL2Fp
ci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEZERjcwODQxRDNGMkMxRjAwOTI3NDQ5IC8qIEFpckxvd2VyRW50cnlTd2l0Y2guaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWlyTG93ZXJFbnRyeVN3aXRjaC5oOyBwYXRoID0g
YjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMEZFMDUwMEMxQUE5MDkxMTAwRDMzQjMzIC8qIEFyZ3VtZW50c01vZGUuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQXJndW1lbnRzTW9kZS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwRkUwNTAwRDFBQTkwOTExMDBEMzNCMzMgLyogRGlyZWN0QXJndW1lbnRz
T2Zmc2V0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERpcmVjdEFy
Z3VtZW50c09mZnNldC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRTA1MDBF
MUFBOTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gRGlyZWN0QXJndW1lbnRzT2Zmc2V0Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CkBAIC00OTE3LDYgKzQ5MjEsOCBAQAogCQkJCTBGRTM0QzE4MUM0QjM5
QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclByZXNzdXJlLmggKi8sCiAJCQkJMEY2MTgzMjUx
QzQ1QkYwNzAwNzI0NTBCIC8qIEFpckxvd2VyQWZ0ZXJSZWdBbGxvYy5jcHAgKi8sCiAJCQkJMEY2
MTgzMjYxQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckxvd2VyQWZ0ZXJSZWdBbGxvYy5oICovLAorCQkJ
CTBGREY3MDgzMUQzRjJDMUYwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmNwcCAqLywK
KwkJCQkwRkRGNzA4NDFEM0YyQzFGMDA5Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5oICov
LAogCQkJCTBGNjE4MzI3MUM0NUJGMDcwMDcyNDUwQiAvKiBBaXJMb3dlck1hY3Jvcy5jcHAgKi8s
CiAJCQkJMEY2MTgzMjgxQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckxvd2VyTWFjcm9zLmggKi8sCiAJ
CQkJMjY0MDkxRkExQkUyRkQ0MTAwNjg0REIyIC8qIEFpck9wY29kZS5vcGNvZGVzICovLApAQCAt
ODEwNCw2ICs4MTEwLDcgQEAKIAkJCQlCQzE4QzQ2MzBFMTZGNUNEMDBCMzQ0NjAgLyogU291cmNl
UHJvdmlkZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCUU0OURDMTZDMTJFRjI5NEUwMDE4NEExRiAv
KiBTb3VyY2VQcm92aWRlckNhY2hlLmggaW4gSGVhZGVycyAqLywKIAkJCQlFNDlEQzE2RDEyRUYy
OTUzMDAxODRBMUYgLyogU291cmNlUHJvdmlkZXJDYWNoZUl0ZW0uaCBpbiBIZWFkZXJzICovLAor
CQkJCTBGREY3MDg2MUQzRjJDMjUwMDkyNzQ0OSAvKiBBaXJMb3dlckVudHJ5U3dpdGNoLmggaW4g
SGVhZGVycyAqLywKIAkJCQkwRkI3RjM5RTE1RUQ4RTQ2MDBGMTY3QjIgLyogU3BhcnNlQXJyYXlW
YWx1ZU1hcC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTczODY1NTQxMTg2OTdCNDAwNTQwMjc5IC8q
IFNwZWNpYWxpemVkVGh1bmtKSVQuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGNTU0MUIyMTYxM0Mx
RkIwMENFM0UyNSAvKiBTcGVjaWFsUG9pbnRlci5oIGluIEhlYWRlcnMgKi8sCkBAIC05NDE0LDYg
Kzk0MjEsNyBAQAogCQkJCTBGMjRFNTUwMTdFRTI3NDkwMEFCQjIxNyAvKiBSZXBhdGNoLmNwcCBp
biBTb3VyY2VzICovLAogCQkJCTBGNkI4QUQ4MUM0RUREQTIwMDk2OTA1MiAvKiBCM0R1cGxpY2F0
ZVRhaWxzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUyNzc3M0RFMUFBRjgzQUMwMEJERTdFOCAv
KiBSdW50aW1lVHlwZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRkRGNzA4NTFEM0YyQzIyMDA5
Mjc0NDkgLyogQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjc3
MDA5MjE0MDJGRjNDMDA3OEVCMzkgLyogU2FtcGxpbmdDb3VudGVyLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTc5MDVCQjY4MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJMEZFMDUwMjcxQUE5MDk1NjAwRDMzQjMzIC8qIFNjb3BlZEFyZ3VtZW50
cy5jcHAgaW4gU291cmNlcyAqLywKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0Jh
c2ljQmxvY2tVdGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0Jhc2ljQmxvY2tVdGlscy5oCShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNCYXNpY0Jsb2NrVXRpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtODYsMTQgKzg2
LDE4IEBAIHZvaWQgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIoQmFzaWNCbG9jayoKIH0KIAogdGVt
cGxhdGU8dHlwZW5hbWUgQmFzaWNCbG9jaz4KLXZvaWQgcmVjb21wdXRlUHJlZGVjZXNzb3JzKFZl
Y3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCit2b2lkIGNsZWFyUHJl
ZGVjZXNzb3JzKFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+JiBibG9ja3MpCiB7
Ci0gICAgLy8gQ2xlYXIgYWxsIHByZWRlY2Vzc29yIGxpc3RzIGZpcnN0LgogICAgIGZvciAoYXV0
byYgYmxvY2sgOiBibG9ja3MpIHsKICAgICAgICAgaWYgKGJsb2NrKQogICAgICAgICAgICAgYmxv
Y2stPnByZWRlY2Vzc29ycygpLnJlc2l6ZSgwKTsKICAgICB9Cit9CiAKK3RlbXBsYXRlPHR5cGVu
YW1lIEJhc2ljQmxvY2s+Cit2b2lkIHJlY29tcHV0ZVByZWRlY2Vzc29ycyhWZWN0b3I8c3RkOjp1
bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiYgYmxvY2tzKQoreworICAgIGNsZWFyUHJlZGVjZXNzb3Jz
KGJsb2Nrcyk7CiAgICAgdXBkYXRlUHJlZGVjZXNzb3JzQWZ0ZXIoYmxvY2tzWzBdLmdldCgpKTsK
IH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzRnJlcXVlbmN5Q2xhc3MuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVuY3lDbGFzcy5o
CShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGcmVxdWVu
Y3lDbGFzcy5oCSh3b3JraW5nIGNvcHkpCkBAIC00Myw2ICs0MywxMyBAQCBlbnVtIGNsYXNzIEZy
ZXF1ZW5jeUNsYXNzIDogdWludDhfdCB7CiAgICAgUmFyZQogfTsKIAoraW5saW5lIEZyZXF1ZW5j
eUNsYXNzIG1heEZyZXF1ZW5jeShGcmVxdWVuY3lDbGFzcyBhLCBGcmVxdWVuY3lDbGFzcyBiKQor
eworICAgIGlmIChhID09IEZyZXF1ZW5jeUNsYXNzOjpOb3JtYWwpCisgICAgICAgIHJldHVybiBG
cmVxdWVuY3lDbGFzczo6Tm9ybWFsOworICAgIHJldHVybiBiOworfQorCiB9IH0gLy8gbmFtZXNw
YWNlIEpTQzo6QjMKIAogbmFtZXNwYWNlIFdURiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNHZW5lcmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0dlbmVyYXRlLmgJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM0dlbmVyYXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAxNS0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAq
CiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzksMTIgKzM5LDEyIEBAIG5hbWVzcGFj
ZSBBaXIgeyBjbGFzcyBDb2RlOyB9CiAKIC8vIFRoaXMgdGFrZXMgYSBCMzo6UHJvY2VkdXJlLCBv
cHRpbWl6ZXMgaXQgaW4tcGxhY2UsIGxvd2VycyBpdCB0byBBaXIsIGFuZCBwcmVwYXJlcyB0aGUg
QWlyIGZvcgogLy8gZ2VuZXJhdGlvbi4KLXZvaWQgcHJlcGFyZUZvckdlbmVyYXRpb24oUHJvY2Vk
dXJlJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKK0pTX0VYUE9SVF9QUklWQVRFIHZvaWQgcHJl
cGFyZUZvckdlbmVyYXRpb24oUHJvY2VkdXJlJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAog
Ly8gVGhpcyB0YWtlcyBhIEIzOjpQcm9jZWR1cmUgdGhhdCBoYXMgYmVlbiBwcmVwYXJlZCBmb3Ig
Z2VuZXJhdGlvbiAoaS5lLiBpdCBoYXMgYmVlbiBsb3dlcmVkIHRvIEFpciBhbmQKIC8vIHRoZSBB
aXIgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGdlbmVyYXRpb24pIGFuZCBnZW5lcmF0ZXMgaXQuIFRo
aXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgY2FsbGluZwogLy8gQWlyOjpnZW5lcmF0ZSgpIG9uIHRo
ZSBQcm9jZWR1cmU6OmNvZGUoKS4KLXZvaWQgZ2VuZXJhdGUoUHJvY2VkdXJlJiwgQ0NhbGxIZWxw
ZXJzJik7CitKU19FWFBPUlRfUFJJVkFURSB2b2lkIGdlbmVyYXRlKFByb2NlZHVyZSYsIENDYWxs
SGVscGVycyYpOwogCiAvLyBUaGlzIHRha2VzIGEgQjM6OlByb2NlZHVyZSwgb3B0aW1pemVzIGl0
IGluLXBsYWNlLCBhbmQgbG93ZXJzIGl0IHRvIEFpci4gWW91IGNhbiB0aGVuIGdlbmVyYXRlCiAv
LyB0aGUgQWlyIHRvIG1hY2hpbmUgY29kZSB1c2luZyBBaXI6OnByZXBhcmVGb3JHZW5lcmF0aW9u
KCkgYW5kIEFpcjo6Z2VuZXJhdGUoKSBvbiB0aGUgUHJvY2VkdXJlJ3MKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM0dlbmVyaWNGcmVxdWVudGVkQmxvY2suaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNHZW5lcmljRnJlcXVlbnRlZEJsb2NrLmgJKHJl
dmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0dlbmVyaWNGcmVx
dWVudGVkQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMzksNyArMzksNyBAQCBuYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIEIzIHsKIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljQmxvY2s+CiBjbGFz
cyBHZW5lcmljRnJlcXVlbnRlZEJsb2NrIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBHZW5lcmlj
RnJlcXVlbnRlZEJsb2NrKAorICAgIEdlbmVyaWNGcmVxdWVudGVkQmxvY2soCiAgICAgICAgIEJh
c2ljQmxvY2sqIGJsb2NrID0gbnVsbHB0ciwgRnJlcXVlbmN5Q2xhc3MgZnJlcXVlbmN5ID0gRnJl
cXVlbmN5Q2xhc3M6Ok5vcm1hbCkKICAgICAgICAgOiBtX2Jsb2NrKGJsb2NrKQogICAgICAgICAs
IG1fZnJlcXVlbmN5KGZyZXF1ZW5jeSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0xvd2VyVG9BaXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M0xvd2VyVG9BaXIuY3BwCShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNMb3dlclRvQWlyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ2NCw2ICsyNDY0LDEx
IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBhcHBlbmQoQWlyOjpPb3BzKTsKICAgICAgICAgICAg
IHJldHVybjsKICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQjM6OkVudHJ5
U3dpdGNoOiB7CisgICAgICAgICAgICBhcHBlbmQoQWlyOjpFbnRyeVN3aXRjaCk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAg
YnJlYWs7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNb3ZlQ29uc3RhbnRzLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNNb3ZlQ29uc3RhbnRz
LmNwcAkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzTW92
ZUNvbnN0YW50cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljOgog
ICAgICAgICAKICAgICAgICAgaG9pc3RDb25zdGFudHMoCiAgICAgICAgICAgICBbJl0gKGNvbnN0
IFZhbHVlS2V5JiBrZXkpIC0+IGJvb2wgewotICAgICAgICAgICAgICAgIHJldHVybiBrZXkub3Bj
b2RlKCkgPT0gQ29uc3QzMiB8fCBrZXkub3Bjb2RlKCkgPT0gQ29uc3Q2NDsKKyAgICAgICAgICAg
ICAgICByZXR1cm4ga2V5Lm9wY29kZSgpID09IENvbnN0MzIgfHwga2V5Lm9wY29kZSgpID09IENv
bnN0NjQgfHwga2V5Lm9wY29kZSgpID09IEFyZ3VtZW50UmVnOwogICAgICAgICAgICAgfSk7CiAg
ICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNPcGNvZGUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHJldmlzaW9u
IDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI5MCw2ICsyOTAsOSBAQCB2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJl
YW0mIG91dCwgT3BjCiAgICAgY2FzZSBTd2l0Y2g6CiAgICAgICAgIG91dC5wcmludCgiU3dpdGNo
Iik7CiAgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAgICAgICBvdXQu
cHJpbnQoIkVudHJ5U3dpdGNoIik7CisgICAgICAgIHJldHVybjsKICAgICBjYXNlIFJldHVybjoK
ICAgICAgICAgb3V0LnByaW50KCJSZXR1cm4iKTsKICAgICAgICAgcmV0dXJuOwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzT3Bjb2RlLmgJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9CM09wY29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMTYsNiArMjE2
LDExIEBAIGVudW0gT3Bjb2RlIDogaW50MTZfdCB7CiAKICAgICAvLyBTd2l0Y2guIFN3aXRjaGVz
IG92ZXIgZWl0aGVyIEludDMyIG9yIEludDY0LiBVc2VzIHRoZSBTd2l0Y2hWYWx1ZSBjbGFzcy4K
ICAgICBTd2l0Y2gsCisgICAgCisgICAgLy8gTXVsdGlwbGUgZW50cnlwb2ludHMgYXJlIHN1cHBv
cnRlZCB2aWEgdGhlIEVudHJ5U3dpdGNoIG9wZXJhdGlvbi4gUGxhY2UgdGhpcyBpbiB0aGUgcm9v
dAorICAgIC8vIGJsb2NrIGFuZCBsaXN0IHRoZSBlbnRyeXBvaW50cyBhcyB0aGUgc3VjY2Vzc29y
cy4gQWxsIGJsb2NrcyBiYWNrd2FyZHMtcmVhY2hhYmxlIGZyb20KKyAgICAvLyBFbnRyeVN3aXRj
aCBhcmUgZHVwbGljYXRlZCBmb3IgZWFjaCBlbnRyeXBvaW50LgorICAgIEVudHJ5U3dpdGNoLAog
CiAgICAgLy8gUmV0dXJuLiBOb3RlIHRoYXQgQjMgcHJvY2VkdXJlcyBkb24ndCBrbm93IHRoZWly
IHJldHVybiB0eXBlLCBzbyB0aGlzIGNhbiBqdXN0IHJldHVybiBhbnkKICAgICAvLyB0eXBlLgpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzUHJvY2VkdXJlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCShyZXZpc2lvbiAy
MDM2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNQcm9jZWR1cmUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yODAsNiArMjgwLDExIEBAIGJvb2wgUHJvY2VkdXJlOjppc0Zhc3RDb25z
dGFudChjb25zdCBWYWwKICAgICByZXR1cm4gbV9mYXN0Q29uc3RhbnRzLmNvbnRhaW5zKGNvbnN0
YW50KTsKIH0KIAorQ0NhbGxIZWxwZXJzOjpMYWJlbCBQcm9jZWR1cmU6OmVudHJ5cG9pbnRMYWJl
bCh1bnNpZ25lZCBpbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jb2RlLT5lbnRyeXBvaW50
TGFiZWwoaW5kZXgpOworfQorCiB2b2lkKiBQcm9jZWR1cmU6OmFkZERhdGFTZWN0aW9uKHNpemVf
dCBzaXplKQogewogICAgIGlmICghc2l6ZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1Byb2NlZHVyZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1Byb2NlZHVyZS5oCShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNQcm9jZWR1cmUuaAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1
ZGUgIkIzU3BhcnNlQ29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkIzVHlwZS5oIgogI2luY2x1ZGUg
IkIzVmFsdWVLZXkuaCIKKyNpbmNsdWRlICJDQ2FsbEhlbHBlcnMuaCIKICNpbmNsdWRlICJQdXJl
TmFOLmgiCiAjaW5jbHVkZSAiUmVnaXN0ZXJBdE9mZnNldExpc3QuaCIKICNpbmNsdWRlIDx3dGYv
QmFnLmg+CkBAIC01Nyw2ICs1OCwxMyBAQCBjbGFzcyBWYXJpYWJsZTsKIAogbmFtZXNwYWNlIEFp
ciB7IGNsYXNzIENvZGU7IH0KIAorLy8gVGhpcyByZXByZXNlbnRzIEIzJ3MgdmlldyBvZiBhIHBp
ZWNlIG9mIGNvZGUuIE5vdGUgdGhhdCB0aGlzIG9iamVjdCBtdXN0IGV4aXN0IGluIGEgMToxCisv
LyByZWxhdGlvbnNoaXAgd2l0aCBBaXI6OkNvZGUuIEIzOjpQcm9jZWR1cmUgYW5kIEFpcjo6Q29k
ZSBhcmUganVzdCBkaWZmZXJlbnQgZmFjYWRlcyBvZiB0aGUgQjMKKy8vIGNvbXBpbGVyJ3Mga25v
d2xlZGdlIGFib3V0IGEgcGllY2Ugb2YgY29kZS4gU29tZSBraW5kcyBvZiBzdGF0ZSBhcmVuJ3Qg
cGVyZmVjdCBmaXRzIGZvciBlaXRoZXIKKy8vIFByb2NlZHVyZSBvciBDb2RlLCBhbmQgYXJlIHBs
YWNlZCBpbiBvbmUgb3IgdGhlIG90aGVyIGJhc2VkIG9uIGNvbnZlbmllbmNlLiBQcm9jZWR1cmUg
YWx3YXlzCisvLyBhbGxvY2F0ZXMgYSBDb2RlLCBhbmQgYSBDb2RlIGNhbm5vdCBiZSBhbGxvY2F0
ZWQgd2l0aG91dCBhbiBvd25pbmcgUHJvY2VkdXJlIGFuZCB0aGV5IGFsd2F5cworLy8gaGF2ZSBy
ZWZlcmVuY2VzIHRvIGVhY2ggb3RoZXIuCisKIGNsYXNzIFByb2NlZHVyZSB7CiAgICAgV1RGX01B
S0VfTk9OQ09QWUFCTEUoUHJvY2VkdXJlKTsKICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
QEAgLTIwOSw2ICsyMTcsMTQgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGRGYXN0Q29uc3RhbnQo
Y29uc3QgVmFsdWVLZXkmKTsKICAgICBib29sIGlzRmFzdENvbnN0YW50KGNvbnN0IFZhbHVlS2V5
Jik7CisgICAgCisgICAgdW5zaWduZWQgbnVtRW50cnlwb2ludHMoKSBjb25zdCB7IHJldHVybiBt
X251bUVudHJ5cG9pbnRzOyB9CisgICAgdm9pZCBzZXROdW1FbnRyeXBvaW50cyh1bnNpZ25lZCBu
dW1FbnRyeXBvaW50cykgeyBtX251bUVudHJ5cG9pbnRzID0gbnVtRW50cnlwb2ludHM7IH0KKyAg
ICAKKyAgICAvLyBPbmx5IGNhbGwgdGhpcyBhZnRlciBjb2RlIGdlbmVyYXRpb24gaXMgY29tcGxl
dGUuIE5vdGUgdGhhdCB0aGUgbGFiZWwgZm9yIHRoZSAwdGggZW50cnlwb2ludAorICAgIC8vIHNo
b3VsZCBwb2ludCB0byBleGFjdGx5IHdoZXJlIHRoZSBjb2RlIGdlbmVyYXRpb24gY3Vyc29yIHdh
cyBiZWZvcmUgeW91IHN0YXJ0ZWQgZ2VuZXJhdGluZworICAgIC8vIGNvZGUuCisgICAgSlNfRVhQ
T1JUX1BSSVZBVEUgQ0NhbGxIZWxwZXJzOjpMYWJlbCBlbnRyeXBvaW50TGFiZWwodW5zaWduZWQg
ZW50cnlwb2ludEluZGV4KSBjb25zdDsKIAogICAgIC8vIFRoZSBuYW1lIGhhcyB0byBiZSBhIHN0
cmluZyBsaXRlcmFsLCBzaW5jZSB3ZSBkb24ndCBkbyBhbnkgbWVtb3J5IG1hbmFnZW1lbnQgZm9y
IHRoZSBzdHJpbmcuCiAgICAgdm9pZCBzZXRMYXN0UGhhc2VOYW1lKGNvbnN0IGNoYXIqIG5hbWUp
CkBAIC0yNjEsNiArMjc3LDcgQEAgcHJpdmF0ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBt
X2NmZzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RG9taW5hdG9ycz4gbV9kb21pbmF0b3JzOwogICAg
IEhhc2hTZXQ8VmFsdWVLZXk+IG1fZmFzdENvbnN0YW50czsKKyAgICB1bnNpZ25lZCBtX251bUVu
dHJ5cG9pbnRzIHsgMSB9OwogICAgIGNvbnN0IGNoYXIqIG1fbGFzdFBoYXNlTmFtZTsKICAgICBz
dGQ6OnVuaXF1ZV9wdHI8T3BhcXVlQnlwcm9kdWN0cz4gbV9ieXByb2R1Y3RzOwogICAgIHN0ZDo6
dW5pcXVlX3B0cjxBaXI6OkNvZGU+IG1fY29kZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9CM1ZhbGlkYXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNWYWxpZGF0ZS5jcHAJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM1ZhbGlkYXRlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDE0LDcgKzQxNCwxMyBA
QCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGNhc2VW
YWx1ZXMuc2l6ZSgpOyArK2kpCiAgICAgICAgICAgICAgICAgICAgIFZBTElEQVRFKGNhc2VWYWx1
ZXNbaSAtIDFdICE9IGNhc2VWYWx1ZXNbaV0sICgiQXQgIiwgKnZhbHVlLCAiLCBjYXNlVmFsdWUg
PSAiLCBjYXNlVmFsdWVzW2ldKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRW50cnlTd2l0Y2g6CisgICAg
ICAgICAgICAgICAgVkFMSURBVEUoIXZhbHVlLT5udW1DaGlsZHJlbigpLCAoIkF0ICIsICp2YWx1
ZSkpOworICAgICAgICAgICAgICAgIFZBTElEQVRFKHZhbHVlLT50eXBlKCkgPT0gVm9pZCwgKCJB
dCAiLCAqdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBWQUxJREFURSh2YWx1ZU93bmVyLmdldCh2
YWx1ZSktPm51bVN1Y2Nlc3NvcnMoKSA9PSBtX3Byb2NlZHVyZS5udW1FbnRyeXBvaW50cygpLCAo
IkF0ICIsICp2YWx1ZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQog
CiAgICAgICAgICAgICBWQUxJREFURSghKHZhbHVlLT5lZmZlY3RzKCkud3JpdGVzICYmIHZhbHVl
LT5rZXkoKSksICgiQXQgIiwgKnZhbHVlKSk7CiAgICAgICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNWYWx1ZS5jcHAJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9CM1ZhbHVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjEyLDYgKzYxMiw3IEBA
IEVmZmVjdHMgVmFsdWU6OmVmZmVjdHMoKSBjb25zdAogICAgIGNhc2UgU3dpdGNoOgogICAgIGNh
c2UgUmV0dXJuOgogICAgIGNhc2UgT29wczoKKyAgICBjYXNlIEVudHJ5U3dpdGNoOgogICAgICAg
ICByZXN1bHQudGVybWluYWwgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC03OTAs
NiArNzkxLDcgQEAgVHlwZSBWYWx1ZTo6dHlwZUZvcihPcGNvZGUgb3Bjb2RlLCBWYWx1ZQogICAg
IGNhc2UgQnJhbmNoOgogICAgIGNhc2UgUmV0dXJuOgogICAgIGNhc2UgT29wczoKKyAgICBjYXNl
IEVudHJ5U3dpdGNoOgogICAgICAgICByZXR1cm4gVm9pZDsKICAgICBjYXNlIFNlbGVjdDoKICAg
ICAgICAgQVNTRVJUKHNlY29uZENoaWxkKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM1ZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFs
dWUuaAkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFs
dWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjgzLDYgKzI4Myw3IEBAIHByaXZhdGU6CiAgICAgICAg
IGNhc2UgUGhpOgogICAgICAgICBjYXNlIEp1bXA6CiAgICAgICAgIGNhc2UgT29wczoKKyAgICAg
ICAgY2FzZSBFbnRyeVN3aXRjaDoKICAgICAgICAgICAgIGlmIChVTkxJS0VMWShudW1BcmdzKSkK
ICAgICAgICAgICAgICAgICBiYWRPcGNvZGUob3Bjb2RlLCBudW1BcmdzKTsKICAgICAgICAgICAg
IGJyZWFrOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAJKHJldmlzaW9uIDIw
MzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy90ZXN0YjMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiQjNDb25zdDMyVmFsdWUuaCIKICNpbmNs
dWRlICJCM0NvbnN0UHRyVmFsdWUuaCIKICNpbmNsdWRlICJCM0VmZmVjdHMuaCIKKyNpbmNsdWRl
ICJCM0dlbmVyYXRlLmgiCiAjaW5jbHVkZSAiQjNMb3dlclRvQWlyLmgiCiAjaW5jbHVkZSAiQjNN
YXRoRXh0cmFzLmgiCiAjaW5jbHVkZSAiQjNNZW1vcnlWYWx1ZS5oIgpAQCAtMTE2LDEzICsxMTcs
MTkgQEAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uPiBjb21waWxlKFBybwogfQogCiB0ZW1w
bGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+Ci1UIGludm9rZShjb25zdCBD
b21waWxhdGlvbiYgY29kZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK1QgaW52b2tlKE1hY3Jv
QXNzZW1ibGVyQ29kZVB0ciBwdHIsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCiB7Ci0gICAgVCAo
KmZ1bmN0aW9uKShBcmd1bWVudHMuLi4pID0gYml0d2lzZV9jYXN0PFQoKikoQXJndW1lbnRzLi4u
KT4oY29kZS5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKSk7CisgICAgVCAoKmZ1bmN0aW9uKShB
cmd1bWVudHMuLi4pID0gYml0d2lzZV9jYXN0PFQoKikoQXJndW1lbnRzLi4uKT4ocHRyLmV4ZWN1
dGFibGVBZGRyZXNzKCkpOwogICAgIHJldHVybiBmdW5jdGlvbihhcmd1bWVudHMuLi4pOwogfQog
CiB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CitUIGludm9rZShj
b25zdCBDb21waWxhdGlvbiYgY29kZSwgQXJndW1lbnRzLi4uIGFyZ3VtZW50cykKK3sKKyAgICBy
ZXR1cm4gaW52b2tlPFQ+KGNvZGUuY29kZSgpLCBhcmd1bWVudHMuLi4pOworfQorCit0ZW1wbGF0
ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmd1bWVudHM+CiBUIGNvbXBpbGVBbmRSdW4oUHJv
Y2VkdXJlJiBwcm9jZWR1cmUsIEFyZ3VtZW50cy4uLiBhcmd1bWVudHMpCiB7CiAgICAgcmV0dXJu
IGludm9rZTxUPigqY29tcGlsZShwcm9jZWR1cmUpLCBhcmd1bWVudHMuLi4pOwpAQCAtMTI0MDcs
NiArMTI0MTQsMzQzIEBAIHZvaWQgdGVzdFJlc2V0UmVhY2hhYmlsaXR5RGFuZ2xpbmdSZWZlcmUK
ICAgICB2YWxpZGF0ZShwcm9jKTsKIH0KIAordm9pZCB0ZXN0RW50cnlTd2l0Y2hTaW1wbGUoKQor
eworICAgIFByb2NlZHVyZSBwcm9jOworICAgIHByb2Muc2V0TnVtRW50cnlwb2ludHMoMyk7Cisg
ICAgCisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Js
b2NrKiBvbmUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdHdvID0gcHJvYy5h
ZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHRocmVlID0gcHJvYy5hZGRCbG9jaygpOworICAg
IAorICAgIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRW50cnlTd2l0Y2gsIE9yaWdpbigp
KTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJsb2NrKG9uZSkpOworICAg
IHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxvY2sodHdvKSk7CisgICAgcm9vdC0+
YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayh0aHJlZSkpOworICAgIAorICAgIG9uZS0+
YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgcHJvYywgUmV0dXJuLCBPcmlnaW4oKSwKKyAgICAg
ICAgb25lLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgQWRkLCBPcmlnaW4o
KSwKKyAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9y
aWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApLAorICAgICAgICAgICAgb25lLT5hcHBlbmRO
ZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BS
MSkpKTsKKyAgICAKKyAgICB0d28tPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgIHByb2MsIFJl
dHVybiwgT3JpZ2luKCksCisgICAgICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAg
ICAgIHByb2MsIFN1YiwgT3JpZ2luKCksCisgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxBcmd1
bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSwKKyAg
ICAgICAgICAgIHR3by0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigp
LCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSk7CisgICAgCisgICAgdGhyZWUtPmFwcGVuZE5ldzxW
YWx1ZT4oCisgICAgICAgIHByb2MsIFJldHVybiwgT3JpZ2luKCksCisgICAgICAgIHRocmVlLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgcHJvYywgTXVsLCBPcmlnaW4oKSwKKyAgICAg
ICAgICAgIHRocmVlLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCks
IEdQUkluZm86OmFyZ3VtZW50R1BSMCksCisgICAgICAgICAgICB0aHJlZS0+YXBwZW5kTmV3PEFy
Z3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKSk7
CisgICAgCisgICAgcHJlcGFyZUZvckdlbmVyYXRpb24ocHJvYyk7CisgICAgCisgICAgQ0NhbGxI
ZWxwZXJzIGppdCh2bSk7CisgICAgZ2VuZXJhdGUocHJvYywgaml0KTsKKyAgICBMaW5rQnVmZmVy
IGxpbmtCdWZmZXIoKnZtLCBqaXQsIG51bGxwdHIpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxh
YmVsT25lID0gbGlua0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDApKTsK
KyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbFR3byA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihw
cm9jLmVudHJ5cG9pbnRMYWJlbCgxKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxUaHJl
ZSA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgyKSk7CisgICAg
CisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIGNvZGVSZWYgPSBGSU5BTElaRV9DT0RFKGxpbmtC
dWZmZXIsICgidGVzdGIzIGNvbXBpbGF0aW9uIikpOworICAgIAorICAgIENIRUNLKGludm9rZTxp
bnQ+KGxhYmVsT25lLCAxLCAyKSA9PSAzKTsKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJlbFR3
bywgMSwgMikgPT0gLTEpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIp
ID09IDIpOworICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwgMikgPT0gMSk7Cisg
ICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxUd28sIC0xLCAyKSA9PSAtMyk7CisgICAgQ0hFQ0so
aW52b2tlPGludD4obGFiZWxUaHJlZSwgLTEsIDIpID09IC0yKTsKK30KKwordm9pZCB0ZXN0RW50
cnlTd2l0Y2hXaXRoQ29tbW9uUGF0aHMoKQoreworICAgIFByb2NlZHVyZSBwcm9jOworICAgIHBy
b2Muc2V0TnVtRW50cnlwb2ludHMoMyk7CisgICAgCisgICAgQmFzaWNCbG9jayogcm9vdCA9IHBy
b2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiBvbmUgPSBwcm9jLmFkZEJsb2NrKCk7Cisg
ICAgQmFzaWNCbG9jayogdHdvID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHRo
cmVlID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIGVuZCA9IHByb2MuYWRkQmxv
Y2soKTsKKyAgICAKKyAgICByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEVudHJ5U3dpdGNo
LCBPcmlnaW4oKSk7CisgICAgcm9vdC0+YXBwZW5kU3VjY2Vzc29yKEZyZXF1ZW50ZWRCbG9jayhv
bmUpKTsKKyAgICByb290LT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJsb2NrKHR3bykpOwor
ICAgIHJvb3QtPmFwcGVuZFN1Y2Nlc3NvcihGcmVxdWVudGVkQmxvY2sodGhyZWUpKTsKKyAgICAK
KyAgICBVcHNpbG9uVmFsdWUqIHVwc2lsb25PbmUgPSBvbmUtPmFwcGVuZE5ldzxVcHNpbG9uVmFs
dWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4oKSwKKyAgICAgICAgb25lLT5hcHBlbmROZXc8VmFs
dWU+KAorICAgICAgICAgICAgcHJvYywgQWRkLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIG9uZS0+
YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCks
CisgICAgICAgICAgICAgICAgb25lLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywg
T3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCkpLAorICAgICAgICAgICAgb25lLT5hcHBl
bmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAg
ICAgICAgICAgICAgICBvbmUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmln
aW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSkpKTsKKyAgICBvbmUtPmFwcGVuZE5ldzxWYWx1
ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIG9uZS0+c2V0U3VjY2Vzc29ycyhGcmVxdWVu
dGVkQmxvY2soZW5kKSk7CisgICAgCisgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uVHdvID0gdHdv
LT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksCisgICAg
ICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIFN1YiwgT3JpZ2lu
KCksCisgICAgICAgICAgICB0d28tPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAg
cHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAgICAgIHR3by0+YXBwZW5kTmV3PEFy
Z3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApKSwK
KyAgICAgICAgICAgIHR3by0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9j
LCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJndW1l
bnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpKSk7Cisg
ICAgdHdvLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpKTsKKyAgICB0d28t
PnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRlZEJsb2NrKGVuZCkpOworICAgIAorICAgIFVwc2lsb25W
YWx1ZSogdXBzaWxvblRocmVlID0gdGhyZWUtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAg
ICAgICBwcm9jLCBPcmlnaW4oKSwKKyAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxWYWx1ZT4oCisg
ICAgICAgICAgICBwcm9jLCBNdWwsIE9yaWdpbigpLAorICAgICAgICAgICAgdGhyZWUtPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAg
ICAgICAgICAgICAgIHRocmVlLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCkpLAorICAgICAgICAgICAgdGhyZWUtPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAg
ICAgICAgICAgICAgIHRocmVlLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpKSk7CisgICAgdGhyZWUtPmFwcGVuZE5ldzxW
YWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIHRocmVlLT5zZXRTdWNjZXNzb3JzKEZy
ZXF1ZW50ZWRCbG9jayhlbmQpKTsKKyAgICAKKyAgICBWYWx1ZSogcGhpID0gZW5kLT5hcHBlbmRO
ZXc8VmFsdWU+KHByb2MsIFBoaSwgSW50MzIsIE9yaWdpbigpKTsKKyAgICB1cHNpbG9uT25lLT5z
ZXRQaGkocGhpKTsKKyAgICB1cHNpbG9uVHdvLT5zZXRQaGkocGhpKTsKKyAgICB1cHNpbG9uVGhy
ZWUtPnNldFBoaShwaGkpOworICAgIAorICAgIGVuZC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAg
ICAgcHJvYywgUmV0dXJuLCBPcmlnaW4oKSwKKyAgICAgICAgZW5kLT5hcHBlbmROZXc8VmFsdWU+
KAorICAgICAgICAgICAgcHJvYywgQ2hpbGxNb2QsIE9yaWdpbigpLAorICAgICAgICAgICAgcGhp
LCBlbmQtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9y
aWdpbigpLAorICAgICAgICAgICAgICAgIGVuZC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+
KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjIpKSkpOworICAgIAorICAgIHBy
ZXBhcmVGb3JHZW5lcmF0aW9uKHByb2MpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQodm0p
OworICAgIGdlbmVyYXRlKHByb2MsIGppdCk7CisgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2
bSwgaml0LCBudWxscHRyKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbE9uZSA9IGxpbmtC
dWZmZXIubG9jYXRpb25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgwKSk7CisgICAgQ29kZUxvY2F0
aW9uTGFiZWwgbGFiZWxUd28gPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50
TGFiZWwoMSkpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVGhyZWUgPSBsaW5rQnVmZmVy
LmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMikpOworICAgIAorICAgIE1hY3JvQXNz
ZW1ibGVyQ29kZVJlZiBjb2RlUmVmID0gRklOQUxJWkVfQ09ERShsaW5rQnVmZmVyLCAoInRlc3Ri
MyBjb21waWxhdGlvbiIpKTsKKyAgICAKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9u
ZSwgMSwgMiwgMTApLCAzKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgMSwg
MiwgMTApLCAtMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUaHJlZSwgMSwgMiwg
MTApLCAyKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEsIDIsIDEwKSwg
MSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIC0xLCAyLCAxMCksIC0zKTsK
KyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwgMTApLCAtMik7Cisg
ICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxPbmUsIDEsIDIsIDIpLCAxKTsKKyAgICBDSEVD
S19FUShpbnZva2U8aW50PihsYWJlbFR3bywgMSwgMiwgMiksIC0xKTsKKyAgICBDSEVDS19FUShp
bnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAyLCAyKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tl
PGludD4obGFiZWxPbmUsIC0xLCAyLCAyKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4o
bGFiZWxUd28sIC0xLCAyLCAyKSwgLTEpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVs
VGhyZWUsIC0xLCAyLCAyKSwgMCk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxPbmUs
IDEsIDIsIDApLCAwKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgMSwgMiwg
MCksIDApOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIsIDApLCAw
KTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEsIDIsIDApLCAwKTsKKyAg
ICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFR3bywgLTEsIDIsIDApLCAwKTsKKyAgICBDSEVD
S19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwgMCksIDApOworfQorCit2b2lkIHRl
c3RFbnRyeVN3aXRjaFdpdGhDb21tb25QYXRoc0FuZE5vblRyaXZpYWxFbnRyeXBvaW50KCkKK3sK
KyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBwcm9jLnNldE51bUVudHJ5cG9pbnRzKDMpOworICAg
IAorICAgIEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9j
ayogbmVnYXRlID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIGRpc3BhdGNoID0g
cHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIG9uZSA9IHByb2MuYWRkQmxvY2soKTsK
KyAgICBCYXNpY0Jsb2NrKiB0d28gPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayog
dGhyZWUgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZW5kID0gcHJvYy5hZGRC
bG9jaygpOworCisgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uQmFzZSA9IHJvb3QtPmFwcGVuZE5l
dzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4oKSwgcm9vdC0+YXBwZW5kTmV3
PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgICAg
IHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5m
bzo6YXJndW1lbnRHUFIwKSkpOworICAgIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAg
IHByb2MsIEJyYW5jaCwgT3JpZ2luKCksCisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4o
CisgICAgICAgICAgICBwcm9jLCBCaXRBbmQsIE9yaWdpbigpLAorICAgICAgICAgICAgcm9vdC0+
YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1
bWVudEdQUjMpLAorICAgICAgICAgICAgcm9vdC0+YXBwZW5kTmV3PENvbnN0UHRyVmFsdWU+KHBy
b2MsIE9yaWdpbigpLCAweGZmKSkpOworICAgIHJvb3QtPnNldFN1Y2Nlc3NvcnMoRnJlcXVlbnRl
ZEJsb2NrKG5lZ2F0ZSksIEZyZXF1ZW50ZWRCbG9jayhkaXNwYXRjaCkpOworICAgIAorICAgIFVw
c2lsb25WYWx1ZSogdXBzaWxvbk5lZ2F0ZSA9IG5lZ2F0ZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1
ZT4oCisgICAgICAgIHByb2MsIE9yaWdpbigpLAorICAgICAgICBuZWdhdGUtPmFwcGVuZE5ldzxW
YWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBOZWcsIE9yaWdpbigpLAorICAgICAgICAgICAgbmVn
YXRlLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAgICAgICAgIHByb2MsIFRydW5jLCBPcmln
aW4oKSwKKyAgICAgICAgICAgICAgICBuZWdhdGUtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVl
Pihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSkpKTsKKyAgICBuZWdhdGUt
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCkpOworICAgIG5lZ2F0ZS0+c2V0
U3VjY2Vzc29ycyhGcmVxdWVudGVkQmxvY2soZGlzcGF0Y2gpKTsKKyAgICAKKyAgICBWYWx1ZSog
YXJnMCA9IGRpc3BhdGNoLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFBoaSwgSW50MzIsIE9yaWdp
bigpKTsKKyAgICB1cHNpbG9uQmFzZS0+c2V0UGhpKGFyZzApOworICAgIHVwc2lsb25OZWdhdGUt
PnNldFBoaShhcmcwKTsKKyAgICBkaXNwYXRjaC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBFbnRy
eVN3aXRjaCwgT3JpZ2luKCkpOworICAgIGRpc3BhdGNoLT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVl
bnRlZEJsb2NrKG9uZSkpOworICAgIGRpc3BhdGNoLT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRl
ZEJsb2NrKHR3bykpOworICAgIGRpc3BhdGNoLT5hcHBlbmRTdWNjZXNzb3IoRnJlcXVlbnRlZEJs
b2NrKHRocmVlKSk7CisgICAgCisgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uT25lID0gb25lLT5h
cHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksCisgICAgICAg
IG9uZS0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgIHByb2MsIEFkZCwgT3JpZ2luKCks
CisgICAgICAgICAgICBhcmcwLCBvbmUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAg
ICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAgICAgIG9uZS0+YXBwZW5kTmV3
PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEp
KSkpOworICAgIG9uZS0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBKdW1wLCBPcmlnaW4oKSk7Cisg
ICAgb25lLT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9jayhlbmQpKTsKKyAgICAKKyAgICBV
cHNpbG9uVmFsdWUqIHVwc2lsb25Ud28gPSB0d28tPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAor
ICAgICAgICBwcm9jLCBPcmlnaW4oKSwKKyAgICAgICAgdHdvLT5hcHBlbmROZXc8VmFsdWU+KAor
ICAgICAgICAgICAgcHJvYywgU3ViLCBPcmlnaW4oKSwKKyAgICAgICAgICAgIGFyZzAsIHR3by0+
YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCks
CisgICAgICAgICAgICAgICAgdHdvLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywg
T3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpKSk7CisgICAgdHdvLT5hcHBlbmROZXc8
VmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpKTsKKyAgICB0d28tPnNldFN1Y2Nlc3NvcnMoRnJl
cXVlbnRlZEJsb2NrKGVuZCkpOworICAgIAorICAgIFVwc2lsb25WYWx1ZSogdXBzaWxvblRocmVl
ID0gdGhyZWUtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KAorICAgICAgICBwcm9jLCBPcmlnaW4o
KSwKKyAgICAgICAgdGhyZWUtPmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBN
dWwsIE9yaWdpbigpLAorICAgICAgICAgICAgYXJnMCwgdGhyZWUtPmFwcGVuZE5ldzxWYWx1ZT4o
CisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAgICAgICAgICAgICAg
IHRocmVlLT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUklu
Zm86OmFyZ3VtZW50R1BSMSkpKSk7CisgICAgdGhyZWUtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
SnVtcCwgT3JpZ2luKCkpOworICAgIHRocmVlLT5zZXRTdWNjZXNzb3JzKEZyZXF1ZW50ZWRCbG9j
ayhlbmQpKTsKKyAgICAKKyAgICBWYWx1ZSogcGhpID0gZW5kLT5hcHBlbmROZXc8VmFsdWU+KHBy
b2MsIFBoaSwgSW50MzIsIE9yaWdpbigpKTsKKyAgICB1cHNpbG9uT25lLT5zZXRQaGkocGhpKTsK
KyAgICB1cHNpbG9uVHdvLT5zZXRQaGkocGhpKTsKKyAgICB1cHNpbG9uVGhyZWUtPnNldFBoaShw
aGkpOworICAgIAorICAgIGVuZC0+YXBwZW5kTmV3PFZhbHVlPigKKyAgICAgICAgcHJvYywgUmV0
dXJuLCBPcmlnaW4oKSwKKyAgICAgICAgZW5kLT5hcHBlbmROZXc8VmFsdWU+KAorICAgICAgICAg
ICAgcHJvYywgQ2hpbGxNb2QsIE9yaWdpbigpLAorICAgICAgICAgICAgcGhpLCBlbmQtPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICAgICAgcHJvYywgVHJ1bmMsIE9yaWdpbigpLAorICAg
ICAgICAgICAgICAgIGVuZC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdp
bigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjIpKSkpOworICAgIAorICAgIHByZXBhcmVGb3JHZW5l
cmF0aW9uKHByb2MpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQodm0pOworICAgIGdlbmVy
YXRlKHByb2MsIGppdCk7CisgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCp2bSwgaml0LCBudWxs
cHRyKTsKKyAgICBDb2RlTG9jYXRpb25MYWJlbCBsYWJlbE9uZSA9IGxpbmtCdWZmZXIubG9jYXRp
b25PZihwcm9jLmVudHJ5cG9pbnRMYWJlbCgwKSk7CisgICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFi
ZWxUd28gPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJvYy5lbnRyeXBvaW50TGFiZWwoMSkpOwor
ICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVGhyZWUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2Yo
cHJvYy5lbnRyeXBvaW50TGFiZWwoMikpOworICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29kZVJl
ZiBjb2RlUmVmID0gRklOQUxJWkVfQ09ERShsaW5rQnVmZmVyLCAoInRlc3RiMyBjb21waWxhdGlv
biIpKTsKKyAgICAKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgMSwgMiwgMTAs
IGZhbHNlKSwgMyk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFiZWxUd28sIDEsIDIsIDEw
LCBmYWxzZSksIC0xKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAxLCAy
LCAxMCwgZmFsc2UpLCAyKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50PihsYWJlbE9uZSwgLTEs
IDIsIDEwLCBmYWxzZSksIDEpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAt
MSwgMiwgMTAsIGZhbHNlKSwgLTMpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVGhy
ZWUsIC0xLCAyLCAxMCwgZmFsc2UpLCAtMik7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFi
ZWxPbmUsIDEsIDIsIDEwLCB0cnVlKSwgMSk7CisgICAgQ0hFQ0tfRVEoaW52b2tlPGludD4obGFi
ZWxUd28sIDEsIDIsIDEwLCB0cnVlKSwgLTMpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+KGxh
YmVsVGhyZWUsIDEsIDIsIDEwLCB0cnVlKSwgLTIpOworICAgIENIRUNLX0VRKGludm9rZTxpbnQ+
KGxhYmVsT25lLCAtMSwgMiwgMTAsIHRydWUpLCAzKTsKKyAgICBDSEVDS19FUShpbnZva2U8aW50
PihsYWJlbFR3bywgLTEsIDIsIDEwLCB0cnVlKSwgLTEpOworICAgIENIRUNLX0VRKGludm9rZTxp
bnQ+KGxhYmVsVGhyZWUsIC0xLCAyLCAxMCwgdHJ1ZSksIDIpOworICAgIENIRUNLX0VRKGludm9r
ZTxpbnQ+KGxhYmVsT25lLCAxLCAyLCAyLCBmYWxzZSksIDEpOworICAgIENIRUNLX0VRKGludm9r
ZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAyLCBmYWxzZSksIC0xKTsKKyAgICBDSEVDS19FUShpbnZv
a2U8aW50PihsYWJlbFRocmVlLCAxLCAyLCAyLCBmYWxzZSksIDApOworICAgIENIRUNLX0VRKGlu
dm9rZTxpbnQ+KGxhYmVsT25lLCAtMSwgMiwgMiwgZmFsc2UpLCAxKTsKKyAgICBDSEVDS19FUShp
bnZva2U8aW50PihsYWJlbFR3bywgLTEsIDIsIDIsIGZhbHNlKSwgLTEpOworICAgIENIRUNLX0VR
KGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIC0xLCAyLCAyLCBmYWxzZSksIDApOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsT25lLCAxLCAyLCAwLCBmYWxzZSksIDApOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAxLCAyLCAwLCBmYWxzZSksIDApOworICAgIENIRUNL
X0VRKGludm9rZTxpbnQ+KGxhYmVsVGhyZWUsIDEsIDIsIDAsIGZhbHNlKSwgMCk7CisgICAgQ0hF
Q0tfRVEoaW52b2tlPGludD4obGFiZWxPbmUsIC0xLCAyLCAwLCBmYWxzZSksIDApOworICAgIENI
RUNLX0VRKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAtMSwgMiwgMCwgZmFsc2UpLCAwKTsKKyAgICBD
SEVDS19FUShpbnZva2U8aW50PihsYWJlbFRocmVlLCAtMSwgMiwgMCwgZmFsc2UpLCAwKTsKK30K
Kwordm9pZCB0ZXN0RW50cnlTd2l0Y2hMb29wKCkKK3sKKyAgICAvLyBUaGlzIGlzIGEgY29tcGxl
dGVseSBhYnN1cmQgdXNlIG9mIEVudHJ5U3dpdGNoLCB3aGVyZSBpdCBpbXBhY3RzIHRoZSBsb29w
IGNvbmRpdGlvbi4gVGhpcworICAgIC8vIHNob3VsZCBjYXVzZSBkdXBsaWNhdGlvbiBvZiBlaXRo
ZXIgbmVhcmx5IHRoZSBlbnRpcmUgUHJvY2VkdXJlLiBBdCB0aW1lIG9mIHdyaXRpbmcsIHdlIGVu
ZGVkCisgICAgLy8gdXAgZHVwbGljYXRpbmcgYWxsIG9mIGl0LCB3aGljaCBpcyBmaW5lLiBJdCdz
IGltcG9ydGFudCB0byB0ZXN0IHRoaXMgY2FzZSwgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAvLyB0
aGUgZHVwbGljYXRpb24gYWxnb3JpdGhtIGNhbiBoYW5kbGUgaW50ZXJlc3RpbmcgY29udHJvbCBm
bG93LgorICAgIAorICAgIFByb2NlZHVyZSBwcm9jOworICAgIHByb2Muc2V0TnVtRW50cnlwb2lu
dHMoMik7CisgICAgCisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKyAg
ICBCYXNpY0Jsb2NrKiBsb29wSGVhZGVyID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxv
Y2sqIGxvb3BGb290ZXIgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZW5kID0g
cHJvYy5hZGRCbG9jaygpOworCisgICAgVXBzaWxvblZhbHVlKiBpbml0aWFsVmFsdWUgPSByb290
LT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPigKKyAgICAgICAgcHJvYywgT3JpZ2luKCksIHJvb3Qt
PmFwcGVuZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBUcnVuYywgT3JpZ2luKCksCisg
ICAgICAgICAgICByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2lu
KCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCkpKTsKKyAgICByb290LT5hcHBlbmROZXc8VmFsdWU+
KHByb2MsIEp1bXAsIE9yaWdpbigpKTsKKyAgICByb290LT5zZXRTdWNjZXNzb3JzKGxvb3BIZWFk
ZXIpOworICAgIAorICAgIFZhbHVlKiB2YWx1ZUluTG9vcCA9IGxvb3BIZWFkZXItPmFwcGVuZE5l
dzxWYWx1ZT4ocHJvYywgUGhpLCBJbnQzMiwgT3JpZ2luKCkpOworICAgIGluaXRpYWxWYWx1ZS0+
c2V0UGhpKHZhbHVlSW5Mb29wKTsKKyAgICBWYWx1ZSogbmV3VmFsdWUgPSBsb29wSGVhZGVyLT5h
cHBlbmROZXc8VmFsdWU+KAorICAgICAgICBwcm9jLCBBZGQsIE9yaWdpbigpLCB2YWx1ZUluTG9v
cCwKKyAgICAgICAgbG9vcEhlYWRlci0+YXBwZW5kTmV3PENvbnN0MzJWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIDEpKTsKKyAgICBsb29wSGVhZGVyLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEVudHJ5
U3dpdGNoLCBPcmlnaW4oKSk7CisgICAgbG9vcEhlYWRlci0+YXBwZW5kU3VjY2Vzc29yKGVuZCk7
CisgICAgbG9vcEhlYWRlci0+YXBwZW5kU3VjY2Vzc29yKGxvb3BGb290ZXIpOworICAgIAorICAg
IGxvb3BGb290ZXItPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBuZXdW
YWx1ZSwgdmFsdWVJbkxvb3ApOworICAgIGxvb3BGb290ZXItPmFwcGVuZE5ldzxWYWx1ZT4oCisg
ICAgICAgIHByb2MsIEJyYW5jaCwgT3JpZ2luKCksCisgICAgICAgIGxvb3BGb290ZXItPmFwcGVu
ZE5ldzxWYWx1ZT4oCisgICAgICAgICAgICBwcm9jLCBMZXNzVGhhbiwgT3JpZ2luKCksIG5ld1Zh
bHVlLAorICAgICAgICAgICAgbG9vcEZvb3Rlci0+YXBwZW5kTmV3PENvbnN0MzJWYWx1ZT4ocHJv
YywgT3JpZ2luKCksIDEwMCkpKTsKKyAgICBsb29wRm9vdGVyLT5zZXRTdWNjZXNzb3JzKGxvb3BI
ZWFkZXIsIGVuZCk7CisgICAgCisgICAgZW5kLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFJldHVy
biwgT3JpZ2luKCksIG5ld1ZhbHVlKTsKKyAgICAKKyAgICBwcmVwYXJlRm9yR2VuZXJhdGlvbihw
cm9jKTsKKyAgICAKKyAgICBDQ2FsbEhlbHBlcnMgaml0KHZtKTsKKyAgICBnZW5lcmF0ZShwcm9j
LCBqaXQpOworICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcigqdm0sIGppdCwgbnVsbHB0cik7Cisg
ICAgQ29kZUxvY2F0aW9uTGFiZWwgbGFiZWxPbmUgPSBsaW5rQnVmZmVyLmxvY2F0aW9uT2YocHJv
Yy5lbnRyeXBvaW50TGFiZWwoMCkpOworICAgIENvZGVMb2NhdGlvbkxhYmVsIGxhYmVsVHdvID0g
bGlua0J1ZmZlci5sb2NhdGlvbk9mKHByb2MuZW50cnlwb2ludExhYmVsKDEpKTsKKyAgICAKKyAg
ICBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgY29kZVJlZiA9IEZJTkFMSVpFX0NPREUobGlua0J1ZmZl
ciwgKCJ0ZXN0YjMgY29tcGlsYXRpb24iKSk7CisKKyAgICBDSEVDSyhpbnZva2U8aW50PihsYWJl
bE9uZSwgMCkgPT0gMSk7CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxPbmUsIDQyKSA9PSA0
Myk7CisgICAgQ0hFQ0soaW52b2tlPGludD4obGFiZWxPbmUsIDEwMDApID09IDEwMDEpOworICAg
IAorICAgIENIRUNLKGludm9rZTxpbnQ+KGxhYmVsVHdvLCAwKSA9PSAxMDApOworICAgIENIRUNL
KGludm9rZTxpbnQ+KGxhYmVsVHdvLCA0MikgPT0gMTAwKTsKKyAgICBDSEVDSyhpbnZva2U8aW50
PihsYWJlbFR3bywgMTAwMCkgPT0gMTAwMSk7Cit9CisKIHZvaWQgdGVzdFNvbWVFYXJseVJlZ2lz
dGVyKCkKIHsKICAgICBhdXRvIHJ1biA9IFsmXSAoYm9vbCBzdWNjZWVkKSB7CkBAIC0xMjUwMyw4
ICsxMjg0Nyw2IEBAIGRvdWJsZSBuZWdhdGl2ZVplcm8oKQogICAgIHJldHVybiAtemVybygpOwog
fQogCi0KLQogI2RlZmluZSBSVU4odGVzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAg
XAogICAgICAgICBpZiAoIXNob3VsZFJ1bigjdGVzdCkpICAgICAgICAgICAgICAgICAgXAogICAg
ICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTM4OTgs
NiArMTQyNDAsMTIgQEAgdm9pZCBydW4oY29uc3QgY2hhciogZmlsdGVyKQogICAgIFJVTih0ZXN0
SW50ZXJwcmV0ZXIoKSk7CiAgICAgUlVOKHRlc3RSZWR1Y2VTdHJlbmd0aENoZWNrQm90dG9tVXNl
SW5Bbm90aGVyQmxvY2soKSk7CiAgICAgUlVOKHRlc3RSZXNldFJlYWNoYWJpbGl0eURhbmdsaW5n
UmVmZXJlbmNlKCkpOworICAgIAorICAgIFJVTih0ZXN0RW50cnlTd2l0Y2hTaW1wbGUoKSk7Cisg
ICAgUlVOKHRlc3RFbnRyeVN3aXRjaFdpdGhDb21tb25QYXRocygpKTsKKyAgICBSVU4odGVzdEVu
dHJ5U3dpdGNoV2l0aENvbW1vblBhdGhzQW5kTm9uVHJpdmlhbEVudHJ5cG9pbnQoKSk7CisgICAg
UlVOKHRlc3RFbnRyeVN3aXRjaExvb3AoKSk7CisKICAgICBSVU4odGVzdFNvbWVFYXJseVJlZ2lz
dGVyKCkpOwogICAgIAogICAgIFJVTih0ZXN0QnJhbmNoQml0QW5kSW1tRnVzaW9uKElkZW50aXR5
LCBJbnQ2NCwgMSwgQWlyOjpCcmFuY2hUZXN0MzIsIEFpcjo6QXJnOjpUbXApKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkocmV2aXNpb24gMjAzNjY2KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIkIzQmFzaWNCbG9ja1V0aWxzLmgiCiAjaW5j
bHVkZSAiQjNQcm9jZWR1cmUuaCIKICNpbmNsdWRlICJCM1N0YWNrU2xvdC5oIgorI2luY2x1ZGUg
PHd0Zi9MaXN0RHVtcC5oPgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNw
YWNlIEFpciB7CiAKQEAgLTc5LDE4ICs4MCwzOCBAQCBDQ2FsbFNwZWNpYWwqIENvZGU6OmNDYWxs
U3BlY2lhbCgpCiAgICAgcmV0dXJuIG1fY0NhbGxTcGVjaWFsOwogfQogCitib29sIENvZGU6Omlz
RW50cnlwb2ludChCYXNpY0Jsb2NrKiBibG9jaykgY29uc3QKK3sKKyAgICBpZiAobV9lbnRyeXBv
aW50cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAhYmxvY2stPmluZGV4KCk7CisgICAgCisg
ICAgZm9yIChjb25zdCBGcmVxdWVudGVkQmxvY2smIGVudHJ5cG9pbnQgOiBtX2VudHJ5cG9pbnRz
KSB7CisgICAgICAgIGlmIChlbnRyeXBvaW50LmJsb2NrKCkgPT0gYmxvY2spCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIENvZGU6
OnJlc2V0UmVhY2hhYmlsaXR5KCkKIHsKLSAgICByZWNvbXB1dGVQcmVkZWNlc3NvcnMobV9ibG9j
a3MpOworICAgIGNsZWFyUHJlZGVjZXNzb3JzKG1fYmxvY2tzKTsKKyAgICBpZiAobV9lbnRyeXBv
aW50cy5pc0VtcHR5KCkpCisgICAgICAgIHVwZGF0ZVByZWRlY2Vzc29yc0FmdGVyKG1fYmxvY2tz
WzBdLmdldCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChjb25zdCBGcmVxdWVudGVkQmxv
Y2smIGVudHJ5cG9pbnQgOiBtX2VudHJ5cG9pbnRzKQorICAgICAgICAgICAgdXBkYXRlUHJlZGVj
ZXNzb3JzQWZ0ZXIoZW50cnlwb2ludC5ibG9jaygpKTsKKyAgICB9CiAgICAgCiAgICAgZm9yIChh
dXRvJiBibG9jayA6IG1fYmxvY2tzKSB7Ci0gICAgICAgIGlmIChpc0Jsb2NrRGVhZChibG9jay5n
ZXQoKSkpCisgICAgICAgIGlmIChpc0Jsb2NrRGVhZChibG9jay5nZXQoKSkgJiYgIWlzRW50cnlw
b2ludChibG9jay5nZXQoKSkpCiAgICAgICAgICAgICBibG9jayA9IG51bGxwdHI7CiAgICAgfQog
fQogCiB2b2lkIENvZGU6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKIHsKKyAgICBpZiAo
IW1fZW50cnlwb2ludHMuaXNFbXB0eSgpKQorICAgICAgICBvdXQucHJpbnQoIkVudHJ5cG9pbnRz
OiAiLCBsaXN0RHVtcChtX2VudHJ5cG9pbnRzKSwgIlxuIik7CiAgICAgZm9yIChCYXNpY0Jsb2Nr
KiBibG9jayA6ICp0aGlzKQogICAgICAgICBvdXQucHJpbnQoZGVlcER1bXAoYmxvY2spKTsKICAg
ICBpZiAoc3RhY2tTbG90cygpLnNpemUoKSkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJDb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJDb2RlLmgJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5j
bHVkZSAiQWlyVG1wLmgiCiAjaW5jbHVkZSAiQjNJbmRleE1hcC5oIgogI2luY2x1ZGUgIkIzU3Bh
cnNlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlJl
Z2lzdGVyQXRPZmZzZXRMaXN0LmgiCiAjaW5jbHVkZSAiU3RhY2tBbGlnbm1lbnQuaCIKIApAQCAt
MTE5LDYgKzEyMCwzMiBAQCBwdWJsaWM6CiAgICAgICAgIG1fZnJhbWVTaXplID0gZnJhbWVTaXpl
OwogICAgIH0KIAorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBh
cyBwcm9jKCkubnVtRW50cnlwb2ludHMoKS4gVGhpcyB2YWx1ZSBoZXJlIG1heSBiZSB6ZXJvCisg
ICAgLy8gdW50aWwgd2UgbG93ZXIgRW50cnlTd2l0Y2guCisgICAgdW5zaWduZWQgbnVtRW50cnlw
b2ludHMoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5cG9pbnRzLnNpemUoKTsgfQorICAgIGNvbnN0
IFZlY3RvcjxGcmVxdWVudGVkQmxvY2s+JiBlbnRyeXBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1f
ZW50cnlwb2ludHM7IH0KKyAgICBjb25zdCBGcmVxdWVudGVkQmxvY2smIGVudHJ5cG9pbnQodW5z
aWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZW50cnlwb2ludHNbaW5kZXhdOyB9CisgICAg
Ym9vbCBpc0VudHJ5cG9pbnQoQmFzaWNCbG9jayopIGNvbnN0OworICAgIAorICAgIC8vIFRoaXMg
aXMgdXNlZCBieSBsb3dlckVudHJ5U3dpdGNoKCkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmVj
dG9yPgorICAgIHZvaWQgc2V0RW50cnlwb2ludHMoVmVjdG9yJiYgdmVjdG9yKQorICAgIHsKKyAg
ICAgICAgbV9lbnRyeXBvaW50cyA9IHN0ZDo6Zm9yd2FyZDxWZWN0b3I+KHZlY3Rvcik7CisgICAg
fQorICAgIAorICAgIENDYWxsSGVscGVyczo6TGFiZWwgZW50cnlwb2ludExhYmVsKHVuc2lnbmVk
IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZW50cnlwb2ludExhYmVsc1tp
bmRleF07CisgICAgfQorICAgIAorICAgIC8vIFRoaXMgaXMgdXNlZCBieSBnZW5lcmF0ZSgpLgor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KKyAgICB2b2lkIHNldEVudHJ5cG9pbnRMYWJl
bHMoVmVjdG9yJiYgdmVjdG9yKQorICAgIHsKKyAgICAgICAgbV9lbnRyeXBvaW50TGFiZWxzID0g
c3RkOjpmb3J3YXJkPFZlY3Rvcj4odmVjdG9yKTsKKyAgICB9CisKICAgICBjb25zdCBSZWdpc3Rl
ckF0T2Zmc2V0TGlzdCYgY2FsbGVlU2F2ZVJlZ2lzdGVycygpIGNvbnN0IHsgcmV0dXJuIG1fY2Fs
bGVlU2F2ZVJlZ2lzdGVyczsgfQogICAgIFJlZ2lzdGVyQXRPZmZzZXRMaXN0JiBjYWxsZWVTYXZl
UmVnaXN0ZXJzKCkgeyByZXR1cm4gbV9jYWxsZWVTYXZlUmVnaXN0ZXJzOyB9CiAKQEAgLTIzNSw2
ICsyNjIsOCBAQCBwcml2YXRlOgogICAgIHVuc2lnbmVkIG1fZnJhbWVTaXplIHsgMCB9OwogICAg
IHVuc2lnbmVkIG1fY2FsbEFyZ0FyZWFTaXplIHsgMCB9OwogICAgIFJlZ2lzdGVyQXRPZmZzZXRM
aXN0IG1fY2FsbGVlU2F2ZVJlZ2lzdGVyczsKKyAgICBWZWN0b3I8RnJlcXVlbnRlZEJsb2NrPiBt
X2VudHJ5cG9pbnRzOyAvLyBUaGlzIGlzIGVtcHR5IHVudGlsIGFmdGVyIGxvd2VyRW50cnlTd2l0
Y2goKS4KKyAgICBWZWN0b3I8Q0NhbGxIZWxwZXJzOjpMYWJlbD4gbV9lbnRyeXBvaW50TGFiZWxz
OyAvLyBUaGlzIGlzIGVtcHR5IHVudGlsIGNvZGUgZ2VuZXJhdGlvbi4KICAgICBjb25zdCBjaGFy
KiBtX2xhc3RQaGFzZU5hbWU7CiB9OwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMv
YWlyL0FpckN1c3RvbS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyQ3VzdG9tLmgJKHJldmlzaW9uIDIwMzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyQ3VzdG9tLmgJKHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkwLDExIEBAIHN0
cnVjdCBQYXRjaEN1c3RvbSB7CiAgICAgICAgIHJldHVybiBpbnN0LmFyZ3NbMF0uc3BlY2lhbCgp
LT5pc1Rlcm1pbmFsKGluc3QpOwogICAgIH0KIAorICAgIHN0YXRpYyBib29sIGhhc05vbkFyZ0Vm
ZmVjdHMoSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnN0LmFyZ3NbMF0uc3Bl
Y2lhbCgpLT5oYXNOb25BcmdFZmZlY3RzKGluc3QpOworICAgIH0KKwogICAgIHN0YXRpYyBib29s
IGhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKEluc3QmIGluc3QpCiAgICAgewogICAgICAgICBy
ZXR1cm4gaW5zdC5hcmdzWzBdLnNwZWNpYWwoKS0+aGFzTm9uQXJnTm9uQ29udHJvbEVmZmVjdHMo
aW5zdCk7CkBAIC0xMDIsMTAgKzEwNywxOCBAQCBzdHJ1Y3QgUGF0Y2hDdXN0b20gewogICAgIH0K
IH07CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFN1YnR5cGU+CitzdHJ1Y3QgQ29tbW9uQ3VzdG9tQmFz
ZSB7CisgICAgc3RhdGljIGJvb2wgaGFzTm9uQXJnRWZmZWN0cyhJbnN0JiBpbnN0KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIFN1YnR5cGU6OmlzVGVybWluYWwoaW5zdCkgfHwgU3VidHlwZTo6aGFz
Tm9uQXJnTm9uQ29udHJvbEVmZmVjdHMoaW5zdCk7CisgICAgfQorfTsKKwogLy8gRGVmaW5pdGlv
biBvZiBDQ2FsbCBpbnN0cnVjdGlvbi4gQ0NhbGwgaXMgdXNlZCBmb3IgaG90IHBhdGggQyBmdW5j
dGlvbiBjYWxscy4gSXQncyBsb3dlcmVkIHRvIGEKIC8vIFBhdGNoIHdpdGggYW4gQWlyIENDYWxs
U3BlY2lhbCBhbG9uZyB3aXRoIGNvZGUgdG8gbWFyc2hhbCBpbnN0cnVjdGlvbnMuIFRoZSBsb3dl
cmluZyBoYXBwZW5zCiAvLyBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28gdGhhdCB0aGUg
cmVnaXN0ZXIgYWxsb2NhdG9yIHNlZXMgdGhlIGNsb2JiZXJzLgotc3RydWN0IENDYWxsQ3VzdG9t
IHsKK3N0cnVjdCBDQ2FsbEN1c3RvbSA6IHB1YmxpYyBDb21tb25DdXN0b21CYXNlPENDYWxsQ3Vz
dG9tPiB7CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KICAgICBzdGF0aWMgdm9pZCBm
b3JFYWNoQXJnKEluc3QmIGluc3QsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCiAgICAgewpAQCAt
MTcxLDcgKzE4NCw3IEBAIHN0cnVjdCBDb2xkQ0NhbGxDdXN0b20gOiBDQ2FsbEN1c3RvbSB7CiAg
ICAgfQogfTsKIAotc3RydWN0IFNodWZmbGVDdXN0b20geworc3RydWN0IFNodWZmbGVDdXN0b20g
OiBwdWJsaWMgQ29tbW9uQ3VzdG9tQmFzZTxTaHVmZmxlQ3VzdG9tPiB7CiAgICAgdGVtcGxhdGU8
dHlwZW5hbWUgRnVuY3Rvcj4KICAgICBzdGF0aWMgdm9pZCBmb3JFYWNoQXJnKEluc3QmIGluc3Qs
IGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCiAgICAgewpAQCAtMjIwLDYgKzIzMyw0NyBAQCBzdHJ1
Y3QgU2h1ZmZsZUN1c3RvbSB7CiAgICAgc3RhdGljIENDYWxsSGVscGVyczo6SnVtcCBnZW5lcmF0
ZShJbnN0JiwgQ0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKIH07CiAKK3N0cnVj
dCBFbnRyeVN3aXRjaEN1c3RvbSA6IHB1YmxpYyBDb21tb25DdXN0b21CYXNlPEVudHJ5U3dpdGNo
Q3VzdG9tPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICBzdGF0aWMgdm9pZCBm
b3JFYWNoQXJnKEluc3QmLCBjb25zdCBGdW5jJikKKyAgICB7CisgICAgfQorICAgIAorICAgIHRl
bXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRm9y
bVN0YXRpYyhBcmd1bWVudHMuLi4pCisgICAgeworICAgICAgICByZXR1cm4gIXNpemVvZi4uLihB
cmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRm9ybShJbnN0
JiBpbnN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc3QuYXJncy5pc0VtcHR5KCk7CisgICAg
fQorICAgIAorICAgIHN0YXRpYyBib29sIGFkbWl0c1N0YWNrKEluc3QmLCB1bnNpZ25lZCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIGJvb2wg
aXNUZXJtaW5hbChJbnN0JikKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICAKKyAgICBzdGF0aWMgYm9vbCBoYXNOb25BcmdOb25Db250cm9sRWZmZWN0cyhJbnN0JikKKyAg
ICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ0NhbGxIZWxw
ZXJzOjpKdW1wIGdlbmVyYXRlKEluc3QmLCBDQ2FsbEhlbHBlcnMmLCBHZW5lcmF0aW9uQ29udGV4
dCYpCisgICAgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkIGJlY2F1
c2Ugd2Ugc2hvdWxkIGhhdmUgbG93ZXJlZCBFbnRyeVN3aXRjaCBiZWZvcmUKKyAgICAgICAgLy8g
Z2VuZXJhdGlvbi4KKyAgICAgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7CisgICAgICAg
IHJldHVybiBDQ2FsbEhlbHBlcnM6Okp1bXAoKTsKKyAgICB9Cit9OworCiB9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCiAKICNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJldmlzaW9uIDIw
MzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCIKICNpbmNsdWRlICJBaXJMb2dSZWdpc3RlclByZXNzdXJlLmgiCiAj
aW5jbHVkZSAiQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmgiCisjaW5jbHVkZSAiQWlyTG93ZXJFbnRy
eVN3aXRjaC5oIgogI2luY2x1ZGUgIkFpckxvd2VyTWFjcm9zLmgiCiAjaW5jbHVkZSAiQWlyT3Bj
b2RlVXRpbHMuaCIKICNpbmNsdWRlICJBaXJPcHRpbWl6ZUJsb2NrT3JkZXIuaCIKQEAgLTEyNywx
MCArMTI4LDYgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBjb2RlKQogICAgIC8v
IHBoYXNlLgogICAgIHNpbXBsaWZ5Q0ZHKGNvZGUpOwogCi0gICAgLy8gVGhpcyBzb3J0cyB0aGUg
YmFzaWMgYmxvY2tzIGluIENvZGUgdG8gYWNoaWV2ZSBhbiBvcmRlcmluZyB0aGF0IG1heGltaXpl
cyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgaGlnaAotICAgIC8vIGZyZXF1ZW5jeSBzdWNjZXNzb3Ig
aXMgYWxzbyB0aGUgZmFsbC10aHJvdWdoIHRhcmdldC4KLSAgICBvcHRpbWl6ZUJsb2NrT3JkZXIo
Y29kZSk7Ci0KICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzYXRpc2Z5IGEgcmVxdWlyZW1lbnQg
b2YgQjM6OlN0YWNrbWFwVmFsdWUuCiAgICAgcmVwb3J0VXNlZFJlZ2lzdGVycyhjb2RlKTsKIApA
QCAtMTM5LDYgKzEzNiwxNiBAQCB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKENvZGUmIGNvZGUp
CiAgICAgLy8gdXNlLiBXZSBfbXVzdF8gcnVuIHRoaXMgYWZ0ZXIgcmVwb3J0VXNlZFJlZ2lzdGVy
cygpLCBzaW5jZSB0aGF0IGtpbGxzIHZhcmlhYmxlIGFzc2lnbm1lbnRzCiAgICAgLy8gdGhhdCBz
ZWVtIGRlYWQuIEx1Y2tpbHksIHRoaXMgcGhhc2UgZG9lcyBub3QgY2hhbmdlIHJlZ2lzdGVyIGxp
dmVuZXNzLCBzbyB0aGF0J3MgT0suCiAgICAgZml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzKGNvZGUp
OworICAgIAorICAgIC8vIEFjdHVhbGx5IGNyZWF0ZSBlbnRyeXBvaW50cy4KKyAgICBsb3dlckVu
dHJ5U3dpdGNoKGNvZGUpOworICAgIAorICAgIC8vIFRoZSBjb250cm9sIGZsb3cgZ3JhcGggY2Fu
IGJlIHNpbXBsaWZpZWQgZnVydGhlciBhZnRlciB3ZSBoYXZlIGxvd2VyZWQgRW50cnlTd2l0Y2gu
CisgICAgc2ltcGxpZnlDRkcoY29kZSk7CisKKyAgICAvLyBUaGlzIHNvcnRzIHRoZSBiYXNpYyBi
bG9ja3MgaW4gQ29kZSB0byBhY2hpZXZlIGFuIG9yZGVyaW5nIHRoYXQgbWF4aW1pemVzIHRoZSBs
aWtlbGlob29kIHRoYXQgYSBoaWdoCisgICAgLy8gZnJlcXVlbmN5IHN1Y2Nlc3NvciBpcyBhbHNv
IHRoZSBmYWxsLXRocm91Z2ggdGFyZ2V0LgorICAgIG9wdGltaXplQmxvY2tPcmRlcihjb2RlKTsK
IAogICAgIGlmIChzaG91bGRWYWxpZGF0ZUlSKCkpCiAgICAgICAgIHZhbGlkYXRlKGNvZGUpOwpA
QCAtMTU3LDIyICsxNjQsMTEgQEAgdm9pZCBnZW5lcmF0ZShDb2RlJiBjb2RlLCBDQ2FsbEhlbHBl
cnMmIAogCiAgICAgRGlzYWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGRpc2FsbG93U2Ny
YXRjaChqaXQpOwogCi0gICAgLy8gQW5kIG5vdywgd2UgZ2VuZXJhdGUgY29kZS4KLSAgICBqaXQu
ZW1pdEZ1bmN0aW9uUHJvbG9ndWUoKTsKLSAgICBpZiAoY29kZS5mcmFtZVNpemUoKSkKLSAgICAg
ICAgaml0LmFkZFB0cihDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtY29kZS5mcmFtZVNpemUo
KSksIE1hY3JvQXNzZW1ibGVyOjpzdGFja1BvaW50ZXJSZWdpc3Rlcik7Ci0KICAgICBhdXRvIGFy
Z0ZvciA9IFsmXSAoY29uc3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkpIC0+IENDYWxsSGVscGVy
czo6QWRkcmVzcyB7CiAgICAgICAgIHJldHVybiBDQ2FsbEhlbHBlcnM6OkFkZHJlc3MoR1BSSW5m
bzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIGVudHJ5Lm9mZnNldCgpKTsKICAgICB9OwogICAgIAotICAg
IGZvciAoY29uc3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkgOiBjb2RlLmNhbGxlZVNhdmVSZWdp
c3RlcnMoKSkgewotICAgICAgICBpZiAoZW50cnkucmVnKCkuaXNHUFIoKSkKLSAgICAgICAgICAg
IGppdC5zdG9yZVB0cihlbnRyeS5yZWcoKS5ncHIoKSwgYXJnRm9yKGVudHJ5KSk7Ci0gICAgICAg
IGVsc2UKLSAgICAgICAgICAgIGppdC5zdG9yZURvdWJsZShlbnRyeS5yZWcoKS5mcHIoKSwgYXJn
Rm9yKGVudHJ5KSk7Ci0gICAgfQotCisgICAgLy8gQW5kIG5vdywgd2UgZ2VuZXJhdGUgY29kZS4K
ICAgICBHZW5lcmF0aW9uQ29udGV4dCBjb250ZXh0OwogICAgIGNvbnRleHQuY29kZSA9ICZjb2Rl
OwogICAgIGNvbnRleHQuYmxvY2tMYWJlbHMucmVzaXplKGNvZGUuc2l6ZSgpKTsKQEAgLTIwNiw2
ICsyMDIsMjAgQEAgdm9pZCBnZW5lcmF0ZShDb2RlJiBjb2RlLCBDQ2FsbEhlbHBlcnMmIAogICAg
ICAgICBibG9ja0p1bXBzW2Jsb2NrXS5saW5rKCZqaXQpOwogICAgICAgICBDQ2FsbEhlbHBlcnM6
OkxhYmVsIGxhYmVsID0gaml0LmxhYmVsKCk7CiAgICAgICAgICpjb250ZXh0LmJsb2NrTGFiZWxz
W2Jsb2NrXSA9IGxhYmVsOworCisgICAgICAgIGlmIChjb2RlLmlzRW50cnlwb2ludChibG9jaykp
IHsKKyAgICAgICAgICAgIGppdC5lbWl0RnVuY3Rpb25Qcm9sb2d1ZSgpOworICAgICAgICAgICAg
aWYgKGNvZGUuZnJhbWVTaXplKCkpCisgICAgICAgICAgICAgICAgaml0LmFkZFB0cihDQ2FsbEhl
bHBlcnM6OlRydXN0ZWRJbW0zMigtY29kZS5mcmFtZVNpemUoKSksIE1hY3JvQXNzZW1ibGVyOjpz
dGFja1BvaW50ZXJSZWdpc3Rlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoY29u
c3QgUmVnaXN0ZXJBdE9mZnNldCYgZW50cnkgOiBjb2RlLmNhbGxlZVNhdmVSZWdpc3RlcnMoKSkg
eworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5yZWcoKS5pc0dQUigpKQorICAgICAgICAgICAg
ICAgICAgICBqaXQuc3RvcmVQdHIoZW50cnkucmVnKCkuZ3ByKCksIGFyZ0ZvcihlbnRyeSkpOwor
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaml0LnN0b3JlRG91Ymxl
KGVudHJ5LnJlZygpLmZwcigpLCBhcmdGb3IoZW50cnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICAKICAgICAgICAgQVNTRVJUKGJsb2NrLT5zaXplKCkgPj0gMSk7CiAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBibG9jay0+c2l6ZSgpIC0gMTsgKytpKSB7CiAg
ICAgICAgICAgICBjb250ZXh0LmluZGV4SW5CbG9jayA9IGk7CkBAIC0yNjQsNiArMjc0LDExIEBA
IHZvaWQgZ2VuZXJhdGUoQ29kZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiAKICAgICAKICAgICBjb250
ZXh0LmN1cnJlbnRCbG9jayA9IG51bGxwdHI7CiAgICAgY29udGV4dC5pbmRleEluQmxvY2sgPSBV
SU5UX01BWDsKKyAgICAKKyAgICBWZWN0b3I8Q0NhbGxIZWxwZXJzOjpMYWJlbD4gZW50cnlwb2lu
dExhYmVscyhjb2RlLm51bUVudHJ5cG9pbnRzKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IGNv
ZGUubnVtRW50cnlwb2ludHMoKTsgaS0tOykKKyAgICAgICAgZW50cnlwb2ludExhYmVsc1tpXSA9
ICpjb250ZXh0LmJsb2NrTGFiZWxzW2NvZGUuZW50cnlwb2ludChpKS5ibG9jaygpXTsKKyAgICBj
b2RlLnNldEVudHJ5cG9pbnRMYWJlbHMoV1RGTW92ZShlbnRyeXBvaW50TGFiZWxzKSk7CiAKICAg
ICBwY1RvT3JpZ2luTWFwLmFwcGVuZEl0ZW0oaml0LmxhYmVsKCksIE9yaWdpbigpKTsKICAgICAv
LyBGSVhNRTogTWFrZSBsYXRlIHBhdGhzIGhhdmUgT3JpZ2luczogaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzY4OQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJMb3dlckVudHJ5U3dpdGNoLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpckxvd2VyRW50cnlTd2l0Y2guY3BwCShub25leGlzdGVudCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFp
ckxvd2VyRW50cnlTd2l0Y2guaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisKKyNpbmNsdWRlICJB
aXJCbG9ja1dvcmtsaXN0LmgiCisjaW5jbHVkZSAiQWlyQ29kZS5oIgorI2luY2x1ZGUgIkFpcklu
c3RJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5oIgorI2luY2x1ZGUgIkIzUHJv
Y2VkdXJlLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKKwordm9pZCBsb3dlckVudHJ5U3dpdGNoKENvZGUmIGNvZGUpCit7CisgICAgUGhhc2VTY29w
ZSBwaGFzZVNjb3BlKGNvZGUsICJsb3dlckVudHJ5U3dpdGNoIik7CisgICAgCisgICAgLy8gRmln
dXJlIG91dCB0aGUgc2V0IG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBkdXBsaWNhdGVkLgorICAg
IEJsb2NrV29ya2xpc3Qgd29ya2xpc3Q7CisgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNv
ZGUpIHsKKyAgICAgICAgaWYgKGJsb2NrLT5sYXN0KCkub3Bjb2RlID09IEVudHJ5U3dpdGNoKQor
ICAgICAgICAgICAgd29ya2xpc3QucHVzaChibG9jayk7CisgICAgfQorICAgIAorICAgIC8vIEl0
J3MgcG9zc2libGUgdGhhdCB3ZSBkb24ndCBoYXZlIGFueSBFbnRyeVN3aXRjaGVzLiBUaGF0J3Mg
ZmluZS4KKyAgICBpZiAod29ya2xpc3Quc2VlbigpLmlzRW1wdHkoKSkgeworICAgICAgICBWZWN0
b3I8RnJlcXVlbnRlZEJsb2NrPiBlbnRyeXBvaW50cyhjb2RlLnByb2MoKS5udW1FbnRyeXBvaW50
cygpLCBGcmVxdWVudGVkQmxvY2soY29kZVswXSkpOworICAgICAgICBjb2RlLnNldEVudHJ5cG9p
bnRzKFdURk1vdmUoZW50cnlwb2ludHMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAK
KyAgICB3aGlsZSAoQmFzaWNCbG9jayogYmxvY2sgPSB3b3JrbGlzdC5wb3AoKSkKKyAgICAgICAg
d29ya2xpc3QucHVzaEFsbChibG9jay0+cHJlZGVjZXNzb3JzKCkpOworICAgIAorICAgIFJFTEVB
U0VfQVNTRVJUKHdvcmtsaXN0LnNhdyhjb2RlWzBdKSk7CisgICAgCisgICAgVmVjdG9yPEZyZXF1
ZW5jeUNsYXNzPiBlbnRyeXBvaW50RnJlcXVlbmNpZXMoY29kZS5wcm9jKCkubnVtRW50cnlwb2lu
dHMoKSwgRnJlcXVlbmN5Q2xhc3M6OlJhcmUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBjb2RlKSB7CisgICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSAhPSBFbnRyeVN3aXRj
aCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGVudHJ5cG9p
bnRJbmRleCA9IGNvZGUucHJvYygpLm51bUVudHJ5cG9pbnRzKCk7IGVudHJ5cG9pbnRJbmRleC0t
OykgeworICAgICAgICAgICAgZW50cnlwb2ludEZyZXF1ZW5jaWVzW2VudHJ5cG9pbnRJbmRleF0g
PSBtYXhGcmVxdWVuY3koCisgICAgICAgICAgICAgICAgZW50cnlwb2ludEZyZXF1ZW5jaWVzW2Vu
dHJ5cG9pbnRJbmRleF0sCisgICAgICAgICAgICAgICAgYmxvY2stPnN1Y2Nlc3NvcihlbnRyeXBv
aW50SW5kZXgpLmZyZXF1ZW5jeSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBhdXRv
IGZpeEVudHJ5U3dpdGNoID0gWyZdIChCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWduZWQgZW50cnlw
b2ludEluZGV4KSB7CisgICAgICAgIGlmIChibG9jay0+bGFzdCgpLm9wY29kZSAhPSBFbnRyeVN3
aXRjaCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRnJlcXVlbnRlZEJsb2NrIHRhcmdl
dCA9IGJsb2NrLT5zdWNjZXNzb3IoZW50cnlwb2ludEluZGV4KTsKKyAgICAgICAgYmxvY2stPmxh
c3QoKS5vcGNvZGUgPSBKdW1wOworICAgICAgICBibG9jay0+c3VjY2Vzc29ycygpLnJlc2l6ZSgx
KTsKKyAgICAgICAgYmxvY2stPnN1Y2Nlc3NvcigwKSA9IHRhcmdldDsKKyAgICB9OworICAgIAor
ICAgIC8vIE5vdyBkdXBsaWNhdGUgdGhlbS4KKyAgICBWZWN0b3I8RnJlcXVlbnRlZEJsb2NrPiBl
bnRyeXBvaW50czsKKyAgICBlbnRyeXBvaW50cy5hcHBlbmQoRnJlcXVlbnRlZEJsb2NrKGNvZGVb
MF0sIGVudHJ5cG9pbnRGcmVxdWVuY2llc1swXSkpOworICAgIEluZGV4TWFwPEJhc2ljQmxvY2ss
IEJhc2ljQmxvY2sqPiBtYXAoY29kZS5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgZW50cnlw
b2ludEluZGV4ID0gMTsgZW50cnlwb2ludEluZGV4IDwgY29kZS5wcm9jKCkubnVtRW50cnlwb2lu
dHMoKTsgKytlbnRyeXBvaW50SW5kZXgpIHsKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAg
IGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKQor
ICAgICAgICAgICAgbWFwW2Jsb2NrXSA9IGNvZGUuYWRkQmxvY2soYmxvY2stPmZyZXF1ZW5jeSgp
KTsKKyAgICAgICAgZW50cnlwb2ludHMuYXBwZW5kKEZyZXF1ZW50ZWRCbG9jayhtYXBbY29kZVsw
XV0sIGVudHJ5cG9pbnRGcmVxdWVuY2llc1tlbnRyeXBvaW50SW5kZXhdKSk7CisgICAgICAgIGZv
ciAoQmFzaWNCbG9jayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCkudmFsdWVzKGNvZGUpKSB7Cisg
ICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdCbG9jayA9IG1hcFtibG9ja107CisgICAgICAgICAg
ICBmb3IgKGNvbnN0IEluc3QmIGluc3QgOiAqYmxvY2spCisgICAgICAgICAgICAgICAgbmV3Qmxv
Y2stPmFwcGVuZEluc3QoaW5zdCk7CisgICAgICAgICAgICBuZXdCbG9jay0+c3VjY2Vzc29ycygp
ID0gYmxvY2stPnN1Y2Nlc3NvcnMoKTsKKyAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayomIHN1
Y2Nlc3NvciA6IG5ld0Jsb2NrLT5zdWNjZXNzb3JCbG9ja3MoKSkgeworICAgICAgICAgICAgICAg
IGlmIChCYXNpY0Jsb2NrKiByZXBsYWNlbWVudCA9IG1hcFtzdWNjZXNzb3JdKQorICAgICAgICAg
ICAgICAgICAgICBzdWNjZXNzb3IgPSByZXBsYWNlbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGZpeEVudHJ5U3dpdGNoKG5ld0Jsb2NrLCBlbnRyeXBvaW50SW5kZXgpOworICAgICAg
ICB9CisgICAgfQorICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiB3b3JrbGlzdC5zZWVuKCku
dmFsdWVzKGNvZGUpKQorICAgICAgICBmaXhFbnRyeVN3aXRjaChibG9jaywgMCk7CisgICAgCisg
ICAgY29kZS5zZXRFbnRyeXBvaW50cyhXVEZNb3ZlKGVudHJ5cG9pbnRzKSk7CisgICAgY29kZS5y
ZXNldFJlYWNoYWJpbGl0eSgpOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCShub25leGlzdGVudCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTG93ZXJFbnRyeVN3aXRjaC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKyNkZWZp
bmUgQWlyTG93ZXJFbnRyeVN3aXRjaF9oCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCituYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisK
Ky8vIENvbnZlcnRzIGNvZGUgdGhhdCBzZWVtcyB0byBoYXZlIG9uZSBlbnRyeXBvaW50IGFuZCBl
bXVsYXRlcyBtdWx0aXBsZSBlbnRyeXBvaW50cyB3aXRoCisvLyBFbnRyeVN3aXRjaCBpbnRvIGNv
ZGUgdGhhdCByZWFsbHkgaGFzIG11bHRpcGxlIGVudHJ5cG9pbnRzLiBUaGlzIGlzIGFjY29tcGxp
c2hlZCBieSBkdXBsaWNhdGluZworLy8gdGhlIGJhY2t3YXJkcyB0cmFuc2l0aXZlIGNsb3N1cmUg
ZnJvbSBhbGwgRW50cnlTd2l0Y2hlcy4KK3ZvaWQgbG93ZXJFbnRyeVN3aXRjaChDb2RlJik7CisK
K30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19K
SVQpCisKKyNlbmRpZiAvLyBBaXJMb3dlckVudHJ5U3dpdGNoX2gKKwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJPcGNvZGUub3Bjb2Rlcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCShyZXZpc2lvbiAyMDM2
NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzCSh3
b3JraW5nIGNvcHkpCkBAIC04NTAsNiArODUwLDEwIEBAIFJldERvdWJsZSBVOkY6NjQgL3JldHVy
bgogCiBPb3BzIC90ZXJtaW5hbAogCisjIFRoaXMgaXMgYSB0ZXJtaW5hbCBidXQgd2UgZXhwcmVz
cyBpdCBhcyBhIEN1c3RvbSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXQgdG8gaGF2ZSBhIGNvZGUK
KyMgZ2VuZXJhdG9yLgorY3VzdG9tIEVudHJ5U3dpdGNoCisKICMgQSBTaHVmZmxlIGlzIGEgbXVs
dGktc291cmNlLCBtdWx0aS1kZXN0aW5hdGlvbiBtb3ZlLiBJdCBzaW11bHRhbmVvdXNseSBkb2Vz
IG11bHRpcGxlIG1vdmVzIGF0IG9uY2UuCiAjIFRoZSBtb3ZlcyBhcmUgc3BlY2lmaWVkIGFzIHRy
aXBsZXRzIG9mIHNyYywgZHN0LCBhbmQgd2lkdGguIEZvciBleGFtcGxlIHlvdSBjYW4gcmVxdWVz
dCBhIHN3YXAgdGhpcwogIyB3YXk6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpck9wdGltaXplQmxvY2tPcmRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCShyZXZpc2lvbiAyMDM2NjYp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpck9wdGltaXplQmxvY2tPcmRlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDE2ICs4MSwyOCBAQCBWZWN0b3I8QmFzaWNCbG9jayo+
IGJsb2Nrc0luT3B0aW1pemVkT3JkCiAgICAgU29ydGVkU3VjY2Vzc29ycyBzb3J0ZWRTdWNjZXNz
b3JzOwogICAgIFNvcnRlZFN1Y2Nlc3NvcnMgc29ydGVkU2xvd1N1Y2Nlc3NvcnM7CiAgICAgCi0g
ICAgZmFzdFdvcmtsaXN0LnB1c2goY29kZVswXSk7CisgICAgLy8gV2UgZXhwZWN0IGVudHJ5cG9p
bnQgbG93ZXJpbmcgdG8gaGF2ZSBhbHJlYWR5IGhhcHBlbmVkLgorICAgIFJFTEVBU0VfQVNTRVJU
KGNvZGUubnVtRW50cnlwb2ludHMoKSk7CisKKyAgICBhdXRvIGFwcGVuZFN1Y2Nlc3NvciA9IFsm
XSAoY29uc3QgRnJlcXVlbnRlZEJsb2NrJiBibG9jaykgeworICAgICAgICBpZiAoYmxvY2suaXNS
YXJlKCkpCisgICAgICAgICAgICBzb3J0ZWRTbG93U3VjY2Vzc29ycy5hcHBlbmQoYmxvY2suYmxv
Y2soKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvcnRlZFN1Y2Nlc3NvcnMuYXBwZW5k
KGJsb2NrLmJsb2NrKCkpOworICAgIH07CisgICAgCisgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgYnV0
IHRoZSBmaXJzdCBlbnRyeXBvaW50LCB3ZSBwdXNoIHRoZW0gaW4gb3JkZXIgb2YgZnJlcXVlbmN5
IGFuZCBmcmVxdWVuY3kKKyAgICAvLyBjbGFzcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBp
IDwgY29kZS5udW1FbnRyeXBvaW50cygpOyArK2kpCisgICAgICAgIGFwcGVuZFN1Y2Nlc3Nvcihj
b2RlLmVudHJ5cG9pbnQoaSkpOworICAgIAorICAgIC8vIEFsd2F5cyBwdXNoIHRoZSBwcmltYXJ5
IHN1Y2Nlc3NvciBsYXN0IHNvIHRoYXQgaXQgZ2V0cyBoaWdoZXN0IHByaW9yaXR5LgorICAgIGZh
c3RXb3JrbGlzdC5wdXNoKGNvZGUuZW50cnlwb2ludCgwKS5ibG9jaygpKTsKICAgICAKICAgICB3
aGlsZSAoQmFzaWNCbG9jayogYmxvY2sgPSBmYXN0V29ya2xpc3QucG9wKCkpIHsKICAgICAgICAg
YmxvY2tzSW5PcmRlci5hcHBlbmQoYmxvY2spOwotICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9j
ayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgewotICAgICAgICAgICAgaWYgKHN1
Y2Nlc3Nvci5pc1JhcmUoKSkKLSAgICAgICAgICAgICAgICBzb3J0ZWRTbG93U3VjY2Vzc29ycy5h
cHBlbmQoc3VjY2Vzc29yLmJsb2NrKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIHNvcnRlZFN1Y2Nlc3NvcnMuYXBwZW5kKHN1Y2Nlc3Nvci5ibG9jaygpKTsKLSAgICAgICAg
fQorICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYgc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nl
c3NvcnMoKSkKKyAgICAgICAgICAgIGFwcGVuZFN1Y2Nlc3NvcihzdWNjZXNzb3IpOwogICAgICAg
ICBzb3J0ZWRTdWNjZXNzb3JzLnByb2Nlc3MoZmFzdFdvcmtsaXN0KTsKICAgICB9CiAKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAkocmV2aXNpb24g
MjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNjAsNiArNjAsMTEgQEAgYm9vbCBTcGVjaWFsOjppc1Rlcm1pbmFs
KEluc3QmKQogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTcGVjaWFsOjpoYXNOb25BcmdF
ZmZlY3RzKEluc3QmKQoreworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIFNwZWNpYWw6Omhh
c05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKEluc3QmKQogewogICAgIHJldHVybiB0cnVlOwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJTcGVjaWFsLmgJKHJldmlzaW9uIDIw
MzY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyU3BlY2lhbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC05Miw2ICs5Miw5IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgaXNU
ZXJtaW5hbChJbnN0Jik7CiAKICAgICAvLyBCeSBkZWZhdWx0LCB0aGlzIHJldHVybnMgdHJ1ZS4K
KyAgICB2aXJ0dWFsIGJvb2wgaGFzTm9uQXJnRWZmZWN0cyhJbnN0Jik7CisKKyAgICAvLyBCeSBk
ZWZhdWx0LCB0aGlzIHJldHVybnMgdHJ1ZS4KICAgICB2aXJ0dWFsIGJvb2wgaGFzTm9uQXJnTm9u
Q29udHJvbEVmZmVjdHMoSW5zdCYpOwogCiAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29u
c3Q7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclZhbGlkYXRlLmNw
cAkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJW
YWxpZGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUg
IkFpckNvZGUuaCIKICNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5oIgorI2luY2x1ZGUgIkIzUHJv
Y2VkdXJlLmgiCiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWly
IHsKIApAQCAtNTQsNyArNTUsNyBAQCBwdWJsaWM6CiAgICAgICAgIEhhc2hTZXQ8U3RhY2tTbG90
Kj4gdmFsaWRTbG90czsKICAgICAgICAgSGFzaFNldDxCYXNpY0Jsb2NrKj4gdmFsaWRCbG9ja3M7
CiAgICAgICAgIEhhc2hTZXQ8U3BlY2lhbCo+IHZhbGlkU3BlY2lhbHM7Ci0KKyAgICAgICAgCiAg
ICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpCiAgICAgICAgICAgICB2YWxp
ZEJsb2Nrcy5hZGQoYmxvY2spOwogICAgICAgICBmb3IgKFN0YWNrU2xvdCogc2xvdCA6IG1fY29k
ZS5zdGFja1Nsb3RzKCkpCkBAIC02Myw2ICs2NCwxMCBAQCBwdWJsaWM6CiAgICAgICAgICAgICB2
YWxpZFNwZWNpYWxzLmFkZChzcGVjaWFsKTsKIAogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICAvLyBCbG9ja3MgdGhhdCBhcmUgZW50cnlwb2lu
dHMgbXVzdCBub3QgaGF2ZSBwcmVkZWNlc3NvcnMuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlz
RW50cnlwb2ludChibG9jaykpCisgICAgICAgICAgICAgICAgVkFMSURBVEUoIWJsb2NrLT5udW1Q
cmVkZWNlc3NvcnMoKSwgKCJBdCBlbnRyeXBvaW50ICIsICpibG9jaykpOworICAgICAgICAgICAg
CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8IGJs
b2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7CiAgICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9
IGJsb2NrLT5hdChpbnN0SW5kZXgpOwogICAgICAgICAgICAgICAgIGZvciAoQXJnJiBhcmcgOiBp
bnN0LmFyZ3MpIHsKQEAgLTg5LDYgKzk0LDE0IEBAIHB1YmxpYzoKICAgICAgICAgICAgICAgICAg
ICAgICAgIFZBTElEQVRFKCZhcmcgPj0gJmluc3QuYXJnc1swXSwgKCJBdCAiLCBhcmcsICIgaW4g
IiwgaW5zdCwgIiBpbiAiLCAqYmxvY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFZBTElE
QVRFKCZhcmcgPD0gJmluc3QuYXJncy5sYXN0KCksICgiQXQgIiwgYXJnLCAiIGluICIsIGluc3Qs
ICIgaW4gIiwgKmJsb2NrKSk7CiAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5vcGNvZGUpIHsKKyAgICAgICAgICAg
ICAgICBjYXNlIEVudHJ5U3dpdGNoOgorICAgICAgICAgICAgICAgICAgICBWQUxJREFURShibG9j
ay0+bnVtU3VjY2Vzc29ycygpID09IG1fY29kZS5wcm9jKCkubnVtRW50cnlwb2ludHMoKSwgKCJB
dCAiLCBpbnN0LCAiIGluICIsICpibG9jaykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKEJhc2ljQmxv
Y2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JCbG9ja3MoKSkKICAgICAgICAgICAgICAg
ICBWQUxJREFURSh2YWxpZEJsb2Nrcy5jb250YWlucyhzdWNjZXNzb3IpLCAoIkluICIsICpibG9j
aykpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9vcGNvZGVfZ2VuZXJhdG9y
LnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvb3Bjb2RlX2dl
bmVyYXRvci5yYgkocmV2aXNpb24gMjAzNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9vcGNvZGVfZ2VuZXJhdG9yLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQ2LDcgKzEwNDYs
NyBAQCB3cml0ZUgoIk9wY29kZUdlbmVyYXRlZCIpIHsKICAgICAgICAgfCBvcGNvZGUgfAogICAg
ICAgICBpZiBvcGNvZGUuY3VzdG9tCiAgICAgICAgICAgICBvdXRwLnB1dHMgImNhc2UgI3tvcGNv
ZGUubmFtZX06IgotICAgICAgICAgICAgb3V0cC5wdXRzICJyZXR1cm4gI3tvcGNvZGUubmFtZX1D
dXN0b206Omhhc05vbkFyZ05vbkNvbnRyb2xFZmZlY3RzKCp0aGlzKTsiCisgICAgICAgICAgICBv
dXRwLnB1dHMgInJldHVybiAje29wY29kZS5uYW1lfUN1c3RvbTo6aGFzTm9uQXJnRWZmZWN0cygq
dGhpcyk7IgogICAgICAgICBlbmQKICAgICB9CiAgICAgb3V0cC5wdXRzICJkZWZhdWx0OiIKSW5k
ZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hhbmdl
TG9nCShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDE2LTA3LTE5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0Bh
cHBsZS5jb20+CisKKyAgICAgICAgQjMgc2hvdWxkIHN1cHBvcnQgbXVsdGlwbGUgZW50cnlwb2lu
dHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTM5
MQorCisgICAgICAgIFJldmlld2VkIGJ5IFNhYW0gQmFyYXRpLgorCisgICAgICAgICogd3RmL0dy
YXBoTm9kZVdvcmtsaXN0Lmg6IEV4cG9zZSBzb21lIGhhbmR5IGZ1bmN0aW9uYWxpdHkuCisgICAg
ICAgIChXVEY6OkdyYXBoTm9kZVdvcmtsaXN0Ojpwb3ApOgorICAgICAgICAoV1RGOjpHcmFwaE5v
ZGVXb3JrbGlzdDo6c2F3KToKKyAgICAgICAgKFdURjo6R3JhcGhOb2RlV29ya2xpc3Q6OnNlZW4p
OgorICAgICAgICAqIHd0Zi9WZWN0b3JUcmFpdHMuaDogRml4IGEgYnVnISBPdGhlcndpc2UgZmls
bGluZyBhIHZlY3RvciBvZiBieXRlLXNpemVkIGVudW0gY2xhc3NlcyBkb2Vzbid0IHdvcmsuCisK
IDIwMTYtMDctMjEgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNvbT4KIAog
ICAgICAgICBbbWFjT1NdIENhcmV0IHBsYWNlbWVudCBvY2N1cnMgaW4gdGhlIG1pZGRsZSBvZiBu
ZXcgZW1vamkgZ3JvdXAgY2FuZGlkYXRlcwpJbmRleDogU291cmNlL1dURi93dGYvR3JhcGhOb2Rl
V29ya2xpc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlz
dC5oCShyZXZpc2lvbiAyMDM2NjYpCisrKyBTb3VyY2UvV1RGL3d0Zi9HcmFwaE5vZGVXb3JrbGlz
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC02Myw2ICs2Myw4IEBAIHB1YmxpYzoKICAgICB9CiAKICAg
ICBib29sIHNhdyhOb2RlIG5vZGUpIHsgcmV0dXJuIG1fc2Vlbi5jb250YWlucyhub2RlKTsgfQor
ICAgIAorICAgIGNvbnN0IFNldCYgc2VlbigpIGNvbnN0IHsgcmV0dXJuIG1fc2VlbjsgfQogCiBw
cml2YXRlOgogICAgIFNldCBtX3NlZW47CkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9WZWN0b3JUcmFp
dHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9WZWN0b3JUcmFpdHMuaAkocmV2aXNp
b24gMjAzNjY2KQorKysgU291cmNlL1dURi93dGYvVmVjdG9yVHJhaXRzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwg
MjAwNywgMjAwOCwgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAj
aW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFp
dHM+CiAKIG5hbWVzcGFjZSBXVEYgewogCkBAIC01MSw3ICs1Miw3IEBAIG5hbWVzcGFjZSBXVEYg
ewogICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5Jbml0aWFsaXplV2l0aE1lbXNldCA9IGZh
bHNlOwogICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5Nb3ZlV2l0aE1lbWNweSA9IHRydWU7
CiAgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGNhbkNvcHlXaXRoTWVtY3B5ID0gdHJ1ZTsKLSAg
ICAgICAgc3RhdGljIGNvbnN0IGJvb2wgY2FuRmlsbFdpdGhNZW1zZXQgPSBzaXplb2YoVCkgPT0g
c2l6ZW9mKGNoYXIpOworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBjYW5GaWxsV2l0aE1lbXNl
dCA9IHNpemVvZihUKSA9PSBzaXplb2YoY2hhcikgJiYgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFs
dWU7CiAgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGNhbkNvbXBhcmVXaXRoTWVtY21wID0gdHJ1
ZTsKICAgICB9OwogCkluZGV4OiBXZWJzaXRlcy93ZWJraXQub3JnL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJzaXRlcy93ZWJraXQub3JnL0NoYW5nZUxvZwkocmV2aXNpb24gMjAzNjY3KQor
KysgV2Vic2l0ZXMvd2Via2l0Lm9yZy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyAr
MSwxNiBAQAorMjAxNi0wNy0yNCAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisg
ICAgICAgIEIzIHNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGVudHJ5cG9pbnRzCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkzOTEKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIFVwZGF0ZSBzb21l
IHN0YXRlbWVudHMgYWJvdXQgQ29udHJvbFZhbHVlICh3aGljaCBkb2Vzbid0IGV4aXN0IGFueW1v
cmUpIGFuZCBhZGQgYSBibHVyYgorICAgICAgICBhYm91dCBFbnRyeVN3aXRjaC4KKworICAgICAg
ICAqIGRvY3MvYjMvaW5kZXguaHRtbDoKKyAgICAgICAgKiBkb2NzL2IzL2ludGVybWVkaWF0ZS1y
ZXByZXNlbnRhdGlvbi5odG1sOgorCiAyMDE2LTA3LTIwICBGcmVkZXJpYyBXYW5nICA8ZndhbmdA
aWdhbGlhLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCBuZXcgZGVtbyBmaWxlcyBmb3IgYW4g
dXAtY29taW5nIGJsb2cgcG9zdC4KSW5kZXg6IFdlYnNpdGVzL3dlYmtpdC5vcmcvZG9jcy9iMy9p
bmRleC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC5vcmcvZG9jcy9iMy9pbmRl
eC5odG1sCShyZXZpc2lvbiAyMDM2NjYpCisrKyBXZWJzaXRlcy93ZWJraXQub3JnL2RvY3MvYjMv
aW5kZXguaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogICAgIDxwcmU+PGNv
ZGU+Ly8gQ3JlYXRlIGEgUHJvY2VkdXJlIHRoYXQgaG9sZHMgb3VyIGNvZGUuCiBQcm9jZWR1cmUg
cHJvYzsKIEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7Ci1yb290LT5hcHBlbmRO
ZXcmbHQ7Q29udHJvbFZhbHVlJmd0OygKK3Jvb3QtPmFwcGVuZE5ldyZsdDtWYWx1ZSZndDsoCiAg
ICAgcHJvYywgUmV0dXJuLCBPcmlnaW4oKSwKICAgICByb290LT5hcHBlbmROZXcmbHQ7VmFsdWUm
Z3Q7KAogICAgICAgICBwcm9jLCBBZGQsIE9yaWdpbigpLApJbmRleDogV2Vic2l0ZXMvd2Via2l0
Lm9yZy9kb2NzL2IzL2ludGVybWVkaWF0ZS1yZXByZXNlbnRhdGlvbi5odG1sCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYnNpdGVzL3dlYmtpdC5vcmcvZG9jcy9iMy9pbnRlcm1lZGlhdGUtcmVwcmVzZW50YXRp
b24uaHRtbAkocmV2aXNpb24gMjAzNjY2KQorKysgV2Vic2l0ZXMvd2Via2l0Lm9yZy9kb2NzL2Iz
L2ludGVybWVkaWF0ZS1yZXByZXNlbnRhdGlvbi5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC01NDEs
MzIgKzU0MSw2NSBAQCBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoCiAgICAgICAgIHdpdGggVXBz
aWxvbi48L2RkPgogCiAgICAgICA8ZHQ+Vm9pZCBKdW1wKHRha2VuQmxvY2spPC9kdD4KLSAgICAg
IDxkZD5KdW1wcyB0byB0YWtlbkJsb2NrLiAgVGhpcyBpcyBhIENvbnRyb2xWYWx1ZSwgc28gaXQg
bXVzdCBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgYmFzaWMgYmxvY2suPC9kZD4K
KyAgICAgIDxkZD5KdW1wcyB0byB0YWtlbkJsb2NrLiAgVGhpcyBtdXN0IGFwcGVhciBhdCB0aGUg
ZW5kIG9mIHRoZSBiYXNpYyBibG9jay4gVGhlIGJhc2ljIGJsb2NrCisgICAgICAgIG11c3QgaGF2
ZSBleGFjdGx5IG9uZSBzdWNjZXNzb3IuPC9kZD4KIAogICAgICAgPGR0PlZvaWQgQnJhbmNoKFQs
IHRha2VuQmxvY2ssIG5vdFRha2VuQmxvY2spPC9kdD4KICAgICAgIDxkZD5Xb3JrcyBmb3IgVCA9
IEludDMyIG9yIFQgPSBJbnQ2NC4gIEJyYW5jaGVzIG9uIHRoZSBjaGlsZC4gIElmIHRoZSBjaGls
ZCBpcyBub24temVybywKLSAgICAgICAgaXQgYnJhbmNoZXMgdG8gdGhlIHRha2VuQmxvY2suICBP
dGhlcndpc2UgaXQgYnJhbmNoZXMgdG8gdGhlIG5vdFRha2VuQmxvY2suICBNdXN0IHVzZQotICAg
ICAgICB0aGUgQ29udHJvbFZhbHVlIGNsYXNzLiAgTXVzdCBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0
aGUgYmFzaWMgYmxvY2suPC9kZD4KKyAgICAgICAgaXQgYnJhbmNoZXMgdG8gdGhlIHRha2VuQmxv
Y2suICBPdGhlcndpc2UgaXQgYnJhbmNoZXMgdG8gdGhlIG5vdFRha2VuQmxvY2suICBNdXN0IGFw
cGVhcgorICAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jay4gVGhlIGJsb2NrIG11
c3QgaGF2ZSBleGFjdGx5IHR3byBzdWNjZXNzb3JzLjwvZGQ+CiAKICAgICAgIDxkdD5Wb2lkIFN3
aXRjaChULCBjYXNlcy4uLik8L2R0PgogICAgICAgPGRkPldvcmtzIGZvciBUID0gSW50MzIgb3Ig
VCA9IEludDY0LiAgU3dpdGNoZXMgb24gdGhlIGNoaWxkLiAgQ29udGFpbnMgYSBsaXN0IG9mIHN3
aXRjaAogICAgICAgICBjYXNlcy4gIEVhY2ggc3dpdGNoIGNhc2UgaGFzIGFuIGludGVnZXIgY29u
c3RhbnQgYW5kIGEgdGFyZ2V0IGJsb2NrLiAgVGhlIHN3aXRjaCB2YWx1ZQogICAgICAgICBhbHNv
IGNvbnRhaW5zIGEgZmFsbC10aHJvdWdoIHRhcmdldCBpbiBjYXNlIHRoZSBjaGlsZCBoYXMgYSB2
YWx1ZSB0aGF0IHdhc24ndCBtZW50aW9uZWQKICAgICAgICAgaW4gdGhlIGNhc2VzIGxpc3QuICBN
dXN0IHVzZSB0aGUgU3dpdGNoVmFsdWUgY2xhc3MuICBNdXN0IGFwcGVhciBhdCB0aGUgZW5kIG9m
IHRoZSBiYXNpYwotICAgICAgICBibG9jay48L2RkPgorICAgICAgICBibG9jay4gVGhlIGJsb2Nr
IG11c3QgaGF2ZSBvbmUgc3VjY2Vzc29yIGZvciBlYWNoIGNhc2UsIHBsdXMgYSBzdWNjZXNzb3Ig
Zm9yIHRoZQorICAgICAgICBmYWxsLXRocm91Z2ggKGRlZmF1bHQpIGNhc2UuIFlvdSBjYW4gbWFu
YWdlIHRoZSBzdWNjZXNzb3JzIG9mIGEgYmxvY2sgY29udGFpbmluZyBhIFN3aXRjaAorICAgICAg
ICB1c2luZyBBUEkgaW4gU3dpdGNoVmFsdWUsIGxpa2UgU3dpdGNoVmFsdWU6OmFwcGVuZENhc2Uo
KSBhbmQKKyAgICAgICAgU3dpdGNoVmFsdWU6OnNldEZhbGxUaHJvdWdoKCkuPC9kZD4KKyAgICAg
IAorICAgICAgPGR0PlZvaWQgRW50cnlTd2l0Y2goKTwvZHQ+CisgICAgICA8ZGQ+CisgICAgICAg
IDxwPkIzIHN1cHBvcnRzIG11bHRpcGxlIHByb2NlZHVyZSBlbnRyeXBvaW50cy4gVGhlIHdheSB5
b3UgY3JlYXRlIG11bHRpcGxlIGVudHJ5cG9pbnRzIGlzCisgICAgICAgICAgYnkgcGxhY2luZyBh
biBFbnRyeVN3aXRjaCBhdCB0aGUgZW5kIG9mIHRoZSByb290IGJsb2NrLiBUaGUgcm9vdCBibG9j
ayBtdXN0IHRoZW4gaGF2ZSBhCisgICAgICAgICAgc3VjY2Vzc29yIGZvciBlYWNoIGVudHJ5cG9p
bnQuIEFkZGl0aW9uYWxseSwgeW91IG11c3QgdGVsbCB0aGUgUHJvY2VkdXJlIGhvdyBtYW55Cisg
ICAgICAgICAgZW50cnlwb2ludHMgeW91IHdhbnQuIEZvciBleGFtcGxlOjwvcD4KKyAgICAgICAg
PHByZT48Y29kZT5Qcm9jZWR1cmUgcHJvYzsKK3Byb2Muc2V0TnVtRW50cnlwb2ludHMoMyk7CitC
YXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworQmFzaWNCbG9jayogZmlyc3RFbnRy
eXBvaW50ID0gcHJvYy5hZGRCbG9jaygpOworQmFzaWNCbG9jayogc2Vjb25kRW50cnlwb2ludCA9
IHByb2MuYWRkQmxvY2soKTsKK0Jhc2ljQmxvY2sqIHRoaXJkRW50cnlwb2ludCA9IHByb2MuYWRk
QmxvY2soKTsKK3Jvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRW50cnlTd2l0Y2gsIE9yaWdp
bigpKTsKK3Jvb3QtPmFwcGVuZFN1Y2Nlc3NvcihmaXJzdEVudHJ5cG9pbnQpOworcm9vdC0+YXBw
ZW5kU3VjY2Vzc29yKHNlY29uZEVudHJ5cG9pbnQpOworcm9vdC0+YXBwZW5kU3VjY2Vzc29yKHRo
aXJkRW50cnlwb2ludCk7PC9jb2RlPjwvcHJlPgorICAgICAgICA8cD5UaGlzIGlzIHRoZSBjYW5v
bmljYWwgd2F5IHRvIHVzZSBFbnRyeVN3aXRjaCwgaG93ZXZlciB0aGUgc2VtYW50aWNzIGFyZSBm
bGV4aWJsZSBlbm91Z2gKKyAgICAgICAgICB0byBhbGxvdyBpdHMgdXNlIGFueXdoZXJlIGluIHRo
ZSBjb250cm9sIGZsb3cgZ3JhcGguIFRoaXMgZW5zdXJlcyB0aGF0IEVudHJ5U3dpdGNoIHdvcmtz
CisgICAgICAgICAgZXZlbiB3aGVuIEIzIGRvZXMgdHJhbnNmb3JtYXRpb25zIHRoYXQgbW92ZSBj
b2RlIGFib3ZlIHRoZSBFbnRyeVN3aXRjaC48L3A+CisgICAgICAgIDxwPkVudHJ5U3dpdGNoIGJl
aGF2ZXMgYXMgaWYgZWFjaCBQcm9jZWR1cmUgaGFzIGEgdmFyaWFibGUgY2FsbGVkIEVudHJ5LiBF
YWNoIHBoeXNpY2FsCisgICAgICAgICAgZW50cnlwb2ludCBzZXRzIEVudHJ5IHRvIHRoZSBpbmRl
eCBvZiB0aGF0IGVudHJ5cG9pbnQgKHNvIDAsIDEsIG9yIDIsIGFib3ZlKSBhbmQganVtcHMgdG8K
KyAgICAgICAgICB0aGUgcm9vdCBibG9jay4gRW50cnlTd2l0Y2ggaXMganVzdCBhIHN3aXRjaCBv
biB0aGUgRW50cnkgdmFyaWFibGUuPC9wPgorICAgICAgICA8cD5FbnRyeVN3aXRjaCBpcyBpbXBs
ZW1lbnRlZCB3aXRob3V0IGFueSBhY3R1YWwgdmFyaWFibGVzIG9yIHN3aXRjaGluZy4gSW5zdGVh
ZCwgYWxsIGNvZGUKKyAgICAgICAgICB0aGF0IGxpZXMgb24gc29tZSBwYXRoIGZyb20gdGhlIHJv
b3QgYmxvY2sgdG8gc29tZSBFbnRyeVN3aXRjaCBpcyBjbG9uZWQgZm9yIGVhY2gKKyAgICAgICAg
ICBlbnRyeXBvaW50LiBUaGlzIGxvd2VyaW5nIGlzIGRvbmUgYXMgYSB2ZXJ5IGxhdGUgcGhhc2Ug
aW4gQWlyLCBzbyBtb3N0IG9mIHRoZSBjb21waWxlcgorICAgICAgICAgIGRvZXMgbm90IGhhdmUg
dG8ga25vdyBhbnl0aGluZyBhYm91dCBlbnRyeXBvaW50cy4gTW9zdCBvZiB0aGUgY29tcGlsZXIg
dHJlYXRzIEVudHJ5U3dpdGNoCisgICAgICAgICAgYXMgYW4gb3BhcXVlIGNvbnRyb2wgZmxvdyBj
b25zdHJ1Y3QuIEVudHJ5U3dpdGNoIGxvd2VyaW5nIGlzIGFsbG93ZWQgdG8gY2xvbmUgYW4KKyAg
ICAgICAgICBhcmJpdHJhcnkgYW1vdW50IG9mIGNvZGUuIEhvd2V2ZXIsIG5vcm1hbCB1c2VzIG9m
IEVudHJ5U3dpdGNoIHdpbGwgcGxhY2UgaXQgYXQgdGhlIGVuZCBvZgorICAgICAgICAgIGFuIGVt
cHR5IHJvb3QgYmxvY2sgYW5kIEIzIHdpbGwgb25seSBob2lzdCBhIGhhbmRmdWwgb2YgdGhpbmdz
IGFib3ZlIEVudHJ5U3dpdGNoLiBUaGlzCisgICAgICAgICAgbGVhZHMgdG8gb25seSBhIHNtYWxs
IGFtb3VudCBvZiBjbG9uZWQgY29kZSBpbiBwcmFjdGljZS48L3A+CisgICAgICA8L2RkPgogCiAg
ICAgICA8ZHQ+Vm9pZCBSZXR1cm4oVCk8L2R0PgogICAgICAgPGRkPldvcmtzIGZvciBhbnkgdHlw
ZSBleGNlcHQgVm9pZC4gIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIGFuZCB0ZXJtaW5hdGVzIHRo
ZSBwcm9jZWR1cmUuCi0gICAgICAgIFRoaXMgaXMgYSBDb250cm9sVmFsdWUsIGJ1dCBpdCBtdXN0
IGhhdmUgYW4gZW1wdHkgc3VjY2Vzc29ycyBsaXN0LiAgTXVzdCBhcHBlYXIgYXQgdGhlCi0gICAg
ICAgIGVuZCBvZiB0aGUgYmFzaWMgYmxvY2suPC9kZD4KKyAgICAgICAgTXVzdCBhcHBlYXIgYXQg
dGhlIGVuZCBvZiB0aGUgYmFzaWMgYmxvY2suIFRoZSBibG9jayBtdXN0IGhhdmUgemVybyBzdWNj
ZXNzb3JzLjwvZGQ+CiAKICAgICAgIDxkdD5Wb2lkIE9vcHMoKTwvZHQ+CiAgICAgICA8ZGQ+SW5k
aWNhdGVzIHVucmVhY2hhYmxlIGNvZGUuICBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCBhcyBlaXRo
ZXIgYSB0cmFwIG9yIGFzIGEgYmFyZQotICAgICAgICBmYWxsLXRocm91Z2gsIHNpbmNlIEIzIGlz
IGFsbG93ZWQgdG8gYXNzdW1lIHRoYXQgdGhpcyB3aWxsIG5ldmVyIGJlIHJlYWNoZWQuICBUaGlz
IGlzIGEKLSAgICAgICAgQ29udHJvbFZhbHVlLCBidXQgaXQgbXVzdCBoYXZlIGFuIGVtcHR5IHN1
Y2Nlc3NvcnMgbGlzdC4gIE11c3QgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgIGJh
c2ljIGJsb2NrLiAgTm90ZSB0aGF0IHdlIGFsc28gdXNlIHRoZSBPb3BzIG9wY29kZSB0byBtZWFu
ICJubyBzdWNoIG9wY29kZSIgaW4gc29tZSBCMwotICAgICAgICB0cmFuc2Zvcm1hdGlvbnMuPC9k
ZD4KKyAgICAgICAgZmFsbC10aHJvdWdoLCBzaW5jZSBCMyBpcyBhbGxvd2VkIHRvIGFzc3VtZSB0
aGF0IHRoaXMgd2lsbCBuZXZlciBiZSByZWFjaGVkLiAgTXVzdCBhcHBlYXIKKyAgICAgICAgYXQg
dGhlIGVuZCBvZiB0aGUgYmFzaWMgYmxvY2suICBUaGUgYmxvY2sgbXVzdCBoYXZlIHplcm8gc3Vj
Y2Vzc29ycy4gTm90ZSB0aGF0IHdlIGFsc28gdXNlCisgICAgICAgIHRoZSBPb3BzIG9wY29kZSB0
byBtZWFuICJubyBzdWNoIG9wY29kZSIgaW4gc29tZSBCMyB0cmFuc2Zvcm1hdGlvbnMuPC9kZD4K
ICAgICA8L2RsPgogCiAgIDwvZGl2Pgo=
</data>
<flag name="review"
          id="308097"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>