<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>19331</bug_id>
          
          <creation_ts>2009-03-25 19:00:46 +0300</creation_ts>
          <short_desc>Похоже сломана работа таймеров с созданием потока в качестве уведомления.</short_desc>
          <delta_ts>2009-07-10 12:10:10 +0400</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>Distributions</classification>
          <product>Branch 5.0</product>
          <component>glibc</component>
          <version>unspecified</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>LATER</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>critical</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Roman Savochenko">rom_as</reporter>
          <assigned_to name="Dmitry V. Levin">ldv</assigned_to>
          <cc>evg</cc>
          
          <qa_contact name="qa-5.0@altlinux.org">qa-5.0</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>87939</commentid>
    <comment_count>0</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-25 19:00:46 +0300</bug_when>
    <thetext>Имеется многопоточная софтина openscada, которая создаёт потоки по таймеру.
Таймер создаётся кодом:
struct sigevent sigev;
memset(&amp;sigev,0,sizeof(sigev));
sigev.sigev_notify = SIGEV_THREAD;
sigev.sigev_value.sival_ptr = this;
sigev.sigev_notify_function = Task;
sigev.sigev_notify_attributes = NULL;
int rez = timer_create(CLOCK_REALTIME,&amp;sigev,&amp;tmId);
printf(&quot;Create timer: &apos;%s&apos; %d(%d)\n&quot;,id().c_str(),tmId,rez);

Удаляется:
int rez = timer_delete(tmId);
printf(&quot;Delete timer: &apos;%s&apos; %d(%d)\n&quot;,id().c_str(),tmId,rez);

Падение происходит секунды через 2 после вызова timer_delete:
Create timer: &apos;1m&apos; 137099560(0)
Create timer: &apos;1s&apos; 134604544(0)
Delete timer: &apos;1m&apos; 137099560(0)
./openscada_demo: line 3: 12837 Segmentation fault

При этом таймер я даже не запускаю и вызов в функцию Task не приходит, а просто создаю и удаляю таймер. gdb сообщает примерно о таком:
(gdb) bt
#0  0xb7c774c0 in pthread_cancel () from /lib/librt.so.1
#1  0xb7c85daa in start_thread () from /lib/libpthread.so.0
#2  0xb7d63f4e in clone () from /lib/libc.so.6

Пытался воспроизвести на макете с созданием и удалением таймера из одного потока, но там это не воспроизвелось. Или оказывает влияние на это большое количество потоков исполняемых параллельно, но независимо, или создавать и удалять таймера в разных потоках нельзя, чего в документации я не встречал.

P.S. Кроме этого момента таймера работают нормально. А именно запускаются и останавливаются включая и из разных потоков. Процедура по таймеру корректно вызывается.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87942</commentid>
    <comment_count>1</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-25 19:39:58 +0300</bug_when>
    <thetext>Похоже в glibc проблемы с разделением доступа к общим данным таймеров и/или потоков.
Остановил высоконагруженные потоки с периодичностью 5мс и общей нагрузкой процессора 40%(2ГГц) и таймера нормально поудалялись!
Т.е причина не удаление в другом потоке, а проблема совместных ресурсов в GlibC.
Кроме того на Branch4.1 x86_64 с kernel-2.6.18ovz у которого нет поддержки времени высокого разрешения и разрешение таймера 4мс, все таймера корректно удалились.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87943</commentid>
    <comment_count>2</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-25 20:02:10 +0300</bug_when>
    <thetext>Повышаю приоритет ошибки.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87950</commentid>
    <comment_count>3</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-25 22:08:20 +0300</bug_when>
    <thetext>На kernel-2.6.25 и glibc-2.5.1 из Branch 4.0 эта проблема ещё не проявляется.
Тестил на ноуте в той-же конфигурации и полной загрузкой CPU тем-же источником. Ядро уже держит высокое разрешение времени.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87970</commentid>
    <comment_count>4</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-26 11:25:01 +0300</bug_when>
    <thetext>С компилятором, которым собирается программа, проблема не связана. Собрал gcc-4.3, gcc-4.1 и gcc-3.4, результат идентичен:
(gdb) bt
#0  0xb7ba64c0 in __gxx_personality_v0 () from /lib/librt.so.1
#1  0xb7bafdaa in start_thread () from /lib/libpthread.so.0
#2  0xb7c92f4e in clone () from /lib/libc.so.6</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87976</commentid>
    <comment_count>5</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-26 12:15:37 +0300</bug_when>
    <thetext>На SuSE 11.1 с glibc-2.9-2.11.1 - проблема не обнаружена
На Mandriva 2009.0 с glibc-2.8-1.20080520.5.2mnb2 - проблема проявляется:
(gdb) bt
#0  0xb7b249b0 in ?? () from /lib/i686/librt.so.1
#1  0xb7b2723c in ?? () from /lib/i686/librt.so.1
#2  0x086c5178 in ?? ()
#3  0xb7b24a30 in ?? () from /lib/i686/librt.so.1
#4  0x08a5bf48 in ?? ()
#5  0x00000000 in ?? ()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87996</commentid>
    <comment_count>6</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-26 16:02:01 +0300</bug_when>
    <thetext>Пересобрал glibc-2.9-alt4 из Сизифа для Branch 5.0 - проблема не исправилась.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88106</commentid>
    <comment_count>7</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-27 13:43:20 +0300</bug_when>
    <thetext>Branch 4.1 glibc-core-2.5.1-alt4 - проблема не проявляется.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88336</commentid>
    <comment_count>8</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2009-03-30 19:33:54 +0400</bug_when>
    <thetext>Роман, спасибо.  Можно приложить сюда код, поведение которого изменилось?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88340</commentid>
    <comment_count>9</comment_count>
      <attachid>3419</attachid>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-03-30 20:01:27 +0400</bug_when>
    <thetext>Created attachment 3419
Архиватор значений

Пожалуйста.
Вкладываю файл части исходника проекта OpenSCADA. Только искать там можно долго. Проблемные участки это конструктор и деструктор класса TVArchivator:
TVArchivator::TVArchivator( const string &amp;iid, const string &amp;idb, TElem *cf_el ) : run_st(false), prc_st(false),
    tm_calc(0.0), TConfig(cf_el), m_db(idb), m_id(cfg(&quot;ID&quot;).getSd()), m_name(cfg(&quot;NAME&quot;).getSd()),
    m_dscr(cfg(&quot;DESCR&quot;).getSd()), m_addr(cfg(&quot;ADDR&quot;).getSd()), m_start(cfg(&quot;START&quot;).getBd()),
    m_v_per(cfg(&quot;V_PER&quot;).getRd()), m_a_per(cfg(&quot;A_PER&quot;).getId())
{
    m_id = iid;

    //&gt; Create calc timer
    struct sigevent sigev;
    memset(&amp;sigev,0,sizeof(sigev));
    sigev.sigev_notify = SIGEV_THREAD;
    sigev.sigev_value.sival_ptr = this;
    sigev.sigev_notify_function = Task;
    sigev.sigev_notify_attributes = NULL;
    timer_create(CLOCK_REALTIME,&amp;sigev,&amp;tmId);
}

TVArchivator::~TVArchivator()
{
    timer_delete(tmId);
}

Всё остальное непринципиально, в случае с данной проблемой, поскольку я его наглухо отглушал, а проблема проявлялась.
Особенность её ещё в том, что удаление потока в timer_delete происходит не сразу, а отложенно. Поэтому если программу завершать, то проявиться проблема не успевает, да и нагрузка снимается к тому моменту.

И если timer_delete(tmId); закомментировать, то проблема не возникает, но естественно текут ресурсы таймера.

Вообще была мысль попробовать в макет добавить с десяток потоков с имитацией рабочей нагрузки, что-бы оно проявлялось более отчётливо.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91160</commentid>
    <comment_count>10</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-05-14 13:46:43 +0400</bug_when>
    <thetext>Valgrind по поводу timer_delete() постоянно сообщает такое:
==21938==
==21938== Conditional jump or move depends on uninitialised value(s)
==21938==    at 0x4417324: timer_delete (in /lib/librt-2.9.so)
==21938==    by 0x405C905: TArchiveS::~TArchiveS() (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93226</commentid>
    <comment_count>11</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2009-06-18 01:22:45 +0400</bug_when>
    <thetext>Боюсь что я не готов отлаживать большую и сложную программу из проекта OpenSCADA.
К сожалению, апстрим этого тоже не станет делать, для этого нужен test case попроще.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>93233</commentid>
    <comment_count>12</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-06-18 10:14:41 +0400</bug_when>
    <thetext>У меня не получилось добиться повторения на тестовом прототипе, даже добавив близкую нагрузку. Похоже сказывается достаточно специфичная нагрузка. Кроме того, в компоненте где ошибка проявлялась я перешёл на независимые потоке, по объективным причинам.

Поэтому откладываем на позже, может у кого такое ещё вылезет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>94484</commentid>
    <comment_count>13</comment_count>
    <who name="Roman Savochenko">rom_as</who>
    <bug_when>2009-07-10 12:10:10 +0400</bug_when>
    <thetext>glibc-2.10.1-alt4
Valgrind по прежнему указывает на наличие проблемы в функции timer_delete:
==5608== Thread 1:                                                                   
==5608== Conditional jump or move depends on uninitialised value(s)                  
==5608==    at 0x442BF72: timer_delete (in /lib/librt-2.10.1.so)                     
==5608==    by 0x6AE9FD7: FSArch::ModArch::~ModArch() (in /mnt/home/roman/work/OScadaD/lib/openscada/arh_FSArch.so)
==5608==    by 0x41343FD: TCntrNode::chldDel(char, std::string const&amp;, long, int, bool) (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x40DB504: TSubSYS::modDel(std::string const&amp;) (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x411A4F6: TModSchedul::preDisable(int) (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x41336D6: TCntrNode::nodeDis(long, int) (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x41344BA: TCntrNode::chldDel(char, std::string const&amp;, long, int, bool) (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x4050525: TSYS::~TSYS() (in /mnt/home/roman/work/OScadaD/lib/liboscada.so.0.0.10)
==5608==    by 0x8048D3A: main (in /mnt/home/roman/work/OScadaD/bin/openscada)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>3419</attachid>
            <date>2009-03-30 20:01:27 +0400</date>
            <delta_ts>2009-03-30 20:01:27 +0400</delta_ts>
            <desc>Архиватор значений</desc>
            <filename>tarchval.cpp</filename>
            <type>text/x-c++src</type>
            <size>81803</size>
            <attacher name="Roman Savochenko">rom_as</attacher>
            
              <data encoding="base64">Ci8vT3BlblNDQURBIHN5c3RlbSBmaWxlOiB0YXJjaHZhbC5jcHAKLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KgogKiAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IGJ5IFJvbWFuIFNhdm9jaGVua28gICAgICAg
ICAgICAgICAgICAgICAgICAgICAqCiAqICAgcm9tX2FzQGZyb21ydS5jb20gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCiAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKICogICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuICAgICAgICAg
ICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKICogICBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZiAgICAgICAgKgogKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCiAqICAgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKgogKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCiAqICAgYWxvbmcgd2l0aCB0aGlzIHBy
b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKICog
ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKgogKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9u
LCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRpbWUu
aD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUg
PGZjbnRsLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojaW5jbHVkZSA8Z2QuaD4KI2luY2x1ZGUgPGdk
Zm9udHMuaD4KI2luY2x1ZGUgPGdkZm9udHQuaD4KCiNpbmNsdWRlICJ0c3lzLmgiCiNpbmNsdWRl
ICJ0dmFsdWUuaCIKI2luY2x1ZGUgInRhcmNoaXZlcy5oIgojaW5jbHVkZSAidGFyY2h2YWwuaCIK
CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8q
IFZhbHVlIGFyY2hpdmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi8vKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKLy8qKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vKiBUVmFsQnVmICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgovLyoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVFZhbEJ1Zjo6VFZhbEJ1ZiggKSA6CiAgICBt
X3ZhbF90cChURmxkOjpJbnRlZ2VyKSwgbV9zaXplKDEwMCksIG1fcGVyKDApLCBtX2hyZF9ncmQo
ZmFsc2UpLCBtX2hnX3Jlc190bShmYWxzZSksIG1fZW5kKDApLCBtX2JlZygwKQp7CiAgICBidWYu
YmwgPSBOVUxMOwoKICAgIG1ha2VCdWYobV92YWxfdHAsbV9zaXplLG1fcGVyLG1faHJkX2dyZCxt
X2hnX3Jlc190bSk7Cn0KClRWYWxCdWY6OlRWYWxCdWYoIFRGbGQ6OlR5cGUgdnRwLCBpbnQgaXN6
LCBsb25nIGxvbmcgaXByLCBib29sIGloZ3JkLCBib29sIGlocmVzICkgOgogICAgbV92YWxfdHAo
dnRwKSwgbV9zaXplKGlzeiksIG1fcGVyKGlwciksIG1faHJkX2dyZChpaGdyZCksIG1faGdfcmVz
X3RtKGlocmVzKSwgbV9lbmQoMCksIG1fYmVnKDApCnsKICAgIGJ1Zi5ibCA9IE5VTEw7CgogICAg
bWFrZUJ1ZihtX3ZhbF90cCxtX3NpemUsbV9wZXIsbV9ocmRfZ3JkLG1faGdfcmVzX3RtKTsKfQoK
dm9pZCBUVmFsQnVmOjpjbGVhcigpCnsKICAgIHN3aXRjaChtX3ZhbF90cCkKICAgIHsKCWNhc2Ug
VEZsZDo6Qm9vbGVhbjoJYnVmLmJsLT5jbGVhcigpOwlicmVhazsKCWNhc2UgVEZsZDo6SW50ZWdl
cjoJYnVmLmRlYy0+Y2xlYXIoKTsJYnJlYWs7CgljYXNlIFRGbGQ6OlJlYWw6CWJ1Zi5yZWFsLT5j
bGVhcigpOwlicmVhazsKCWNhc2UgVEZsZDo6U3RyaW5nOglidWYuc3RyLT5jbGVhcigpOyAJYnJl
YWs7CiAgICB9Cn0KClRWYWxCdWY6On5UVmFsQnVmKCApCnsKICAgIHN3aXRjaChtX3ZhbF90cCkK
ICAgIHsKCWNhc2UgVEZsZDo6Qm9vbGVhbjoJZGVsZXRlIGJ1Zi5ibDsgIGJyZWFrOwoJY2FzZSBU
RmxkOjpJbnRlZ2VyOglkZWxldGUgYnVmLmRlYzsgYnJlYWs7CgljYXNlIFRGbGQ6OlJlYWw6CWRl
bGV0ZSBidWYucmVhbDticmVhazsKCWNhc2UgVEZsZDo6U3RyaW5nOglkZWxldGUgYnVmLnN0cjsg
YnJlYWs7CiAgICB9Cn0KCmludCBUVmFsQnVmOjpyZWFsU2l6ZSgpCnsKICAgIHN3aXRjaCh2YWxU
eXBlKCkpCiAgICB7CgljYXNlIFRGbGQ6OkJvb2xlYW46CXJldHVybiBidWYuYmwtPnJlYWxTaXpl
KCk7CgljYXNlIFRGbGQ6OkludGVnZXI6CXJldHVybiBidWYuZGVjLT5yZWFsU2l6ZSgpOwoJY2Fz
ZSBURmxkOjpSZWFsOglyZXR1cm4gYnVmLnJlYWwtPnJlYWxTaXplKCk7CgljYXNlIFRGbGQ6OlN0
cmluZzoJcmV0dXJuIGJ1Zi5zdHItPnJlYWxTaXplKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K
CmJvb2wgVFZhbEJ1Zjo6dk9LKCBsb25nIGxvbmcgaWJlZywgbG9uZyBsb25nIGllbmQgKQp7CiAg
ICBpZiggIWJlZ2luKCkgfHwgIWVuZCgpIHx8IGllbmQgPCBiZWdpbigpIHx8IGliZWcgPiBlbmQo
KSB8fCBpYmVnID4gaWVuZCApCglyZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9p
ZCBUVmFsQnVmOjpzZXRWYWxUeXBlKCBURmxkOjpUeXBlIHZsICkKewogICAgbWFrZUJ1Zih2bCwg
bV9zaXplLCBtX3BlciwgbV9ocmRfZ3JkLCBtX2hnX3Jlc190bSApOwp9Cgp2b2lkIFRWYWxCdWY6
OnNldEhhcmRHcmlkKCBib29sIHZsICkKewogICAgbWFrZUJ1ZiggbV92YWxfdHAsIG1fc2l6ZSwg
bV9wZXIsIHZsLCBtX2hnX3Jlc190bSApOwp9Cgp2b2lkIFRWYWxCdWY6OnNldEhpZ2hSZXNUbSgg
Ym9vbCB2bCApCnsKICAgIG1ha2VCdWYoIG1fdmFsX3RwLCBtX3NpemUsIG1fcGVyLCBtX2hyZF9n
cmQsIHZsICk7Cn0KCnZvaWQgVFZhbEJ1Zjo6c2V0U2l6ZSggaW50IHZsICkKewogICAgbWFrZUJ1
ZiggbV92YWxfdHAsIHZsLCBtX3BlciwgbV9ocmRfZ3JkLCBtX2hnX3Jlc190bSApOwp9Cgp2b2lk
IFRWYWxCdWY6OnNldFBlcmlvZCggbG9uZyBsb25nIHZsICkKewogICAgbWFrZUJ1ZiggbV92YWxf
dHAsIG1fc2l6ZSwgdmwsIG1faHJkX2dyZCwgbV9oZ19yZXNfdG0gKTsKfQoKdm9pZCBUVmFsQnVm
OjptYWtlQnVmKCBURmxkOjpUeXBlIHZfdHAsIGludCBpc3osIGxvbmcgbG9uZyBpcHIsIGJvb2wg
aGRfZ3JkLCBib29sIGhnX3JlcyApCnsKICAgIFJlc0FsbG9jIHJlcyhiX3Jlcyx0cnVlKTsKCiAg
ICAvL0Rlc3Ryb3kgYnVmZmVyCiAgICBpZiggdl90cCAhPSBtX3ZhbF90cCAmJiBidWYuYmwgKQog
ICAgewoJc3dpdGNoKG1fdmFsX3RwKQoJewoJICAgIGNhc2UgVEZsZDo6Qm9vbGVhbjoJZGVsZXRl
IGJ1Zi5ibDsJYnJlYWs7CgkgICAgY2FzZSBURmxkOjpJbnRlZ2VyOglkZWxldGUgYnVmLmRlYzsJ
YnJlYWs7CgkgICAgY2FzZSBURmxkOjpSZWFsOglkZWxldGUgYnVmLnJlYWw7YnJlYWs7CgkgICAg
Y2FzZSBURmxkOjpTdHJpbmc6CWRlbGV0ZSBidWYuc3RyOwlicmVhazsKCX0KCWJ1Zi5ibCA9IE5V
TEw7CiAgICB9CgogICAgaWYoICFidWYuYmwgKQogICAgewoJLy9NYWtlIG5ldyBidWZmZXIKCXN3
aXRjaCh2X3RwKQoJewoJICAgIGNhc2UgVEZsZDo6Qm9vbGVhbjoJYnVmLmJsID0gbmV3IFRCdWY8
Y2hhcj4oRVZBTF9CT09MLG1fc2l6ZSxtX3BlcixtX2hyZF9ncmQsbV9oZ19yZXNfdG0sbV9lbmQs
bV9iZWcpOwlicmVhazsKCSAgICBjYXNlIFRGbGQ6OkludGVnZXI6CWJ1Zi5kZWMgPSBuZXcgVEJ1
ZjxpbnQ+KEVWQUxfSU5ULG1fc2l6ZSxtX3BlcixtX2hyZF9ncmQsbV9oZ19yZXNfdG0sbV9lbmQs
bV9iZWcpOwlicmVhazsKCSAgICBjYXNlIFRGbGQ6OlJlYWw6CWJ1Zi5yZWFsID0gbmV3IFRCdWY8
ZG91YmxlPihFVkFMX1JFQUwsbV9zaXplLG1fcGVyLG1faHJkX2dyZCxtX2hnX3Jlc190bSxtX2Vu
ZCxtX2JlZyk7CWJyZWFrOwoJICAgIGNhc2UgVEZsZDo6U3RyaW5nOglidWYuc3RyID0gbmV3IFRC
dWY8c3RyaW5nPihFVkFMX1NUUixtX3NpemUsbV9wZXIsbV9ocmRfZ3JkLG1faGdfcmVzX3RtLG1f
ZW5kLG1fYmVnKTsJYnJlYWs7Cgl9CgltX3ZhbF90cCA9IHZfdHA7CiAgICB9CiAgICBpZiggaXN6
ICE9IG1fc2l6ZSB8fCBpcHIgIT0gbV9wZXIgfHwgaGRfZ3JkICE9IG1faHJkX2dyZCB8fCBoZ19y
ZXMgIT0gbV9oZ19yZXNfdG0gKQoJc3dpdGNoKG1fdmFsX3RwKQoJewoJICAgIGNhc2UgVEZsZDo6
Qm9vbGVhbjoJYnVmLmJsLT5tYWtlQnVmKGlzeiwgaXByLCBoZF9ncmQsIGhnX3Jlcyk7CWJyZWFr
OwoJICAgIGNhc2UgVEZsZDo6SW50ZWdlcjoJYnVmLmRlYy0+bWFrZUJ1Zihpc3osIGlwciwgaGRf
Z3JkLCBoZ19yZXMpOwlicmVhazsKCSAgICBjYXNlIFRGbGQ6OlJlYWw6CWJ1Zi5yZWFsLT5tYWtl
QnVmKGlzeiwgaXByLCBoZF9ncmQsIGhnX3Jlcyk7CWJyZWFrOwoJICAgIGNhc2UgVEZsZDo6U3Ry
aW5nOglidWYuc3RyLT5tYWtlQnVmKGlzeiwgaXByLCBoZF9ncmQsIGhnX3Jlcyk7CWJyZWFrOwoJ
fQp9CgpzdHJpbmcgVFZhbEJ1Zjo6Z2V0UyggbG9uZyBsb25nICppdG0sIGJvb2wgdXBfb3JkICkK
ewogICAgc3dpdGNoKHZhbFR5cGUoKSkKICAgIHsKCWNhc2UgVEZsZDo6Qm9vbGVhbjoKCSAgICB7
IGNoYXIgdmwgPSBnZXRCKGl0bSx1cF9vcmQpOyByZXR1cm4gKHZsPT1FVkFMX0JPT0wpP0VWQUxf
U1RSOlRTWVM6OmludDJzdHIoKGJvb2wpdmwpOyB9CgljYXNlIFRGbGQ6OkludGVnZXI6CgkgICAg
eyBpbnQgdmwgPSBnZXRJKGl0bSx1cF9vcmQpOyByZXR1cm4gKHZsPT1FVkFMX0lOVCk/RVZBTF9T
VFI6VFNZUzo6aW50MnN0cih2bCk7IH0KCWNhc2UgVEZsZDo6UmVhbDoKCSAgICB7IGRvdWJsZSB2
bCA9IGdldFIoaXRtLHVwX29yZCk7IHJldHVybiAodmw9PUVWQUxfUkVBTCk/RVZBTF9TVFI6VFNZ
Uzo6cmVhbDJzdHIodmwpOyB9CgljYXNlIFRGbGQ6OlN0cmluZzoKCSAgICBSZXNBbGxvYyByZXMo
Yl9yZXMsZmFsc2UpOyByZXR1cm4gYnVmLnN0ci0+Z2V0KGl0bSx1cF9vcmQpOwogICAgfQogICAg
cmV0dXJuIEVWQUxfU1RSOwp9Cgpkb3VibGUgVFZhbEJ1Zjo6Z2V0UiggbG9uZyBsb25nICppdG0s
IGJvb2wgdXBfb3JkICkKewogICAgc3dpdGNoKHZhbFR5cGUoKSkKICAgIHsKCWNhc2UgVEZsZDo6
Qm9vbGVhbjoKCSAgICB7IGNoYXIgdmwgPSBnZXRCKGl0bSx1cF9vcmQpOyByZXR1cm4gKHZsPT1F
VkFMX0JPT0wpP0VWQUxfUkVBTDooYm9vbCl2bDsgfQoJY2FzZSBURmxkOjpJbnRlZ2VyOgoJICAg
IHsgaW50IHZsID0gZ2V0SShpdG0sdXBfb3JkKTsgcmV0dXJuICh2bD09RVZBTF9JTlQpP0VWQUxf
UkVBTDooZG91YmxlKXZsOyB9CgljYXNlIFRGbGQ6OlN0cmluZzoKCSAgICB7IHN0cmluZyB2bCA9
IGdldFMoaXRtLHVwX29yZCk7IHJldHVybiAodmw9PUVWQUxfU1RSKT9FVkFMX1JFQUw6YXRvZih2
bC5jX3N0cigpKTsgfQoJY2FzZSBURmxkOjpSZWFsOgoJICAgIFJlc0FsbG9jIHJlcyhiX3Jlcyxm
YWxzZSk7IHJldHVybiBidWYucmVhbC0+Z2V0KGl0bSx1cF9vcmQpOwogICAgfQogICAgcmV0dXJu
IEVWQUxfUkVBTDsKfQoKaW50IFRWYWxCdWY6OmdldEkoIGxvbmcgbG9uZyAqaXRtLCBib29sIHVw
X29yZCApCnsKICAgIHN3aXRjaCh2YWxUeXBlKCkpCiAgICB7CgljYXNlIFRGbGQ6OkJvb2xlYW46
CgkgICAgeyBjaGFyIHZsID0gZ2V0QihpdG0sdXBfb3JkKTsgcmV0dXJuICh2bD09RVZBTF9CT09M
KT9FVkFMX0lOVDooYm9vbCl2bDsgfQoJY2FzZSBURmxkOjpTdHJpbmc6CgkgICAgeyBzdHJpbmcg
dmwgPSBnZXRTKGl0bSx1cF9vcmQpOyByZXR1cm4gKHZsPT1FVkFMX1NUUik/RVZBTF9JTlQ6YXRv
aSh2bC5jX3N0cigpKTsgfQoJY2FzZSBURmxkOjpSZWFsOgoJICAgIHsgZG91YmxlIHZsID0gZ2V0
UihpdG0sdXBfb3JkKTsgcmV0dXJuICh2bD09RVZBTF9SRUFMKT9FVkFMX0lOVDooaW50KXZsOyB9
CgljYXNlIFRGbGQ6OkludGVnZXI6CgkgICAgUmVzQWxsb2MgcmVzKGJfcmVzLGZhbHNlKTsgcmV0
dXJuIGJ1Zi5kZWMtPmdldChpdG0sdXBfb3JkKTsKICAgIH0KICAgIHJldHVybiBFVkFMX0lOVDsK
fQoKY2hhciBUVmFsQnVmOjpnZXRCKCBsb25nIGxvbmcgKml0bSwgYm9vbCB1cF9vcmQgKQp7CiAg
ICBzd2l0Y2godmFsVHlwZSgpKQogICAgewoJY2FzZSBURmxkOjpJbnRlZ2VyOgoJICAgIHsgaW50
IHZsID0gZ2V0SShpdG0sdXBfb3JkKTsgcmV0dXJuICh2bD09RVZBTF9JTlQpP0VWQUxfQk9PTDoo
Ym9vbCl2bDsgfQoJY2FzZSBURmxkOjpTdHJpbmc6CgkgICAgeyBzdHJpbmcgdmwgPSBnZXRTKGl0
bSx1cF9vcmQpOyByZXR1cm4gKHZsPT1FVkFMX1NUUik/RVZBTF9CT09MOihib29sKWF0b2kodmwu
Y19zdHIoKSk7IH0KCWNhc2UgVEZsZDo6UmVhbDoKCSAgICB7IGRvdWJsZSB2bCA9IGdldFIoaXRt
LHVwX29yZCk7IHJldHVybiAodmw9PUVWQUxfUkVBTCk/RVZBTF9CT09MOihib29sKXZsOyB9Cglj
YXNlIFRGbGQ6OkJvb2xlYW46CgkgICAgUmVzQWxsb2MgcmVzKGJfcmVzLGZhbHNlKTsgcmV0dXJu
IGJ1Zi5ibC0+Z2V0KGl0bSx1cF9vcmQpOwogICAgfQogICAgcmV0dXJuIEVWQUxfQk9PTDsKfQoK
dm9pZCBUVmFsQnVmOjpzZXRTKCBjb25zdCBzdHJpbmcgJnZhbHVlLCBsb25nIGxvbmcgdG0gKQp7
CiAgICBzd2l0Y2godmFsVHlwZSgpKQogICAgewoJY2FzZSBURmxkOjpCb29sZWFuOgoJICAgIHNl
dEIoKHZhbHVlPT1FVkFMX1NUUik/RVZBTF9CT09MOihib29sKWF0b2kodmFsdWUuY19zdHIoKSks
dG0pOwlicmVhazsKCWNhc2UgVEZsZDo6SW50ZWdlcjoKCSAgICBzZXRJKCh2YWx1ZT09RVZBTF9T
VFIpP0VWQUxfSU5UOmF0b2kodmFsdWUuY19zdHIoKSksdG0pOwlicmVhazsKCWNhc2UgVEZsZDo6
UmVhbDoKCSAgICBzZXRSKCh2YWx1ZT09RVZBTF9TVFIpP0VWQUxfUkVBTDphdG9mKHZhbHVlLmNf
c3RyKCkpLHRtKTsJYnJlYWs7CgljYXNlIFRGbGQ6OlN0cmluZzoKCSAgICBSZXNBbGxvYyByZXMo
Yl9yZXMsdHJ1ZSk7IGJ1Zi5zdHItPnNldCh2YWx1ZSx0bSk7CQlicmVhazsKICAgIH0KfQoKdm9p
ZCBUVmFsQnVmOjpzZXRSKCBkb3VibGUgdmFsdWUsIGxvbmcgbG9uZyB0bSApCnsKICAgIHN3aXRj
aCh2YWxUeXBlKCkpCiAgICB7CgljYXNlIFRGbGQ6OkJvb2xlYW46CgkgICAgc2V0QigodmFsdWU9
PUVWQUxfUkVBTCk/RVZBTF9CT09MOihib29sKXZhbHVlLHRtKTsJYnJlYWs7CgljYXNlIFRGbGQ6
OkludGVnZXI6CgkgICAgc2V0SSgodmFsdWU9PUVWQUxfUkVBTCk/RVZBTF9JTlQ6KGludCl2YWx1
ZSx0bSk7CWJyZWFrOwoJY2FzZSBURmxkOjpTdHJpbmc6CgkgICAgc2V0UygodmFsdWU9PUVWQUxf
UkVBTCk/RVZBTF9TVFI6VFNZUzo6cmVhbDJzdHIodmFsdWUpLHRtKTsJYnJlYWs7CgljYXNlIFRG
bGQ6OlJlYWw6CgkgICAgUmVzQWxsb2MgcmVzKGJfcmVzLHRydWUpOyBidWYucmVhbC0+c2V0KHZh
bHVlLHRtKTsJYnJlYWs7CiAgICB9Cn0KCnZvaWQgVFZhbEJ1Zjo6c2V0SSggaW50IHZhbHVlLCBs
b25nIGxvbmcgdG0gKQp7CiAgICBzd2l0Y2godmFsVHlwZSgpKQogICAgewoJY2FzZSBURmxkOjpC
b29sZWFuOgoJICAgIHNldEIoKHZhbHVlPT1FVkFMX0lOVCk/RVZBTF9CT09MOihib29sKXZhbHVl
LHRtKTsJYnJlYWs7CgljYXNlIFRGbGQ6OlN0cmluZzoKCSAgICBzZXRTKCh2YWx1ZT09RVZBTF9J
TlQpP0VWQUxfU1RSOlRTWVM6OmludDJzdHIodmFsdWUpLHRtKTsJYnJlYWs7CgljYXNlIFRGbGQ6
OlJlYWw6CgkgICAgc2V0UigodmFsdWU9PUVWQUxfSU5UKT9FVkFMX1JFQUw6dmFsdWUsdG0pOwkJ
YnJlYWs7CgljYXNlIFRGbGQ6OkludGVnZXI6CgkgICAgUmVzQWxsb2MgcmVzKGJfcmVzLHRydWUp
OyBidWYuZGVjLT5zZXQodmFsdWUsdG0pOwlicmVhazsKICAgIH0KfQoKdm9pZCBUVmFsQnVmOjpz
ZXRCKCBjaGFyIHZhbHVlLCBsb25nIGxvbmcgdG0gKQp7CiAgICBzd2l0Y2godmFsVHlwZSgpKQog
ICAgewoJY2FzZSBURmxkOjpJbnRlZ2VyOgoJICAgIHNldEkoKHZhbHVlPT1FVkFMX0JPT0wpP0VW
QUxfSU5UOihib29sKXZhbHVlLHRtKTsJYnJlYWs7CgljYXNlIFRGbGQ6OlN0cmluZzoKCSAgICBz
ZXRTKCh2YWx1ZT09RVZBTF9CT09MKT9FVkFMX1NUUjpUU1lTOjppbnQyc3RyKChib29sKXZhbHVl
KSx0bSk7CWJyZWFrOwoJY2FzZSBURmxkOjpSZWFsOgoJICAgIHNldFIoKHZhbHVlPT1FVkFMX0JP
T0wpP0VWQUxfUkVBTDooYm9vbCl2YWx1ZSx0bSk7CWJyZWFrOwoJY2FzZSBURmxkOjpCb29sZWFu
OgoJICAgIFJlc0FsbG9jIHJlcyhiX3Jlcyx0cnVlKTsgYnVmLmJsLT5zZXQodmFsdWUsdG0pOwli
cmVhazsKICAgIH0KfQoKdm9pZCBUVmFsQnVmOjpnZXRWYWwoIFRWYWxCdWYgJmJ1ZiwgbG9uZyBs
b25nIGliZWcsIGxvbmcgbG9uZyBpZW5kICkKewogICAgaWYoIXZPSyhpYmVnLGllbmQpKQlyZXR1
cm47CiAgICBpYmVnID0gdm1heChpYmVnLGJlZ2luKCkpOwogICAgaWVuZCA9IHZtaW4oaWVuZCxl
bmQoKSk7CgogICAgd2hpbGUoaWJlZzxpZW5kKQogICAgewoJc3dpdGNoKHZhbFR5cGUoKSkKCXsK
CSAgICBjYXNlIFRGbGQ6OkJvb2xlYW46CgkgICAgewoJCWNoYXIgdmFsID0gZ2V0QigmaWJlZyx0
cnVlKTsKCQlidWYuc2V0Qih2YWwsaWJlZyk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGNhc2UgVEZs
ZDo6SW50ZWdlcjoKCSAgICB7CgkJaW50IHZhbCA9IGdldEkoJmliZWcsdHJ1ZSk7CgkJYnVmLnNl
dEkodmFsLGliZWcpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBjYXNlIFRGbGQ6OlJlYWw6CgkgICAg
ewoJCWRvdWJsZSB2YWwgPSBnZXRSKCZpYmVnLHRydWUpOwoJCWJ1Zi5zZXRSKHZhbCxpYmVnKTsK
CQlicmVhazsKCSAgICB9CgkgICAgY2FzZSBURmxkOjpTdHJpbmc6CgkgICAgewoJCXN0cmluZyB2
YWwgPSBnZXRTKCZpYmVnLHRydWUpOwoJCWJ1Zi5zZXRTKHZhbCxpYmVnKTsKCQlicmVhazsKCSAg
ICB9Cgl9CiAgICAgICAgaWJlZysrOwogICAgfQp9Cgp2b2lkIFRWYWxCdWY6OnNldFZhbCggVFZh
bEJ1ZiAmYnVmLCBsb25nIGxvbmcgaWJlZywgbG9uZyBsb25nIGllbmQgKQp7CiAgICBidWYuZ2V0
VmFsKCAqdGhpcywgaWJlZywgaWVuZCApOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKLy8qIFRWYWxCdWY6OlRCdWYgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAqCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKgp0ZW1wbGF0ZSA8Y2xhc3MgVHBWYWw+IFRWYWxCdWY6OlRCdWY8VHBWYWw+
OjpUQnVmKCBUcFZhbCBpZXZhbCwgaW50ICZpc3osIGxvbmcgbG9uZyAmaXByLCBib29sICZpaGdy
ZCwgYm9vbCAmaWhyZXMsIGxvbmcgbG9uZyYgaWVuZCwgbG9uZyBsb25nJiBpYmVnICkgOgogICAg
ZXZhbChpZXZhbCksIHNpemUoaXN6KSwgcGVyKGlwciksIGhyZF9ncmQoaWhncmQpLCBoZ19yZXNf
dG0oaWhyZXMpLCBlbmQoaWVuZCksIGJlZyhpYmVnKSwgY3VyKDApCnsKICAgIGJ1Zi5ncmlkID0g
TlVMTDsKCiAgICBtYWtlQnVmKHNpemUscGVyLGhyZF9ncmQsaGdfcmVzX3RtKTsKfQoKdGVtcGxh
dGUgPGNsYXNzIFRwVmFsPiBUVmFsQnVmOjpUQnVmPFRwVmFsPjo6flRCdWYoICkKewogICAgaWYo
IGhyZF9ncmQgKQkJZGVsZXRlIGJ1Zi5ncmlkOwogICAgZWxzZSBpZiggaGdfcmVzX3RtICkJZGVs
ZXRlIGJ1Zi50bV9oaWdoOwogICAgZWxzZQkJCWRlbGV0ZSBidWYudG1fbG93Owp9Cgp0ZW1wbGF0
ZSA8Y2xhc3MgVHBWYWw+IHZvaWQgVFZhbEJ1Zjo6VEJ1ZjxUcFZhbD46OmNsZWFyKCkKewogICAg
aWYoICFidWYuZ3JpZCApCXJldHVybjsKICAgIGlmKCBocmRfZ3JkICkJYnVmLmdyaWQtPmNsZWFy
KCk7CiAgICBlbHNlIGlmKGhnX3Jlc190bSkJYnVmLnRtX2hpZ2gtPmNsZWFyKCk7CiAgICBlbHNl
CQlidWYudG1fbG93LT5jbGVhcigpOwogICAgY3VyID0gZW5kID0gYmVnID0gMDsKfQoKdGVtcGxh
dGUgPGNsYXNzIFRwVmFsPiBpbnQgVFZhbEJ1Zjo6VEJ1ZjxUcFZhbD46OnJlYWxTaXplKCkKewog
ICAgaWYoICFidWYuZ3JpZCApCXJldHVybiAwOwogICAgaWYoIGhyZF9ncmQgKQlyZXR1cm4gYnVm
LmdyaWQtPnNpemUoKTsKICAgIGVsc2UgaWYoaGdfcmVzX3RtKQlyZXR1cm4gYnVmLnRtX2hpZ2gt
PnNpemUoKTsKICAgIGVsc2UJCXJldHVybiBidWYudG1fbG93LT5zaXplKCk7Cn0KCnRlbXBsYXRl
IDxjbGFzcyBUcFZhbD4gdm9pZCBUVmFsQnVmOjpUQnVmPFRwVmFsPjo6bWFrZUJ1ZiggaW50IGlz
eiwgbG9uZyBsb25nIGlwciwgYm9vbCBpaGRfZ3JkLCBib29sIGloZ19yZXMgKQp7CiAgICBib29s
IHJlY3JfYnVmID0gZmFsc2U7CiAgICBpZiggIWJ1Zi5ncmlkICkJCXJlY3JfYnVmID0gdHJ1ZTsK
ICAgIGlmKCBpc3ogPCBzaXplICkJCXJlY3JfYnVmID0gdHJ1ZTsKICAgIGlmKCBocmRfZ3JkICE9
IGloZF9ncmQgKQogICAgewoJaWYoIGloZF9ncmQgJiYgIWlwciApCWlwciA9IDEwMDAwMDA7Cgly
ZWNyX2J1ZiA9dHJ1ZTsKICAgIH0KICAgIGlmKCBoZ19yZXNfdG0gIT0gaWhnX3JlcyApCXJlY3Jf
YnVmID10cnVlOwogICAgaWYoIHBlciAhPSBpcHIgKQogICAgewoJaWYoIGhyZF9ncmQgJiYgIWlw
ciApCWlwciA9IDEwMDAwMDA7CglyZWNyX2J1ZiA9dHJ1ZTsKICAgIH0KCiAgICBzaXplID0gaXN6
OwogICAgaHJkX2dyZCA9IGloZF9ncmQ7CiAgICBoZ19yZXNfdG0gPSBpaGdfcmVzOwogICAgcGVy
ID0gaXByOwoKICAgIGlmKHJlY3JfYnVmKQogICAgewoJLy8tIERlc3Ryb3kgYnVmZmVyIC0KCWN1
ciA9IGVuZCA9IGJlZyA9IDA7CglpZiggYnVmLmdyaWQgKQoJewoJICAgIGlmKCBocmRfZ3JkICkJ
CWRlbGV0ZSBidWYuZ3JpZDsKCSAgICBlbHNlIGlmKCBoZ19yZXNfdG0gKQlkZWxldGUgYnVmLnRt
X2hpZ2g7CgkgICAgZWxzZQkJCWRlbGV0ZSBidWYudG1fbG93OwoJfQoJYnVmLmdyaWQgPSBOVUxM
OwoKCS8vLSBNYWtlIG5ldyBidWZmZXIgLQoJaWYoIGloZF9ncmQgKQlidWYuZ3JpZCA9IG5ldyB2
ZWN0b3I8VHBWYWw+OwoJZWxzZSBpZihpaGdfcmVzKWJ1Zi50bV9oaWdoID0gbmV3IHZlY3RvcjxT
SGc+OwoJZWxzZQkJYnVmLnRtX2xvdyA9IG5ldyB2ZWN0b3I8U0x3PjsKICAgIH0KfQoKdGVtcGxh
dGUgPGNsYXNzIFRwVmFsPiBUcFZhbCBUVmFsQnVmOjpUQnVmPFRwVmFsPjo6Z2V0KCBsb25nIGxv
bmcgKml0bSwgYm9vbCB1cF9vcmQgKQp7CiAgICBsb25nIGxvbmcgdG0gPSAoaXRtKT8oKml0bSk6
VFNZUzo6Y3VyVGltZSgpOwoKICAgIGlmKCh1cF9vcmQgJiYgdG0gPiBlbmQpIHx8ICghdXBfb3Jk
ICYmIHRtIDwgYmVnKSkKCXRocm93IFRFcnJvcigiVmFsQnVmIixfKCJWYWx1ZSBpcyBub3QgcHJl
c2VudC4iKSk7CiAgICBpZiggaHJkX2dyZCApCiAgICB7CgkvLy0gUHJvY2VzcyBoYXJkIGdyaWQg
YnVmZmVyIC0KCWludCBucG9zID0gdXBfb3JkPyhlbmQtdG0pL3BlcjoobG9uZyBsb25nKWJ1Zi5n
cmlkLT5zaXplKCktMS0odG0tYmVnKS9wZXI7CglpZiggbnBvcyA8IDAgfHwgbnBvcyA+PSBidWYu
Z3JpZC0+c2l6ZSgpICkgeyBpZihpdG0pICppdG0gPSAwOyByZXR1cm4gZXZhbDsgfQoJaWYoaXRt
KQkqaXRtID0gZW5kLW5wb3MqcGVyOwoJcmV0dXJuICgqYnVmLmdyaWQpWygoY3VyLW5wb3MtMSk+
PTApPyhjdXItbnBvcy0xKTooYnVmLmdyaWQtPnNpemUoKSsoY3VyLW5wb3MtMSkpXTsKICAgIH0K
ICAgIGVsc2UgaWYoIHBlciApCiAgICB7CgkvLy0gUHJvY2VzcyBzb2Z0IGdyaWQgYnVmZmVyIC0K
CWludCBucG9zID0gKHVwX29yZD8oZW5kLXRtKToodG0tYmVnKSkvcGVyOwoJaWYoIGhnX3Jlc190
bSApCgl7CgkgICAgaW50IGNfY3VyICA9IChjdXIpP2N1ci0xOmJ1Zi50bV9oaWdoLT5zaXplKCkt
MTsKCSAgICBpbnQgY19lbmQgPSBjX2N1cjsKCSAgICBkbwoJICAgIHsKCQlpbnQgd19wb3MgPSAo
dXBfb3JkP2VuZC0oKmJ1Zi50bV9oaWdoKVtjX2VuZF0udG06KCpidWYudG1faGlnaClbY19lbmRd
LnRtLWJlZykvcGVyOwoJCWlmKCB1cF9vcmQgJiYgd19wb3MgPj0gbnBvcyApCgkJewoJCSAgICBp
ZihpdG0pICppdG0gPSAod19wb3M9PW5wb3MpPygqYnVmLnRtX2hpZ2gpW2NfZW5kXS50bTplbmQt
bnBvcypwZXI7CgkJICAgIHJldHVybiAoKmJ1Zi50bV9oaWdoKVtjX2VuZF0udmFsOwoJCX0KCQll
bHNlIGlmKCAhdXBfb3JkICYmIHdfcG9zIDw9IG5wb3MgKQoJCXsKCQkgICAgaWYoaXRtKSAqaXRt
ID0gKHdfcG9zPT1ucG9zKT8oKmJ1Zi50bV9oaWdoKVtjX2VuZF0udG06YmVnK25wb3MqcGVyOwoJ
CSAgICByZXR1cm4gKCpidWYudG1faGlnaClbY19lbmRdLnZhbDsKCQl9CgkJaWYoIC0tY19lbmQg
PCAwICkgY19lbmQgPSBidWYudG1faGlnaC0+c2l6ZSgpLTE7CgkgICAgfXdoaWxlKGNfZW5kICE9
IGNfY3VyKTsKCgkgICAgaWYoaXRtKSAqaXRtID0gMDsKCSAgICByZXR1cm4gZXZhbDsKCX0KCWVs
c2UKCXsKCSAgICBpbnQgY19jdXIgPSAoY3VyKT9jdXItMTpidWYudG1fbG93LT5zaXplKCktMTsK
CSAgICBpbnQgY19lbmQgPSBjX2N1cjsKCSAgICBkbwoJICAgIHsKCQlpbnQgd19wb3MgPSAodXBf
b3JkP2VuZC0obG9uZyBsb25nKSgqYnVmLnRtX2xvdylbY19lbmRdLnRtKjEwMDAwMDA6KGxvbmcg
bG9uZykoKmJ1Zi50bV9sb3cpW2NfZW5kXS50bSoxMDAwMDAwLWJlZykvcGVyOwoJCWlmKCB1cF9v
cmQgJiYgd19wb3MgPj0gbnBvcyApCgkJewoJCSAgICBpZihpdG0pICppdG0gPSAod19wb3M9PW5w
b3MpPyhsb25nIGxvbmcpKCpidWYudG1fbG93KVtjX2VuZF0udG0qMTAwMDAwMDplbmQtbnBvcypw
ZXI7CgkJICAgIHJldHVybiAoKmJ1Zi50bV9sb3cpW2NfZW5kXS52YWw7CgkJfQoJCWlmKCAhdXBf
b3JkICYmIHdfcG9zIDw9IG5wb3MgKQoJCXsKCQkgICAgaWYoaXRtKSAqaXRtID0gKHdfcG9zPT1u
cG9zKT8obG9uZyBsb25nKSgqYnVmLnRtX2xvdylbY19lbmRdLnRtKjEwMDAwMDA6YmVnK25wb3Mq
cGVyOwoJCSAgICByZXR1cm4gKCpidWYudG1fbG93KVtjX2VuZF0udmFsOwoJCX0KCQlpZiggLS1j
X2VuZCA8IDAgKSBjX2VuZCA9IGJ1Zi50bV9sb3ctPnNpemUoKS0xOwoJICAgIH13aGlsZShjX2Vu
ZCAhPSBjX2N1cik7CgoJICAgIGlmKGl0bSkgKml0bSA9IDA7CgkgICAgcmV0dXJuIGV2YWw7Cgl9
CiAgICB9CiAgICBlbHNlCiAgICB7CgkvLy0gUHJvY2Nlc3MgZmxvdyBidWZmZXIgLQoJaWYoIGhn
X3Jlc190bSApCgl7CgkgICAgaW50IGNfZW5kID0gYnVmLnRtX2hpZ2gtPnNpemUoKS0xOwoJICAg
IC8vLS0gSGFsZiBkaXZpZGVyIC0tCgkgICAgZm9yKCBpbnQgZF93aW4gPSBjX2VuZC8yOyBkX3dp
biA+IDEwOyBkX3dpbi89MiApCgkJaWYoICEoKCF1cF9vcmQgJiYgdG0gPj0gKCpidWYudG1faGln
aClbY19lbmQtZF93aW5dLnRtKSB8fAoJCQkodXBfb3JkICYmIHRtIDw9ICgqYnVmLnRtX2hpZ2gp
W2J1Zi50bV9oaWdoLT5zaXplKCktKGNfZW5kLWRfd2luKS0xXS50bSkpICkKCQkgICAgY19lbmQt
PWRfd2luOwoJICAgIC8vLS0gU2NhbiBsYXN0IHdpbmRvdyAtLQoJICAgIHdoaWxlKGNfZW5kID49
IDApCgkgICAgewoJCWlmKCAhdXBfb3JkICYmIHRtID49ICgqYnVmLnRtX2hpZ2gpW2NfZW5kXS50
bSApCgkJewoJCSAgICBpZihpdG0pICppdG0gPSAoKmJ1Zi50bV9oaWdoKVtjX2VuZF0udG07CgkJ
ICAgIHJldHVybiAoKmJ1Zi50bV9oaWdoKVtjX2VuZF0udmFsOwoJCX0KCQllbHNlIGlmKCB1cF9v
cmQgJiYgdG0gPD0gKCpidWYudG1faGlnaClbYnVmLnRtX2hpZ2gtPnNpemUoKS1jX2VuZC0xXS50
bSApCgkJewoJCSAgICBpZihpdG0pICppdG0gPSAoKmJ1Zi50bV9oaWdoKVtidWYudG1faGlnaC0+
c2l6ZSgpLWNfZW5kLTFdLnRtOwoJCSAgICByZXR1cm4gKCpidWYudG1faGlnaClbYnVmLnRtX2hp
Z2gtPnNpemUoKS1jX2VuZC0xXS52YWw7CgkJfQoJCWNfZW5kLS07CgkgICAgfQoJICAgIGlmKGl0
bSkgKml0bSA9IDA7CgkgICAgcmV0dXJuIGV2YWw7Cgl9CgllbHNlCgl7CgkgICAgaW50IGNfZW5k
ID0gYnVmLnRtX2xvdy0+c2l6ZSgpLTE7CgkgICAgLy8tLSBIYWxmIGRpdmlkZXIgLS0KCSAgICBm
b3IoIGludCBkX3dpbiA9IGNfZW5kLzI7IGRfd2luPjEwOyBkX3dpbi89MiApCgkJaWYoICEoKCF1
cF9vcmQgJiYgdG0vMTAwMDAwMCA+PSAoKmJ1Zi50bV9sb3cpW2NfZW5kLWRfd2luXS50bSkgfHwK
CQkJKHVwX29yZCAmJiB0bSA8PSAobG9uZyBsb25nKSgqYnVmLnRtX2xvdylbYnVmLnRtX2xvdy0+
c2l6ZSgpLShjX2VuZC1kX3dpbiktMV0udG0qMTAwMDAwMCkpICkKCQkgICAgY19lbmQtPWRfd2lu
OwoJICAgIC8vLS0gU2NhbiBsYXN0IHdpbmRvdyAtLQoJICAgIHdoaWxlKGNfZW5kID49IDApCgkg
ICAgewoJCWlmKCAhdXBfb3JkICYmIHRtLzEwMDAwMDAgPj0gKCpidWYudG1fbG93KVtjX2VuZF0u
dG0gKQoJCXsKCQkgICAgaWYoaXRtKSAqaXRtID0gKGxvbmcgbG9uZykoKmJ1Zi50bV9sb3cpW2Nf
ZW5kXS50bSoxMDAwMDAwOwoJCSAgICByZXR1cm4gKCpidWYudG1fbG93KVtjX2VuZF0udmFsOwoJ
CX0KCQllbHNlIGlmKCB1cF9vcmQgJiYgdG0gPD0gKGxvbmcgbG9uZykoKmJ1Zi50bV9sb3cpW2J1
Zi50bV9sb3ctPnNpemUoKS1jX2VuZC0xXS50bSoxMDAwMDAwICkKCQl7CgkJICAgIGlmKGl0bSkg
Kml0bSA9IChsb25nIGxvbmcpKCpidWYudG1fbG93KVtidWYudG1fbG93LT5zaXplKCktY19lbmQt
MV0udG0qMTAwMDAwMDsKCQkgICAgcmV0dXJuICgqYnVmLnRtX2xvdylbYnVmLnRtX2xvdy0+c2l6
ZSgpLWNfZW5kLTFdLnZhbDsKCQl9CgkJY19lbmQtLTsKCSAgICB9CgkgICAgaWYoaXRtKSAqaXRt
ID0gMDsKCSAgICByZXR1cm4gZXZhbDsKCX0KICAgIH0KfQoKdGVtcGxhdGUgPGNsYXNzIFRwVmFs
PiB2b2lkIFRWYWxCdWY6OlRCdWY8VHBWYWw+OjpzZXQoIFRwVmFsIHZhbHVlLCBsb25nIGxvbmcg
dG0gKQp7CiAgICBpZiggIXRtICkJdG0gPSBUU1lTOjpjdXJUaW1lKCk7CiAgICBpZiggIWVuZCAp
CWVuZCA9IChwZXIpID8gcGVyKih0bS9wZXItMSkgOiB0bTsKICAgIGlmKCAhYmVnICkJYmVnID0g
KHBlcikgPyBwZXIqKHRtL3BlcikgOiB0bTsKCiAgICBpZiggaHJkX2dyZCApCiAgICB7CgkvLy0g
UHJvY2VzcyBoYXJkIGdyaWQgYnVmZmVyIC0KCWludCBucG9zID0gKHRtLWVuZCkvcGVyOwoJLy8t
LSBTZXQgdmFsdWUgLS0KCWlmKCAhbnBvcyApCgl7CgkgICAgKCpidWYuZ3JpZClbIChjdXIpID8g
Y3VyLTEgOiBidWYuZ3JpZC0+c2l6ZSgpLTEgXSA9IHZhbHVlOwkvL1VwZGF0ZSBsYXN0IHZhbHVl
CgkgICAgcmV0dXJuOwoJfQoJZWxzZSBpZiggbnBvcyA8IDAgKQl0aHJvdyBURXJyb3IoIlZhbEJ1
ZiIsXygiR3JpZCBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCBpbnNlcnRpbmcgb2xkIHZhbHVlcy4iKSk7
CgllbHNlCgkgICAgd2hpbGUoIG5wb3MtLSApCgkgICAgewoJCVRwVmFsIHdfdmFsID0gKG5wb3Mp
P2V2YWw6dmFsdWU7CgkJLy8tLS0gU2V0IG5ldyB2YWx1ZSAtLS0KCQlpZiggY3VyID49IGJ1Zi5n
cmlkLT5zaXplKCkgKQlidWYuZ3JpZC0+cHVzaF9iYWNrKHdfdmFsKTsKCQllbHNlCgkJewoJCSAg
ICBiZWcgKz0gcGVyOwoJCSAgICAoKmJ1Zi5ncmlkKVtjdXJdID0gd192YWw7CgkJfQoJCS8vLS0t
IFVwZGF0ZSBjdXJzb3IgLS0tCgkJaWYoICsrY3VyID49IHNpemUgKSBjdXIgPSAwOwoJCS8vLS0t
IFVwZGF0ZSBlbmQgdGltZSAtLS0KCQllbmQgKz0gcGVyOwoJICAgIH0KICAgIH0KICAgIGVsc2Ug
aWYoIHBlciApCiAgICB7CgkvLy0gUHJvY2VzcyBzb2Z0IGdyaWQgYnVmZmVyIC0KCWludCBucG9z
ID0gKHRtLWVuZCkvcGVyOwoJLy8tLSBTZXQgdmFsdWUgLS0KICAgICAgICBpZiggbnBvcyA8IDAg
KQl0aHJvdyBURXJyb3IoIlZhbEJ1ZiIsXygiR3JpZCBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCBpbnNl
cnRpbmcgb2xkIHZhbHVlcy4iKSk7CgllbHNlCgl7CgkgICAgaWYoIGhnX3Jlc190bSApCgkgICAg
ewoJCVNIZyBiX2VsOwoKCQkvLy0tLSBVcGRhdGUgY3VycmVudCBlbmQgdmFsdWUgLS0tCgkJaWYo
IG5wb3MgPT0gMCkKCQl7CgkJICAgIGJfZWwudG0gPSBlbmQ7CgkJICAgIGJfZWwudmFsID0gdmFs
dWU7CgkJICAgIGludCBoX2VsID0gKGN1cik/Y3VyLTE6YnVmLnRtX2hpZ2gtPnNpemUoKS0xOwoJ
CSAgICBpZiggKCgqYnVmLnRtX2hpZ2gpW2hfZWxdLnRtLWVuZCkvcGVyICkKCQkgICAgewoJCQkv
Ly0tLS0gV3JpdGUgbmV3IHZhbHVlIC0tLS0KCQkJaWYoY3VyID49IGJ1Zi50bV9oaWdoLT5zaXpl
KCkpIGJ1Zi50bV9oaWdoLT5wdXNoX2JhY2soYl9lbCk7CgkJCWVsc2UKCQkJewoJCQkgICAgaWYo
IGN1cisxID49IGJ1Zi50bV9oaWdoLT5zaXplKCkgKQoJCQkJYmVnID0gKCpidWYudG1faGlnaClb
MF0udG07CgkJCSAgICBlbHNlIGJlZyA9ICgqYnVmLnRtX2hpZ2gpW2N1cisxXS50bTsKCQkJICAg
IGJlZyA9IHBlciooYmVnL3Blcik7CgkJCSAgICAoKmJ1Zi50bV9oaWdoKVtjdXJdID0gYl9lbDsK
CQkJfQoJCQkvLy0tLS0gVXBkYXRlIGN1cnNvciAtLS0tCgkJCWlmKCArK2N1ciA+PSBzaXplICkg
Y3VyID0gMDsKCQkgICAgfQoJCSAgICBlbHNlICgqYnVmLnRtX2hpZ2gpW2hfZWxdID0gYl9lbDsK
CQkgICAgcmV0dXJuOwoJCX0KCgkJLy8tLS0gSW5zZXJ0IG5ldyB2YWx1ZSAtLS0tCgkJaW50IGNf
bnBvcyA9IG5wb3M7CgkJd2hpbGUoIGNfbnBvcy0tICkKCQl7CgkJICAgIC8vLS0tLSBQcmVwYXJl
IGRhdGEgLS0tLQoJCSAgICBpZihjX25wb3MpIAl7IGJfZWwudG0gPSBlbmQrKG5wb3MtY19ucG9z
KSpwZXI7ICBiX2VsLnZhbCA9IGV2YWw7IH0KCQkgICAgZWxzZQl7IGJfZWwudG0gPSB0bTsgYl9l
bC52YWwgPSB2YWx1ZTsgfQoJCSAgICAvLy0tLS0gQ2hlY2sgcHJldmlvdXMgdmFsdWUgLS0tLQoJ
CSAgICBpZiggIWJ1Zi50bV9oaWdoLT5zaXplKCkgfHwKCQkJICAgIChjdXIgJiYgKCpidWYudG1f
aGlnaClbY3VyLTFdLnZhbCAhPSBiX2VsLnZhbCApIHx8CgkJCSAgICAoIWN1ciAmJiAoKmJ1Zi50
bV9oaWdoKVtidWYudG1faGlnaC0+c2l6ZSgpLTFdLnZhbCAhPSBiX2VsLnZhbCkgKQoJCSAgICB7
CgkJCS8vLS0tLSBXcml0ZSBuZXcgdmFsdWUgLS0tLQoJCQlpZihjdXIgPj0gYnVmLnRtX2hpZ2gt
PnNpemUoKSkJYnVmLnRtX2hpZ2gtPnB1c2hfYmFjayhiX2VsKTsKCQkJZWxzZQoJCQl7CgkJCSAg
ICBpZiggY3VyKzEgPj0gYnVmLnRtX2hpZ2gtPnNpemUoKSApCgkJCQliZWcgPSAoKmJ1Zi50bV9o
aWdoKVswXS50bTsKCQkJICAgIGVsc2UgYmVnID0gKCpidWYudG1faGlnaClbY3VyKzFdLnRtOwoJ
CQkgICAgYmVnID0gcGVyKihiZWcvcGVyKTsKCQkJICAgICgqYnVmLnRtX2hpZ2gpW2N1cl09Yl9l
bDsKCQkJfQoJCQkvLy0tLS0gVXBkYXRlIGN1cnNvciAtLS0tCgkJCWlmKCArK2N1ciA+PSBzaXpl
ICkgY3VyID0gMDsKCQkgICAgfQoJCSAgICAvLy0tLS0gVXBkYXRlIGVuZCB0aW1lIC0tLS0KCQkg
ICAgZW5kICs9IHBlcjsKCQl9CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJU0x3IGJfZWw7CgoJ
CS8vLS0tIFVwZGF0ZSBjdXJyZW50IGVuZCB2YWx1ZSAtLS0KCQlpZiggbnBvcyA9PSAwKQoJCXsK
CQkgICAgYl9lbC50bSA9IGVuZC8xMDAwMDAwOwoJCSAgICBiX2VsLnZhbCA9IHZhbHVlOwoJCSAg
ICBpbnQgaF9lbCA9IChjdXIpID8gY3VyLTEgOiBidWYudG1fbG93LT5zaXplKCktMTsKCQkgICAg
aWYoICgobG9uZyBsb25nKSgqYnVmLnRtX2xvdylbaF9lbF0udG0qMTAwMDAwMC1lbmQpL3BlciAp
CgkJICAgIHsKCQkJLy8tLS0tIFdyaXRlIG5ldyB2YWx1ZSAtLS0tCgkJCWlmKCBjdXIgPj0gYnVm
LnRtX2xvdy0+c2l6ZSgpICkJYnVmLnRtX2xvdy0+cHVzaF9iYWNrKGJfZWwpOwoJCQllbHNlCgkJ
CXsKCQkJICAgIGlmKCBjdXIrMSA+PSBidWYudG1fbG93LT5zaXplKCkgKQoJCQkJYmVnID0gKGxv
bmcgbG9uZykoKmJ1Zi50bV9sb3cpWzBdLnRtICogMTAwMDAwMDsKCQkJICAgIGVsc2UgYmVnID0g
KGxvbmcgbG9uZykoKmJ1Zi50bV9sb3cpW2N1cisxXS50bSAqIDEwMDAwMDA7CgkJCSAgICBiZWcg
PSBwZXIqKGJlZy9wZXIpOwoJCQkgICAgKCpidWYudG1fbG93KVtjdXJdID0gYl9lbDsKCQkJfQoJ
CQkvLy0tLS0gVXBkYXRlIGN1cnNvciAtLS0tCgkJCWlmKCArK2N1ciA+PSBzaXplICkgY3VyID0g
MDsKCQkgICAgfQoJCSAgICBlbHNlICgqYnVmLnRtX2xvdylbaF9lbF0gPSBiX2VsOwoJCSAgICBy
ZXR1cm47CgkJfQoKCQkvLy0tLSBJbnNlcnQgbmV3IHZhbHVlIC0tLQoJCWludCBjX25wb3MgPSBu
cG9zOwoJCXdoaWxlKCBjX25wb3MtLSApCgkJewoJCSAgICAvLy0tLS0gUHJlcGFyZSBkYXRhIC0t
LS0KCQkgICAgaWYoY19ucG9zKQl7IGJfZWwudG0gPSAoZW5kKyhucG9zLWNfbnBvcykqcGVyKS8x
MDAwMDAwOyBiX2VsLnZhbCA9IGV2YWw7IH0KCQkgICAgZWxzZQl7IGJfZWwudG0gPSB0bS8xMDAw
MDAwOyBiX2VsLnZhbCA9IHZhbHVlOyB9CgkJICAgIC8vLS0tLSBDaGVjayBwcmV2aW91cyB2YWx1
ZSAtLS0tCgkJICAgIGlmKCAhYnVmLnRtX2xvdy0+c2l6ZSgpIHx8CgkJCSAgICAoY3VyICYmICgq
YnVmLnRtX2xvdylbY3VyLTFdLnZhbCAhPSBiX2VsLnZhbCApIHx8CgkJCSAgICAoIWN1ciAmJiAo
KmJ1Zi50bV9sb3cpW2J1Zi50bV9sb3ctPnNpemUoKS0xXS52YWwgIT0gYl9lbC52YWwpICkKCQkg
ICAgewoJCQkvLy0tLS0gV3JpdGUgbmV3IHZhbHVlIC0tLS0KCQkJaWYoY3VyID49IGJ1Zi50bV9s
b3ctPnNpemUoKSkJYnVmLnRtX2xvdy0+cHVzaF9iYWNrKGJfZWwpOwoJCQllbHNlCgkJCXsKCQkJ
ICAgIGlmKCBjdXIrMSA+PSBidWYudG1fbG93LT5zaXplKCkgKQoJCQkJYmVnID0gKGxvbmcgbG9u
ZykoKmJ1Zi50bV9sb3cpWzBdLnRtICogMTAwMDAwMDsKCQkJICAgIGVsc2UgYmVnID0gKGxvbmcg
bG9uZykoKmJ1Zi50bV9sb3cpW2N1cisxXS50bSAqIDEwMDAwMDA7CgkJCSAgICBiZWcgPSBwZXIq
KGJlZy9wZXIpOwoJCQkgICAgKCpidWYudG1fbG93KVtjdXJdPWJfZWw7CgkJCX0KCQkJLy8tLS0t
IFVwZGF0ZSBjdXJzb3IgLS0tLQoJCQlpZiggKytjdXIgPj0gc2l6ZSApIGN1ciA9IDA7CgkJICAg
IH0KCQkgICAgLy8tLS0tIFVwZGF0ZSBlbmQgdGltZSAtLS0tCgkJICAgIGVuZCs9cGVyOwoJCX0K
CSAgICB9Cgl9CiAgICB9CiAgICBlbHNlCiAgICB7CgkvLy0gUHJvY2Nlc3MgZmxvdyBidWZmZXIg
LQoJaWYoIGhnX3Jlc190bSApCgl7CgkgICAgU0hnIGJfZWwgPSB7IHRtLCB2YWx1ZSB9OwoJICAg
IGlmKCB0bSA8IGJlZyAmJiBzaXplICYmIGJ1Zi50bV9oaWdoLT5zaXplKCkgPj0gc2l6ZSApCgkJ
dGhyb3cgVEVycm9yKCJWYWxCdWYiLF8oIlNldCB0b28gb2xkIHZhbHVlIHRvIGJ1ZmZlci4iKSk7
CgkgICAgaW50IGNfcG9zID0gMDsKCgkgICAgLy8tLSBIYWxmIGRpdmlkZXIgLS0KCSAgICBpbnQg
ZF93aW4gPSBidWYudG1faGlnaC0+c2l6ZSgpLzI7CgkgICAgd2hpbGUoZF93aW4+MTApCgkgICAg
ewoJCWlmKCB0bSA+ICgqYnVmLnRtX2hpZ2gpW2NfcG9zK2Rfd2luXS50bSApCgkJICAgIGNfcG9z
Kz1kX3dpbjsKCQlkX3dpbi89MjsKCSAgICB9CgkgICAgLy8tLSBTY2FuIGxhc3Qgd2luZG93IC0t
CgkgICAgd2hpbGUoIHRydWUgKQoJICAgIHsKCQlpZiggY19wb3MgPj0gYnVmLnRtX2hpZ2gtPnNp
emUoKSB8fCB0bSA8ICgqYnVmLnRtX2hpZ2gpW2NfcG9zXS50bSApCgkJewoJCSAgICBpZiggY19w
b3MgPT0gYnVmLnRtX2hpZ2gtPnNpemUoKSApCWJ1Zi50bV9oaWdoLT5wdXNoX2JhY2soYl9lbCk7
CgkJICAgIGVsc2UgYnVmLnRtX2hpZ2gtPmluc2VydChidWYudG1faGlnaC0+YmVnaW4oKStjX3Bv
cyxiX2VsKTsKCQkgICAgaWYoIHNpemUgJiYgYnVmLnRtX2hpZ2gtPnNpemUoKSA+IHNpemUgKSBi
dWYudG1faGlnaC0+ZXJhc2UoYnVmLnRtX2hpZ2gtPmJlZ2luKCkpOwoJCSAgICBiZWcgPSAoKmJ1
Zi50bV9oaWdoKVswXS50bTsKCQkgICAgZW5kID0gKCpidWYudG1faGlnaClbYnVmLnRtX2hpZ2gt
PnNpemUoKS0xXS50bTsKCQkgICAgcmV0dXJuOwoJCX0KCQllbHNlIGlmKCB0bSA9PSAoKmJ1Zi50
bV9oaWdoKVtjX3Bvc10udG0gKQoJCXsKCQkgICAgKCpidWYudG1faGlnaClbY19wb3NdID0gYl9l
bDsKCQkgICAgcmV0dXJuOwoJCX0KCQljX3BvcysrOwoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBT
THcgYl9lbCA9IHsgdG0vMTAwMDAwMCwgdmFsdWUgfTsKCSAgICBpZiggdG0gPCBiZWcgJiYgc2l6
ZSAmJiBidWYudG1fbG93LT5zaXplKCkgPj0gc2l6ZSApCgkJdGhyb3cgVEVycm9yKCJWYWxCdWYi
LF8oIlNldCB0b28gb2xkIHZhbHVlIHRvIGJ1ZmZlci4iKSk7CgkgICAgaW50IGNfcG9zID0gMDsK
CSAgICAvLy0tIEhhbGYgZGl2aWRlciAtLQoJICAgIGludCBkX3dpbiA9IGJ1Zi50bV9sb3ctPnNp
emUoKS8yOwoJICAgIHdoaWxlKCBkX3dpbiA+IDEwICkKCSAgICB7CgkJaWYoIHRtLzEwMDAwMDAg
PiAoKmJ1Zi50bV9sb3cpW2NfcG9zK2Rfd2luXS50bSApCgkJICAgIGNfcG9zICs9IGRfd2luOwoJ
CWRfd2luIC89IDI7CgkgICAgfQoJICAgIC8vLS0gU2NhbiBsYXN0IHdpbmRvdyAtLQoJICAgIHdo
aWxlKCB0cnVlICkKCSAgICB7CgkJaWYoIGNfcG9zID49IGJ1Zi50bV9sb3ctPnNpemUoKSB8fCB0
bS8xMDAwMDAwIDwgKCpidWYudG1fbG93KVtjX3Bvc10udG0gKQoJCXsKCQkgICAgaWYoIGNfcG9z
ID09IGJ1Zi50bV9sb3ctPnNpemUoKSApIGJ1Zi50bV9sb3ctPnB1c2hfYmFjayhiX2VsKTsKCQkg
ICAgZWxzZSBidWYudG1fbG93LT5pbnNlcnQoYnVmLnRtX2xvdy0+YmVnaW4oKStjX3BvcyxiX2Vs
KTsKCQkgICAgaWYoIHNpemUgJiYgYnVmLnRtX2xvdy0+c2l6ZSgpID4gc2l6ZSApIGJ1Zi50bV9s
b3ctPmVyYXNlKGJ1Zi50bV9sb3ctPmJlZ2luKCkpOwoJCSAgICBiZWcgPSAobG9uZyBsb25nKSgq
YnVmLnRtX2xvdylbMF0udG0qMTAwMDAwMDsKCQkgICAgZW5kID0gKGxvbmcgbG9uZykoKmJ1Zi50
bV9sb3cpW2J1Zi50bV9sb3ctPnNpemUoKS0xXS50bSoxMDAwMDAwOwoJCSAgICByZXR1cm47CgkJ
fQoJCWVsc2UgaWYoIHRtLzEwMDAwMDAgPT0gKCpidWYudG1fbG93KVtjX3Bvc10udG0gKQoJCXsK
CQkgICAgKCpidWYudG1fbG93KVtjX3Bvc10gPSBiX2VsOwoJCSAgICByZXR1cm47CgkJfQoJCWNf
cG9zKys7CgkgICAgfQoJfQogICAgfQp9CgoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqCi8vKiAgVFZBcmNoaXZlICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioKVFZBcmNoaXZlOjpUVkFyY2hpdmUoIGNvbnN0IHN0cmluZyAmaWlkLCBjb25z
dCBzdHJpbmcgJmlkYiwgVEVsZW0gKmNmX2VsICkgOgogICAgVENvbmZpZyhjZl9lbCksIHJ1bl9z
dChmYWxzZSksIG1fZGIoaWRiKSwKICAgIG1faWQoY2ZnKCJJRCIpLmdldFNkKCkpLCBtX25hbWUo
Y2ZnKCJOQU1FIikuZ2V0U2QoKSksIG1fZHNjcihjZmcoIkRFU0NSIikuZ2V0U2QoKSksIG1fc3Rh
cnQoY2ZnKCJTVEFSVCIpLmdldEJkKCkpLAogICAgbV92dHlwZShjZmcoIlZUWVBFIikuZ2V0SWQo
KSksIG1fYnBlcihjZmcoIkJQRVIiKS5nZXRSZCgpKSwgbV9ic2l6ZShjZmcoIkJTSVpFIikuZ2V0
SWQoKSksCiAgICBtX2JoZ3JkKGNmZygiQkhHUkQiKS5nZXRCZCgpKSwgbV9iaHJlcyhjZmcoIkJI
UkVTIikuZ2V0QmQoKSksIG1fc3JjbW9kZShjZmcoIlNyY01vZGUiKS5nZXRJZCgpKSwKICAgIG1f
ZHNvdXJjKGNmZygiU291cmNlIikuZ2V0U2QoKSksIG1fYXJjaHMoY2ZnKCJBcmNoUyIpLmdldFNk
KCkpCnsKICAgIG1faWQgPSBpaWQ7CiAgICBtX3Z0eXBlID0gVEZsZDo6UmVhbDsKCiAgICBzZXRV
cEJ1ZigpOwp9CgpUVkFyY2hpdmU6On5UVkFyY2hpdmUoICkKewoKfQoKVENudHJOb2RlICZUVkFy
Y2hpdmU6Om9wZXJhdG9yPSggVENudHJOb2RlICZub2RlICkKewogICAgVFZBcmNoaXZlICpzcmNf
biA9IGR5bmFtaWNfY2FzdDxUVkFyY2hpdmUqPigmbm9kZSk7CiAgICBpZiggIXNyY19uICkgcmV0
dXJuICp0aGlzOwoKICAgIC8vLSBDb25maWd1cmF0aW9uIGNvcHkgLQogICAgc3RyaW5nIHRpZCA9
IGlkKCk7CiAgICAqKFRDb25maWcqKXRoaXMgPSAqKFRDb25maWcqKXNyY19uOwogICAgbV9pZCA9
IHRpZDsKICAgIG1fZGIgPSBzcmNfbi0+bV9kYjsKCiAgICBpZiggc3JjX24tPnN0YXJ0U3RhdCgp
ICYmIHRvU3RhcnQoKSAmJiAhc3RhcnRTdGF0KCkgKQoJc3RhcnQoICk7CgogICAgcmV0dXJuICp0
aGlzOwp9Cgp2b2lkIFRWQXJjaGl2ZTo6cHJlRGlzYWJsZSggaW50IGZsYWcgKQp7CiAgICBzdG9w
KCBmbGFnICk7Cn0KCnZvaWQgVFZBcmNoaXZlOjpwb3N0RGlzYWJsZShpbnQgZmxhZykKewogICAg
dHJ5CiAgICB7CglpZiggZmxhZyApCgkgICAgU1lTLT5kYigpLmF0KCkuZGF0YURlbChmdWxsREIo
KSxvd25lcigpLm5vZGVQYXRoKCkrdGJsKCksKnRoaXMsdHJ1ZSk7CiAgICB9Y2F0Y2goVEVycm9y
IGVycikKICAgIHsgbWVzc193YXJuaW5nKGVyci5jYXQuY19zdHIoKSwiJXMiLGVyci5tZXNzLmNf
c3RyKCkpOyB9Cn0KCnN0cmluZyBUVkFyY2hpdmU6Om5hbWUoKQp7CiAgICByZXR1cm4gKG1fbmFt
ZS5zaXplKCkpP21fbmFtZTptX2lkOwp9CgpUQXJjaGl2ZVMgJlRWQXJjaGl2ZTo6b3duZXIoKQp7
CiAgICByZXR1cm4gKihUQXJjaGl2ZVMgKilub2RlUHJldigpOwp9CgpzdHJpbmcgVFZBcmNoaXZl
Ojp0YmwoICkKewogICAgcmV0dXJuIG93bmVyKCkuc3ViSWQoKSsiX3ZhbCI7Cn0KCmxvbmcgbG9u
ZyBUVkFyY2hpdmU6OmVuZCggY29uc3Qgc3RyaW5nICZhcmNoICkKewogICAgbG9uZyBsb25nIHJl
eiA9IDA7CiAgICBpZiggYXJjaC5lbXB0eSgpIHx8IGFyY2ggPT0gQlVGX0FSQ0hfTk0gKQogICAg
ewoJcmV6ID0gVFZhbEJ1Zjo6ZW5kKCk7CglpZiggIWFyY2guZW1wdHkoKSApIHJldHVybiByZXo7
CiAgICB9CgogICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKICAgIGZvciggaW50IGlfYSA9
IDA7IGlfYSA8IGFyY2hfZWwuc2l6ZSgpOyBpX2ErKyApCiAgICAgICAgaWYoIChhcmNoLmVtcHR5
KCkgfHwgYXJjaCA9PSBhcmNoX2VsW2lfYV0tPmFyY2hpdmF0b3IoKS53b3JrSWQoKSkgJiYgYXJj
aF9lbFtpX2FdLT5lbmQoKSA+IHJleiApCgl7CgkgICAgcmV6ID0gYXJjaF9lbFtpX2FdLT5lbmQo
KTsKCSAgICBpZiggIWFyY2guZW1wdHkoKSApCWJyZWFrOwoJfQogICAgcmV0dXJuIHJlejsKfQoK
bG9uZyBsb25nIFRWQXJjaGl2ZTo6YmVnaW4oIGNvbnN0IHN0cmluZyAmYXJjaCApCnsKICAgIGxv
bmcgbG9uZyByZXogPSBUU1lTOjpjdXJUaW1lKCk7CiAgICBpZiggYXJjaC5lbXB0eSgpIHx8IGFy
Y2ggPT0gQlVGX0FSQ0hfTk0gKQogICAgewoJcmV6ID0gVFZhbEJ1Zjo6YmVnaW4oKTsKCWlmKCAh
YXJjaC5lbXB0eSgpICkgcmV0dXJuIHJlejsKICAgIH0KCiAgICBSZXNBbGxvYyByZXMoYV9yZXMs
ZmFsc2UpOwogICAgZm9yKCBpbnQgaV9hID0gMDsgaV9hIDwgYXJjaF9lbC5zaXplKCk7IGlfYSsr
ICkKCWlmKCAoYXJjaC5lbXB0eSgpIHx8IGFyY2ggPT0gYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9y
KCkud29ya0lkKCkpICYmIGFyY2hfZWxbaV9hXS0+YmVnaW4oKSA8IHJleiApCgl7CgkgICAgcmV6
ID0gYXJjaF9lbFtpX2FdLT5iZWdpbigpOwoJICAgIGlmKCAhYXJjaC5lbXB0eSgpICkJYnJlYWs7
Cgl9CiAgICByZXR1cm4gcmV6Owp9Cgp2b2lkIFRWQXJjaGl2ZTo6c2V0VmFsVHlwZSggVEZsZDo6
VHlwZSB2bCApCnsKICAgIG1fdnR5cGUgPSB2bDsKICAgIHNldFVwQnVmKCApOwogICAgbW9kaWYo
ICk7Cn0KCnZvaWQgVFZBcmNoaXZlOjpzZXRIYXJkR3JpZCggYm9vbCB2bCApCnsKICAgIG1fYmhn
cmQgPSB2bDsKICAgIHNldFVwQnVmKCApOwogICAgbW9kaWYoICk7Cn0KCnZvaWQgVFZBcmNoaXZl
OjpzZXRIaWdoUmVzVG0oIGJvb2wgdmwgKQp7CiAgICBtX2JocmVzID0gdmw7CiAgICBzZXRVcEJ1
ZiggKTsKICAgIG1vZGlmKCApOwp9Cgp2b2lkIFRWQXJjaGl2ZTo6c2V0U2l6ZSggaW50IHZsICkK
ewogICAgbV9ic2l6ZSA9IHZtYXgoMTAsdm1pbigxMDAwMDAwMCx2bCkpOwogICAgc2V0VXBCdWYo
ICk7CiAgICBtb2RpZiggKTsKfQoKdm9pZCBUVkFyY2hpdmU6OnNldFBlcmlvZCggbG9uZyBsb25n
IHZsICkKewogICAgaWYoICF2bCApCXZsID0gMTAwMDAwMDsKICAgIG1fYnBlciA9IChkb3VibGUp
dmwvMTAwMDAwMC47CiAgICBtX2JzaXplID0gdm1heCgxMCwoaW50KXZtaW4oMWU3LDEwMC4wL21f
YnBlcikpOwogICAgc2V0VXBCdWYoICk7CiAgICBtb2RpZiggKTsKfQoKdm9pZCBUVkFyY2hpdmU6
OnNldFVwQnVmKCApCnsKICAgIG1ha2VCdWYoIChURmxkOjpUeXBlKW1fdnR5cGUsIG1fYnNpemUs
IChsb25nIGxvbmcpKG1fYnBlcioxMDAwMDAwLiksIG1fYmhncmQsIG1fYmhyZXMgKTsKfQoKdm9p
ZCBUVkFyY2hpdmU6OmxvYWRfKCApCnsKICAgIGlmKCAhU1lTLT5jaGtTZWxEQihEQigpKSApIHJl
dHVybjsKICAgIFNZUy0+ZGIoKS5hdCgpLmRhdGFHZXQoZnVsbERCKCksb3duZXIoKS5ub2RlUGF0
aCgpK3RibCgpLCp0aGlzKTsKICAgIHNldFVwQnVmKCk7Cn0KCnZvaWQgVFZBcmNoaXZlOjpzYXZl
XyggKQp7CiAgICAvLy0gVXBkYXRlIEFyY2hpdmF0b3JzIGxpc3QgLQogICAgaWYoIHN0YXJ0U3Rh
dCgpICkKICAgIHsKCXZlY3RvcjxzdHJpbmc+IGFyY2hfbHM7CglhcmNoaXZhdG9yTGlzdChhcmNo
X2xzKTsKCW1fYXJjaHMgPSAiIjsKCWZvciggaW50IGlfbCA9IDA7IGlfbCA8IGFyY2hfbHMuc2l6
ZSgpOyBpX2wrKyApCgkgICAgbV9hcmNocyArPSBhcmNoX2xzW2lfbF0rIjsiOwogICAgfQoKICAg
IFNZUy0+ZGIoKS5hdCgpLmRhdGFTZXQoZnVsbERCKCksb3duZXIoKS5ub2RlUGF0aCgpK3RibCgp
LCp0aGlzKTsKfQoKdm9pZCBUVkFyY2hpdmU6OnN0YXJ0KCApCnsKICAgIGlmKCBydW5fc3QgKSBy
ZXR1cm47CgogICAgcnVuX3N0ID0gdHJ1ZTsKCiAgICBzZXRTcmNNb2RlKChUVkFyY2hpdmU6OlNy
Y01vZGUpbV9zcmNtb2RlLG1fZHNvdXJjKTsKCiAgICAvLy0gQXR0YWNoIHRvIGFyY2hpdmF0b3Jz
IC0KICAgIHN0cmluZyBhcmNoOwogICAgZm9yKCBpbnQgaV9vZmYgPSAwOyAoYXJjaCA9IFRTWVM6
OnN0clNlcFBhcnNlKG1fYXJjaHMsMCwnOycsJmlfb2ZmKSkuc2l6ZSgpOyAgKQoJaWYoIWFyY2hp
dmF0b3JQcmVzZW50KGFyY2gpKQoJICAgIHRyeXsgYXJjaGl2YXRvckF0dGFjaChhcmNoKTsgfQoJ
ICAgIGNhdGNoKFRFcnJvciBlcnIpCXsgbWVzc19lcnIoZXJyLmNhdC5jX3N0cigpLCIlcyIsZXJy
Lm1lc3MuY19zdHIoKSk7IH0KfQoKdm9pZCBUVkFyY2hpdmU6OnN0b3AoIGJvb2wgZnVsbF9kZWwg
KQp7CiAgICBpZiggIXJ1bl9zdCApCXJldHVybjsKCiAgICBydW5fc3QgPSBmYWxzZTsKCiAgICBz
ZXRTcmNNb2RlKChUVkFyY2hpdmU6OlNyY01vZGUpbV9zcmNtb2RlLG1fZHNvdXJjKTsKCiAgICAv
Ly0gRGV0YWNoIGFsbCBhcmNoaXZhdG9ycyAtCiAgICB2ZWN0b3I8c3RyaW5nPiBhcmNoX2xzOwog
ICAgYXJjaGl2YXRvckxpc3QoYXJjaF9scyk7CiAgICBmb3IoIGludCBpX2wgPSAwOyBpX2wgPCBh
cmNoX2xzLnNpemUoKTsgaV9sKysgKQoJYXJjaGl2YXRvckRldGFjaChhcmNoX2xzW2lfbF0sZnVs
bF9kZWwpOwp9Cgp2b2lkIFRWQXJjaGl2ZTo6c2V0U3JjTW9kZSggU3JjTW9kZSB2bCwgY29uc3Qg
c3RyaW5nICZpc3JjICkKewogICAgLy8tIERpc2FibGUgYWxsIGxpbmtzIC0KICAgIGlmKCAoIXJ1
bl9zdCB8fCB2bCAhPSBBY3RpdmVBdHRyIHx8IGlzcmMgIT0gbV9kc291cmMpICYmICFwYXR0cl9z
cmMuZnJlZVN0YXQoKSApCiAgICB7Cglvd25lcigpLnNldEFjdFZhbEFyY2goIGlkKCksIGZhbHNl
ICk7CglwYXR0cl9zcmMuZnJlZSgpOwoJZHluYW1pY19jYXN0PFRWYWwmPihTWVMtPm5vZGVBdCht
X2Rzb3VyYywwLCcuJykuYXQoKSkuc2V0QXJjaChBdXRvSEQ8VFZBcmNoaXZlPigpKTsKICAgIH0K
CiAgICB0cnkKICAgIHsKCWlmKCAoIXJ1bl9zdCB8fCB2bCAhPSBQYXNzaXZlQXR0ciB8fCBpc3Jj
ICE9IG1fZHNvdXJjKSAmJgoJCWR5bmFtaWNfY2FzdDxUVmFsICo+KCZTWVMtPm5vZGVBdChtX2Rz
b3VyYywwLCcuJykuYXQoKSkgKQoJICAgIGR5bmFtaWNfY2FzdDxUVmFsJj4oU1lTLT5ub2RlQXQo
bV9kc291cmMsMCwnLicpLmF0KCkpLnNldEFyY2goQXV0b0hEPFRWQXJjaGl2ZT4oKSk7CiAgICB9
Y2F0Y2goLi4uKXsgIH0KCiAgICAvLy0gU2V0IGFsbCBsaW5rcyAtCiAgICBpZiggcnVuX3N0ICYm
IHZsID09IEFjdGl2ZUF0dHIgJiYgZHluYW1pY19jYXN0PFRWYWwgKj4oJlNZUy0+bm9kZUF0KGlz
cmMsMCwnLicpLmF0KCkpICkKICAgIHsKCWR5bmFtaWNfY2FzdDxUVmFsJj4oU1lTLT5ub2RlQXQo
aXNyYywwLCcuJykuYXQoKSkuc2V0QXJjaChBdXRvSEQ8VFZBcmNoaXZlPih0aGlzKSk7CglwYXR0
cl9zcmMgPSBTWVMtPm5vZGVBdChpc3JjLDAsJy4nKTsKCW93bmVyKCkuc2V0QWN0VmFsQXJjaCgg
aWQoKSwgdHJ1ZSApOwogICAgfQoKICAgIGlmKCBydW5fc3QgJiYgdmwgPT0gUGFzc2l2ZUF0dHIg
JiYgZHluYW1pY19jYXN0PFRWYWwgKj4oJlNZUy0+bm9kZUF0KGlzcmMsMCwnLicpLmF0KCkpICkK
CWR5bmFtaWNfY2FzdDxUVmFsJj4oU1lTLT5ub2RlQXQoaXNyYywwLCcuJykuYXQoKSkuc2V0QXJj
aChBdXRvSEQ8VFZBcmNoaXZlPih0aGlzKSk7CgogICAgaWYoIG1fc3JjbW9kZSAhPSB2bCB8fCBt
X2Rzb3VyYyAhPSBpc3JjICkJbW9kaWYoKTsKCiAgICBtX3NyY21vZGUgPSB2bDsKICAgIG1fZHNv
dXJjID0gaXNyYzsKfQoKc3RyaW5nIFRWQXJjaGl2ZTo6Z2V0UyggbG9uZyBsb25nICp0bSwgYm9v
bCB1cF9vcmQsIGNvbnN0IHN0cmluZyAmYXJjaCApCnsKICAgIC8vLSBHZXQgZnJvbSBidWZmZXIg
LQogICAgaWYoIChhcmNoLmVtcHR5KCkgfHwgYXJjaCA9PSBCVUZfQVJDSF9OTSkgJiYgKCF0bSB8
fCAoKnRtID49IGJlZ2luKCkgJiYgKnRtIDw9IGVuZCgpKSkgKQoJcmV0dXJuIFRWYWxCdWY6Omdl
dFModG0sdXBfb3JkKTsKICAgIC8vLSBHZXQgZnJvbSBhcmNoaXZhdG9ycyAtCiAgICBlbHNlCiAg
ICB7CglSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwoJZm9yKCBpbnQgaV9hID0gMDsgaV9hIDwg
YXJjaF9lbC5zaXplKCk7IGlfYSsrICkKCSAgICBpZiggKGFyY2guZW1wdHkoKSB8fCBhcmNoID09
IGFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKSAmJgoJCSAgICAoIXRtIHx8CgkJ
CSh1cF9vcmQgJiYgKnRtIDw9IGFyY2hfZWxbaV9hXS0+ZW5kKCkgJiYgKnRtID4gYXJjaF9lbFtp
X2FdLT5iZWdpbigpLShsb25nIGxvbmcpKDEwMDAwMDAuKmFyY2hfZWxbaV9hXS0+YXJjaGl2YXRv
ciggKS52YWxQZXJpb2QoKSkpIHx8CgkJCSghdXBfb3JkICYmICp0bSA8IGFyY2hfZWxbaV9hXS0+
ZW5kKCkrKGxvbmcgbG9uZykoMTAwMDAwMC4qYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCApLnZh
bFBlcmlvZCgpKSAmJiAqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdpbigpKSApICkKCQkgICAgLy8o
IXRtIHx8ICgqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdpbigpICYmICp0bSA8PSBhcmNoX2VsW2lf
YV0tPmVuZCgpKSkgKQoJCXJldHVybiBhcmNoX2VsW2lfYV0tPmdldFModG0sdXBfb3JkKTsKICAg
IH0KICAgIHJldHVybiBFVkFMX1NUUjsKfQoKZG91YmxlIFRWQXJjaGl2ZTo6Z2V0UiggbG9uZyBs
b25nICp0bSwgYm9vbCB1cF9vcmQsIGNvbnN0IHN0cmluZyAmYXJjaCApCnsKICAgIC8vLSBHZXQg
ZnJvbSBidWZmZXIgLQogICAgaWYoIChhcmNoLmVtcHR5KCkgfHwgYXJjaCA9PSBCVUZfQVJDSF9O
TSkgJiYgKCF0bSB8fCAoKnRtID49IGJlZ2luKCkgJiYgKnRtIDw9IGVuZCgpKSkgKQoJcmV0dXJu
IFRWYWxCdWY6OmdldFIodG0sdXBfb3JkKTsKICAgIC8vLSBHZXQgZnJvbSBhcmNoaXZhdG9ycyAt
CiAgICBlbHNlCiAgICB7CglSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwoJZm9yKCBpbnQgaV9h
ID0gMDsgaV9hIDwgYXJjaF9lbC5zaXplKCk7IGlfYSsrICkKCSAgICBpZiggKGFyY2guZW1wdHko
KSB8fCBhcmNoID09IGFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKSAmJgoJCSAg
ICAoIXRtIHx8CgkJCSh1cF9vcmQgJiYgKnRtIDw9IGFyY2hfZWxbaV9hXS0+ZW5kKCkgJiYgKnRt
ID4gYXJjaF9lbFtpX2FdLT5iZWdpbigpLShsb25nIGxvbmcpKDEwMDAwMDAuKmFyY2hfZWxbaV9h
XS0+YXJjaGl2YXRvciggKS52YWxQZXJpb2QoKSkpIHx8CgkJCSghdXBfb3JkICYmICp0bSA8IGFy
Y2hfZWxbaV9hXS0+ZW5kKCkrKGxvbmcgbG9uZykoMTAwMDAwMC4qYXJjaF9lbFtpX2FdLT5hcmNo
aXZhdG9yKCApLnZhbFBlcmlvZCgpKSAmJiAqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdpbigpKSAp
ICkKCQkgICAgLy8oIXRtIHx8ICgqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdpbigpICYmICp0bSA8
PSBhcmNoX2VsW2lfYV0tPmVuZCgpKSkgKQoJCXJldHVybiBhcmNoX2VsW2lfYV0tPmdldFIodG0s
dXBfb3JkKTsKICAgIH0KICAgIHJldHVybiBFVkFMX1JFQUw7Cn0KCmludCBUVkFyY2hpdmU6Omdl
dEkoIGxvbmcgbG9uZyAqdG0sIGJvb2wgdXBfb3JkLCBjb25zdCBzdHJpbmcgJmFyY2ggKQp7CiAg
ICAvLz4gR2V0IGZyb20gYnVmZmVyCiAgICBpZiggKGFyY2guZW1wdHkoKSB8fCBhcmNoID09IEJV
Rl9BUkNIX05NKSAmJiAoIXRtIHx8ICgqdG0gPj0gYmVnaW4oKSAmJiAqdG0gPD0gZW5kKCkpKSAp
CglyZXR1cm4gVFZhbEJ1Zjo6Z2V0SSh0bSx1cF9vcmQpOwogICAgLy8+IEdldCBmcm9tIGFyY2hp
dmF0b3JzCiAgICBlbHNlCiAgICB7CglSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwoJZm9yKCBp
bnQgaV9hID0gMDsgaV9hIDwgYXJjaF9lbC5zaXplKCk7IGlfYSsrICkKCSAgICBpZiggKGFyY2gu
ZW1wdHkoKSB8fCBhcmNoID09IGFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKSAm
JgoJCSAgICAoIXRtIHx8CgkJCSh1cF9vcmQgJiYgKnRtIDw9IGFyY2hfZWxbaV9hXS0+ZW5kKCkg
JiYgKnRtID4gYXJjaF9lbFtpX2FdLT5iZWdpbigpLShsb25nIGxvbmcpKDEwMDAwMDAuKmFyY2hf
ZWxbaV9hXS0+YXJjaGl2YXRvciggKS52YWxQZXJpb2QoKSkpIHx8CgkJCSghdXBfb3JkICYmICp0
bSA8IGFyY2hfZWxbaV9hXS0+ZW5kKCkrKGxvbmcgbG9uZykoMTAwMDAwMC4qYXJjaF9lbFtpX2Fd
LT5hcmNoaXZhdG9yKCApLnZhbFBlcmlvZCgpKSAmJiAqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdp
bigpKSApICkKCQkgICAgLy8oIXRtIHx8ICgqdG0gPj0gYXJjaF9lbFtpX2FdLT5iZWdpbigpICYm
ICp0bSA8PSBhcmNoX2VsW2lfYV0tPmVuZCgpKSkgKQoJCXJldHVybiBhcmNoX2VsW2lfYV0tPmdl
dEkodG0sdXBfb3JkKTsKICAgIH0KICAgIHJldHVybiBFVkFMX0lOVDsKfQoKY2hhciBUVkFyY2hp
dmU6OmdldEIoIGxvbmcgbG9uZyAqdG0sIGJvb2wgdXBfb3JkLCBjb25zdCBzdHJpbmcgJmFyY2gg
KQp7CiAgICAvLy0gR2V0IGZyb20gYnVmZmVyIC0KICAgIGlmKCAoYXJjaC5lbXB0eSgpIHx8IGFy
Y2ggPT0gQlVGX0FSQ0hfTk0pICYmICghdG0gfHwgKCp0bSA+PSBiZWdpbigpICYmICp0bSA8PSBl
bmQoKSkpICkKICAgICAgICByZXR1cm4gVFZhbEJ1Zjo6Z2V0Qih0bSx1cF9vcmQpOwogICAgLy8t
IEdldCBmcm9tIGFyY2hpdmF0b3JzIC0KICAgIGVsc2UKICAgIHsKCVJlc0FsbG9jIHJlcyhhX3Jl
cyxmYWxzZSk7Cglmb3IoIGludCBpX2EgPSAwOyBpX2EgPCBhcmNoX2VsLnNpemUoKTsgaV9hKysg
KQoJICAgIGlmKCAoYXJjaC5lbXB0eSgpIHx8IGFyY2ggPT0gYXJjaF9lbFtpX2FdLT5hcmNoaXZh
dG9yKCkud29ya0lkKCkpICYmCgkJICAgICghdG0gfHwKCQkJKHVwX29yZCAmJiAqdG0gPD0gYXJj
aF9lbFtpX2FdLT5lbmQoKSAmJiAqdG0gPiBhcmNoX2VsW2lfYV0tPmJlZ2luKCktKGxvbmcgbG9u
ZykoMTAwMDAwMC4qYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCApLnZhbFBlcmlvZCgpKSkgfHwK
CQkJKCF1cF9vcmQgJiYgKnRtIDwgYXJjaF9lbFtpX2FdLT5lbmQoKSsobG9uZyBsb25nKSgxMDAw
MDAwLiphcmNoX2VsW2lfYV0tPmFyY2hpdmF0b3IoICkudmFsUGVyaW9kKCkpICYmICp0bSA+PSBh
cmNoX2VsW2lfYV0tPmJlZ2luKCkpICkgKQoJCSAgICAvLyghdG0gfHwgKCp0bSA+PSBhcmNoX2Vs
W2lfYV0tPmJlZ2luKCkgJiYgKnRtIDw9IGFyY2hfZWxbaV9hXS0+ZW5kKCkpKSApCgkJcmV0dXJu
IGFyY2hfZWxbaV9hXS0+Z2V0Qih0bSx1cF9vcmQpOwogICAgfQogICAgcmV0dXJuIEVWQUxfQk9P
TDsKfQoKdm9pZCBUVkFyY2hpdmU6OmdldFZhbCggVFZhbEJ1ZiAmYnVmLCBsb25nIGxvbmcgaWJl
ZywgbG9uZyBsb25nIGllbmQsIGNvbnN0IHN0cmluZyAmYXJjaCwgaW50IGxpbWl0ICkKewogICAg
Ly8tIEdldCBmcm9tIGJ1ZmZlciAtCiAgICBpZiggKGFyY2guZW1wdHkoKSB8fCBhcmNoID09IEJV
Rl9BUkNIX05NKSAmJiB2T0soaWJlZyxpZW5kKSApCiAgICB7CglpYmVnID0gdm1heChpYmVnLGll
bmQtVFZhbEJ1Zjo6cGVyaW9kKCkqbGltaXQpOwoJVFZhbEJ1Zjo6Z2V0VmFsKGJ1ZixpYmVnLGll
bmQpOwoJaWVuZCA9IGJ1Zi5iZWdpbigpLTE7CiAgICB9CiAgICAvLy0gR2V0IGZyb20gYXJjaGl2
YXRvcnMgLQogICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKICAgIGZvciggaW50IGlfYSA9
IDA7IGlfYSA8IGFyY2hfZWwuc2l6ZSgpOyBpX2ErKyApCglpZiggKGFyY2guZW1wdHkoKSB8fCBh
cmNoID09IGFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKSAmJgoJCSgoIWliZWcg
fHwgaWJlZyA8PSBhcmNoX2VsW2lfYV0tPmVuZCgpKSAmJiAoIWllbmQgfHwgaWVuZCA+IGFyY2hf
ZWxbaV9hXS0+YmVnaW4oKSkpICYmIGliZWcgPD0gaWVuZCApCgl7CgkgICAgaWJlZyA9IHZtYXgo
aWJlZyxpZW5kLShsb25nIGxvbmcpKDEwMDAwMDAuKmFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigp
LnZhbFBlcmlvZCgpKSoobGltaXQtYnVmLnJlYWxTaXplKCkpKTsKCSAgICBhcmNoX2VsW2lfYV0t
PmdldFZhbChidWYsaWJlZyxpZW5kKTsKCSAgICBpZW5kID0gYnVmLmJlZ2luKCktMTsKCX0KfQoK
dm9pZCBUVkFyY2hpdmU6OnNldFZhbCggVFZhbEJ1ZiAmYnVmLCBsb25nIGxvbmcgaWJlZywgbG9u
ZyBsb25nIGllbmQsIGNvbnN0IHN0cmluZyAmYXJjaCApCnsKICAgIC8vLSBQdXQgdG8gYXJjaGl2
YXRvcnMgLQogICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKICAgIGZvciggaW50IGlfYSA9
IDA7IGlfYSA8IGFyY2hfZWwuc2l6ZSgpOyBpX2ErKyApCglpZiggKGFyY2guZW1wdHkoKSB8fCBh
cmNoID09IGFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKSApCgkgICAgYXJjaF9l
bFtpX2FdLT5zZXRWYWwoYnVmLGliZWcsaWVuZCk7Cn0KCnZvaWQgVFZBcmNoaXZlOjpnZXRBY3Rp
dmVEYXRhKCkKewogICAgbG9uZyBsb25nIHRtID0gVFNZUzo6Y3VyVGltZSgpOwogICAgaWYoICFw
YXR0cl9zcmMuZnJlZVN0YXQoKSApCiAgICB7Cglzd2l0Y2godmFsVHlwZSgpKQoJewoJICAgIGNh
c2UgVEZsZDo6Qm9vbGVhbjoJc2V0QihwYXR0cl9zcmMuYXQoKS5nZXRCKCZ0bSksdG0pOyBicmVh
azsKCSAgICBjYXNlIFRGbGQ6OkludGVnZXI6CXNldEkocGF0dHJfc3JjLmF0KCkuZ2V0SSgmdG0p
LHRtKTsgYnJlYWs7CgkgICAgY2FzZSBURmxkOjpSZWFsOglzZXRSKHBhdHRyX3NyYy5hdCgpLmdl
dFIoJnRtKSx0bSk7IGJyZWFrOwoJICAgIGNhc2UgVEZsZDo6U3RyaW5nOglzZXRTKHBhdHRyX3Ny
Yy5hdCgpLmdldFMoJnRtKSx0bSk7IGJyZWFrOwoJfQogICAgfQp9Cgp2b2lkIFRWQXJjaGl2ZTo6
YXJjaGl2YXRvckxpc3QoIHZlY3RvcjxzdHJpbmc+ICZscyApCnsKICAgIFJlc0FsbG9jIHJlcyhh
X3JlcyxmYWxzZSk7CiAgICBscy5jbGVhcigpOwogICAgZm9yKCBpbnQgaV9sID0gMDsgaV9sIDwg
YXJjaF9lbC5zaXplKCk7IGlfbCsrICkKCWxzLnB1c2hfYmFjayhhcmNoX2VsW2lfbF0tPmFyY2hp
dmF0b3IoKS53b3JrSWQoKSk7Cn0KCmJvb2wgVFZBcmNoaXZlOjphcmNoaXZhdG9yUHJlc2VudCgg
Y29uc3Qgc3RyaW5nICZhcmNoICkKewogICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKICAg
IHRyeQogICAgewoJQXV0b0hEPFRWQXJjaGl2YXRvcj4gYXJjaGl2YXQgPSBvd25lcigpLmF0KFRT
WVM6OnN0clNlcFBhcnNlKGFyY2gsMCwnLicpKS5hdCgpLgoJCQkJCQl2YWxBdChUU1lTOjpzdHJT
ZXBQYXJzZShhcmNoLDEsJy4nKSk7Cglmb3IoIGludCBpX2wgPSAwOyBpX2wgPCBhcmNoX2VsLnNp
emUoKTsgaV9sKysgKQoJICAgIGlmKCAmYXJjaF9lbFtpX2xdLT5hcmNoaXZhdG9yKCkgPT0gJmFy
Y2hpdmF0LmF0KCkgKQoJCXJldHVybiB0cnVlOwogICAgfSBjYXRjaChURXJyb3IgZXJyKXsgfQog
ICAgcmV0dXJuIGZhbHNlOwp9Cgp2b2lkIFRWQXJjaGl2ZTo6YXJjaGl2YXRvckF0dGFjaCggY29u
c3Qgc3RyaW5nICZhcmNoICkKewogICAgUmVzQWxsb2MgcmVzKGFfcmVzLHRydWUpOwoKICAgIEF1
dG9IRDxUVkFyY2hpdmF0b3I+IGFyY2hpdmF0ID0gb3duZXIoKS5hdChUU1lTOjpzdHJTZXBQYXJz
ZShhcmNoLDAsJy4nKSkuYXQoKS4KCQkJCQkgICAgdmFsQXQoVFNZUzo6c3RyU2VwUGFyc2UoYXJj
aCwxLCcuJykpOwoKICAgIGlmKCFhcmNoaXZhdC5hdCgpLnN0YXJ0U3RhdCgpKQoJdGhyb3cgVEVy
cm9yKG5vZGVQYXRoKCkuY19zdHIoKSwiQXJjaGl2YXRvciA8JXM+IGVycm9yIG9yIGl0IGlzIG5v
dCBzdGFydGVkLiIsYXJjaC5jX3N0cigpKTsKCiAgICAvLy0gRmluZCBhbHJlYWR5IHByZXNlbnQg
YXJjaGl2YXRvciAtCiAgICBmb3IoIGludCBpX2wgPSAwOyBpX2wgPCBhcmNoX2VsLnNpemUoKTsg
aV9sKysgKQogICAgICAgIGlmKCAmYXJjaF9lbFtpX2xdLT5hcmNoaXZhdG9yKCkgPT0gJmFyY2hp
dmF0LmF0KCkgKQoJICAgIHJldHVybjsKICAgIC8vLSBGaW5kIHBvc2l0aW9uIC0KICAgIGZvcigg
aW50IGlfbCA9IDA7IGlfbCA8IGFyY2hfZWwuc2l6ZSgpOyBpX2wrKyApCiAgICAgICAgaWYoIGFy
Y2hpdmF0LmF0KCkudmFsUGVyaW9kKCkgPD0gYXJjaF9lbFtpX2xdLT5hcmNoaXZhdG9yKCkudmFs
UGVyaW9kKCkgKQoJewoJICAgIGFyY2hfZWwuaW5zZXJ0KGFyY2hfZWwuYmVnaW4oKStpX2wsYXJj
aGl2YXQuYXQoKS5hcmNoaXZlUGxhY2UoKnRoaXMpKTsKCSAgICByZXR1cm47Cgl9CiAgICBhcmNo
X2VsLnB1c2hfYmFjayhhcmNoaXZhdC5hdCgpLmFyY2hpdmVQbGFjZSgqdGhpcykpOwp9Cgp2b2lk
IFRWQXJjaGl2ZTo6YXJjaGl2YXRvckRldGFjaCggY29uc3Qgc3RyaW5nICZhcmNoLCBib29sIGZ1
bGwgKQp7CiAgICBSZXNBbGxvYyByZXMoYV9yZXMsdHJ1ZSk7CgogICAgQXV0b0hEPFRWQXJjaGl2
YXRvcj4gYXJjaGl2YXQgPSBvd25lcigpLmF0KFRTWVM6OnN0clNlcFBhcnNlKGFyY2gsMCwnLicp
KS5hdCgpLgoJCQkJCSAgICB2YWxBdChUU1lTOjpzdHJTZXBQYXJzZShhcmNoLDEsJy4nKSk7CiAg
ICAvLy0gRmluZCBhcmNoaXZhdG9yIC0KICAgIGZvciggaW50IGlfbCA9IDA7IGlfbCA8IGFyY2hf
ZWwuc2l6ZSgpOyBpX2wrKyApCiAgICAgICAgaWYoICZhcmNoX2VsW2lfbF0tPmFyY2hpdmF0b3Io
KSA9PSAmYXJjaGl2YXQuYXQoKSApCgl7CgkgICAgYXJjaGl2YXQuYXQoKS5hcmNoaXZlUmVtb3Zl
KGlkKCksZnVsbCk7CgkgICAgYXJjaF9lbC5lcmFzZShhcmNoX2VsLmJlZ2luKCkraV9sKTsKCX0K
fQoKdm9pZCBUVkFyY2hpdmU6OmFyY2hpdmF0b3JTb3J0KCkKewogICAgaW50IHJlcF90cnk7Cgog
ICAgUmVzQWxsb2MgcmVzKGFfcmVzLHRydWUpOwoKICAgIGRvCiAgICB7CglyZXBfdHJ5ID0gZmFs
c2U7Cglmb3IoIGludCBpX2wgPSAxOyBpX2wgPCBhcmNoX2VsLnNpemUoKTsgaV9sKysgKQoJICAg
IGlmKCBhcmNoX2VsW2lfbC0xXS0+YXJjaGl2YXRvcigpLnZhbFBlcmlvZCgpID4gYXJjaF9lbFtp
X2xdLT5hcmNoaXZhdG9yKCkudmFsUGVyaW9kKCkgKQoJICAgIHsKCQlUVkFyY2hFbCAqdF9lbCA9
IGFyY2hfZWxbaV9sLTFdOwoJCWFyY2hfZWxbaV9sLTFdID0gYXJjaF9lbFtpX2xdOwoJCWFyY2hf
ZWxbaV9sXSA9IHRfZWw7CgkJcmVwX3RyeT10cnVlOwoJICAgIH0KICAgIH0KICAgIHdoaWxlKHJl
cF90cnkpOwp9CgpzdHJpbmcgVFZBcmNoaXZlOjptYWtlVHJlbmRJbWcoIGxvbmcgbG9uZyBpYmVn
LCBsb25nIGxvbmcgaWVuZCwgY29uc3Qgc3RyaW5nICZpYXJjaCwgaW50IGhzeiwgaW50IHZzeiwg
ZG91YmxlIHZhbG1heCwgZG91YmxlIHZhbG1pbiApCnsKICAgIHN0cmluZyBsYWJfdG0sIGxhYl9k
dDsKICAgIHRpbWVfdCB0bV90OwogICAgc3RydWN0IHRtIHR0bSwgdHRtMTsKICAgIGxvbmcgbG9u
ZyBjX3RtOwogICAgc3RyaW5nIHJlejsKICAgIGludCBodl9ib3JkZXIsCQkvL0ltYWdlIGJvcmRl
ciBzaXplCgloX3dfc3RhcnQsIGhfd19zaXplLAkvL1RyZW5kIHdpbmRvdyBob3Jpem9udGFsIHN0
YXJ0IGFuZCBzaXplCgloX2JvcmRlcl9zZXJ2LAkJLy9Ib3Jpem9udGFsIHNlcnZpY2UgYm9yZGVy
IHNpemUKCXZfd19zdGFydCwgdl93X3NpemUsCS8vVHJlbmQgd2luZG93IHZlcnRpY2FsIHN0YXJ0
IGFuZCBzaXplCgl2X2JvcmRlcl9zZXJ2OwkJLy9WZXJ0aWNhbCBzZXJ2aWNlIGJvcmRlciBzaXpl
CgogICAgLy8+IENoZWNrIGFuZCBnZXQgZGF0YQogICAgaWYoIGliZWcgPj0gaWVuZCB8fCB2YWxU
eXBlKCApID09IFRGbGQ6OlN0cmluZyApCXJldHVybiByZXo7CiAgICBUVmFsQnVmIGJ1ZiggVEZs
ZDo6UmVhbCwgMCwgMCwgZmFsc2UsIHRydWUgKTsKCiAgICAvLz4gQ2FsYyBiYXNlIGltYWdlIHBh
cmFtZXRlcnMKICAgIGh2X2JvcmRlciA9IDU7CiAgICBoX2JvcmRlcl9zZXJ2ID0gMzA7CiAgICB2
X2JvcmRlcl9zZXJ2ID0gMjA7CiAgICBoX3dfc3RhcnQgPSBodl9ib3JkZXI7CiAgICBoX3dfc2l6
ZSAgPSBoc3otaF93X3N0YXJ0LWh2X2JvcmRlcjsKICAgIHZfd19zdGFydCA9IGh2X2JvcmRlcjsK
ICAgIHZfd19zaXplICA9IHZzei12X3dfc3RhcnQtdl9ib3JkZXJfc2Vydi1odl9ib3JkZXI7Cgog
ICAgLy8+IENyZWF0ZSBpbWFnZQogICAgZ2RJbWFnZVB0ciBpbSA9IGdkSW1hZ2VDcmVhdGUoaHN6
LHZzeik7CiAgICBpbnQgY2xyX2JhY2tnciA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDB4MzUs
MHgzNSwweDM1KTsgCiAgICBpbnQgY2xyX2dyaWQgICA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGlt
LDB4OGUsMHg4ZSwweDhlKTsKICAgIGludCBjbHJfc3ltYiAgID0gZ2RJbWFnZUNvbG9yQWxsb2Nh
dGUoaW0sMHgxMSwweGZmLDB4NWYpOwogICAgaW50IGNscl90cm5kICAgPSBnZEltYWdlQ29sb3JB
bGxvY2F0ZShpbSwweDFmLDB4ZjIsMHhmZik7CgogICAgZ2RJbWFnZUZpbGxlZFJlY3RhbmdsZShp
bSwwLDAsaHN6LTEsdnN6LTEsY2xyX2JhY2tncik7CiAgICBnZEltYWdlUmVjdGFuZ2xlKGltLGhf
d19zdGFydCx2X3dfc3RhcnQsaF93X3N0YXJ0K2hfd19zaXplLHZfd19zdGFydCt2X3dfc2l6ZSxj
bHJfZ3JpZCk7CgogICAgLy8+IE1ha2UgaG9yaXNvbnRhbCBncmlkIGFuZCBzeW1ib2xzCiAgICBs
b25nIGxvbmcgaF9kaXYgPSAxOwogICAgbG9uZyBsb25nIGhfbWluID0gaWJlZzsKICAgIGxvbmcg
bG9uZyBoX21heCA9IGllbmQ7CiAgICBpbnQgaG1heF9sbiA9IHZzei8oZ2RGb250VGlueS0+dyo2
KTsKICAgIGlmKCBobWF4X2xuID49IDIgKQogICAgewoJaW50IGh2TGV2ID0gMDsKCWxvbmcgbG9u
ZyBoTGVuID0gaWVuZCAtIGliZWc7CglpZiggaExlbi84NjQwMDAwMDAwMGxsID49IDIgKQkJeyBo
dkxldiA9IDU7IGhfZGl2ID0gODY0MDAwMDAwMDBsbDsgfQkvL0RheXMKCWVsc2UgaWYoIGhMZW4v
MzYwMDAwMDAwMGxsID49IDIgKQl7IGh2TGV2ID0gNDsgaF9kaXYgPSAgMzYwMDAwMDAwMGxsOyB9
CS8vSG91cnMKCWVsc2UgaWYoIGhMZW4vNjAwMDAwMDAgPj0gMiApCQl7IGh2TGV2ID0gMzsgaF9k
aXYgPSAgICA2MDAwMDAwMDsgfQkvL01pbnV0ZXMKCWVsc2UgaWYoIGhMZW4vMTAwMDAwMCA+PSAy
ICkJCXsgaHZMZXYgPSAyOyBoX2RpdiA9ICAgICAxMDAwMDAwOyB9CS8vU2Vjb25kcwoJZWxzZSBp
ZiggaExlbi8xMDAwID49IDIgKQkJeyBodkxldiA9IDE7IGhfZGl2ID0gICAgICAgIDEwMDA7IH0J
Ly9NaWxsaXNlY29uZHMKCXdoaWxlKCBoTGVuL2hfZGl2ID4gaG1heF9sbiApCQloX2RpdiAqPSAx
MDsKCXdoaWxlKCBoTGVuL2hfZGl2IDwgaG1heF9sbi8yICkJCWhfZGl2IC89IDI7CgoJLy8+PiBT
ZWxlY3QgbW9zdCBsaWtlIGFyY2hpdmF0b3IKCXN0cmluZyByYXJjaCA9IGlhcmNoOwoJaWYoIHJh
cmNoLmVtcHR5KCkgJiYgIXZPSyhpYmVnLGllbmQpICkKCXsKCSAgICBkb3VibGUgYmVzdF9hX3Bl
ciA9IDA7CgkgICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKCSAgICBmb3IoIGludCBpX2Eg
PSAwOyBpX2EgPCBhcmNoX2VsLnNpemUoKTsgaV9hKysgKQoJCWlmKCBhcmNoX2VsW2lfYV0tPmFy
Y2hpdmF0b3IoKS52YWxQZXJpb2QoKSA+IGJlc3RfYV9wZXIgJiYKCQkgICAgYXJjaF9lbFtpX2Fd
LT5hcmNoaXZhdG9yKCkudmFsUGVyaW9kKCkgPD0gKGRvdWJsZSkoaF9tYXgtaF9taW4pLygxZTUq
aHN6KSApCgkJewoJCSAgICBiZXN0X2FfcGVyID0gYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCku
dmFsUGVyaW9kKCk7CgkJICAgIHJhcmNoID0gYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCkud29y
a0lkKCk7CgkJfQoJfQoKCWdldFZhbChidWYsaF9taW4saF9tYXgscmFyY2gsNjAwMDAwKTsKCWlm
KCFidWYuZW5kKCkgfHwgIWJ1Zi5iZWdpbigpKQl7IGdkSW1hZ2VEZXN0cm95KGltKTsgcmV0dXJu
IHJlejsgfQoKCS8vPj4gRHJhdyBmdWxsIHRyZW5kJ3MgZGF0YSBhbmQgdGltZSB0byB0aGUgdHJl
bmQgZW5kIHBvc2l0aW9uCgl0bV90ID0gaWVuZC8xMDAwMDAwOwoJbG9jYWx0aW1lX3IoJnRtX3Qs
JnR0bSk7CglsYWJfZHQgPSBUU1lTOjpzdHJNZXNzKCIlZC0lMDJkLSVkIix0dG0udG1fbWRheSx0
dG0udG1fbW9uKzEsdHRtLnRtX3llYXIrMTkwMCk7CglpZiggdHRtLnRtX3NlYyA9PSAwICYmIGll
bmQlMTAwMDAwMCA9PSAwICkgbGFiX3RtID0gVFNZUzo6c3RyTWVzcygiJWQ6JTAyZCIsdHRtLnRt
X2hvdXIsdHRtLnRtX21pbik7CgllbHNlIGlmKCBpZW5kJTEwMDAwMDAgPT0gMCApIGxhYl90bSA9
IFRTWVM6OnN0ck1lc3MoIiVkOiUwMmQ6JTAyZCIsdHRtLnRtX2hvdXIsdHRtLnRtX21pbix0dG0u
dG1fc2VjKTsKCWVsc2UgbGFiX3RtID0gVFNZUzo6c3RyTWVzcygiJWQ6JTAyZDolZyIsdHRtLnRt
X2hvdXIsdHRtLnRtX21pbiwoZmxvYXQpdHRtLnRtX3NlYysoZmxvYXQpKGllbmQlMTAwMDAwMCkv
MWU2KTsKCWdkSW1hZ2VTdHJpbmcoaW0sZ2RGb250VGlueSxoX3dfc3RhcnQraF93X3NpemUtZ2RG
b250VGlueS0+dypsYWJfZHQuc2l6ZSgpLHZfd19zdGFydCt2X3dfc2l6ZSszK2dkRm9udFRpbnkt
PmgsKHVuc2lnbmVkIGNoYXIqKWxhYl9kdC5jX3N0cigpLGNscl9zeW1iKTsKCWdkSW1hZ2VTdHJp
bmcoaW0sZ2RGb250VGlueSxoX3dfc3RhcnQraF93X3NpemUtZ2RGb250VGlueS0+dypsYWJfdG0u
c2l6ZSgpLHZfd19zdGFydCt2X3dfc2l6ZSszLCh1bnNpZ25lZCBjaGFyKilsYWJfdG0uY19zdHIo
KSxjbHJfc3ltYik7CglpbnQgYmVnTWFya0JyZCA9IC0xOwoJaW50IGVuZE1hcmtCcmQgPSB2bWlu
KGhfd19zdGFydCtoX3dfc2l6ZS1nZEZvbnRUaW55LT53KmxhYl9kdC5zaXplKCksaF93X3N0YXJ0
K2hfd19zaXplLWdkRm9udFRpbnktPncqbGFiX3RtLnNpemUoKSk7CgoJLy8+PiBEcmF3IGdyaWQg
YW5kL29yIG1hcmtlcnMKCWJvb2wgZmlyc3RfbSA9IHRydWU7Cglmb3IoIGxvbmcgbG9uZyBpX2gg
PSBoX21pbjsgdHJ1ZTsgKQoJewoJICAgIC8vPj4+IERyYXcgZ3JpZAoJICAgIGludCBoX3BvcyA9
IGhfd19zdGFydCtoX3dfc2l6ZSooaV9oLWhfbWluKS8oaF9tYXgtaF9taW4pOwoJICAgIGdkSW1h
Z2VMaW5lKGltLGhfcG9zLHZfd19zdGFydCxoX3Bvcyx2X3dfc3RhcnQrdl93X3NpemUsY2xyX2dy
aWQpOwoKCSAgICBpZiggIShpX2glaF9kaXYpICYmIGlfaCAhPSBpZW5kICkKCSAgICB7CgkJdG1f
dCA9IGlfaC8xMDAwMDAwOwoJCWxvY2FsdGltZV9yKCZ0bV90LCZ0dG0pOwoJCWludCBjaExldiA9
IC0xOwoJCWlmKCAhZmlyc3RfbSApCgkJewoJCSAgICBpZiggdHRtLnRtX21vbiA+IHR0bTEudG1f
bW9uIHx8IHR0bS50bV95ZWFyID4gdHRtMS50bV95ZWFyICkgIGNoTGV2ID0gNTsKCQkgICAgZWxz
ZSBpZiggdHRtLnRtX21kYXkgPiB0dG0xLnRtX21kYXkgKSAgY2hMZXYgPSA0OwoJCSAgICBlbHNl
IGlmKCB0dG0udG1faG91ciA+IHR0bTEudG1faG91ciApICBjaExldiA9IDM7CgkJICAgIGVsc2Ug
aWYoIHR0bS50bV9taW4gPiB0dG0xLnRtX21pbiApICAgIGNoTGV2ID0gMjsKCQkgICAgZWxzZSBp
ZiggdHRtLnRtX3NlYyA+IHR0bTEudG1fc2VjICkgICAgY2hMZXYgPSAxOwoJCSAgICBlbHNlIGNo
TGV2ID0gMDsKCQl9CgkJbGFiX2R0ID0gbGFiX3RtID0gIiI7CgkJLy9EYXRlCgkJaWYoIGh2TGV2
ID09IDUgfHwgY2hMZXYgPj0gNCApCgkJICAgIGxhYl9kdCA9IChjaExldj49NSB8fCBjaExldj09
LTEpID8gVFNZUzo6c3RyTWVzcygiJWQtJTAyZC0lZCIsdHRtLnRtX21kYXksdHRtLnRtX21vbisx
LHR0bS50bV95ZWFyKzE5MDApIDogVFNZUzo6c3RyTWVzcygiJWQiLHR0bS50bV9tZGF5KTsKCQkv
L0hvdXJzIGFuZCBtaW51dHMKCQlpZiggKGh2TGV2ID09IDQgfHwgaHZMZXYgPT0gMyB8fCB0dG0u
dG1fbWluKSAmJiAhdHRtLnRtX3NlYyApIGxhYl90bSA9IFRTWVM6OnN0ck1lc3MoIiVkOiUwMmQi
LHR0bS50bV9ob3VyLHR0bS50bV9taW4pOwoJCS8vU2Vjb25kcwoJCWVsc2UgaWYoIChodkxldiA9
PSAyIHx8IHR0bS50bV9zZWMpICYmICEoaV9oJTEwMDAwMDApICkKCQkgICAgbGFiX3RtID0gKGNo
TGV2Pj0yIHx8IGNoTGV2PT0tMSkgPyBUU1lTOjpzdHJNZXNzKCIlZDolMDJkOiUwMmQiLHR0bS50
bV9ob3VyLHR0bS50bV9taW4sdHRtLnRtX3NlYykgOiBUU1lTOjpzdHJNZXNzKF8oIiVkcyIpLHR0
bS50bV9zZWMpOwoJCS8vTWlsbGlzZWNvbmRzCgkJZWxzZSBpZiggaHZMZXYgPD0gMSB8fCBpX2gl
MTAwMDAwMCApCgkJICAgIGxhYl90bSA9IChjaExldj49MiB8fCBjaExldj09LTEpID8gVFNZUzo6
c3RyTWVzcygiJWQ6JTAyZDolZyIsdHRtLnRtX2hvdXIsdHRtLnRtX21pbiwoZmxvYXQpdHRtLnRt
X3NlYysoZmxvYXQpKGlfaCUxMDAwMDAwKS8xZTYpIDoKCQkJICAgICAoY2hMZXY+PTEpID8gVFNZ
Uzo6c3RyTWVzcyhfKCIlZ3MiKSwoZmxvYXQpdHRtLnRtX3NlYysoZmxvYXQpKGlfaCUxMDAwMDAw
KS8xZTYpIDoKCQkJCQkgIFRTWVM6OnN0ck1lc3MoXygiJWdtcyIpLChkb3VibGUpKGlfaCUxMDAw
MDAwKS8xMDAwLik7CgkJaW50IHdkdGgsIHRwb3MsIGVuZFBvc1RtID0gMCwgZW5kUG9zRHQgPSAw
OwoJCWlmKCBsYWJfZHQuc2l6ZSgpICkKCQl7CgkJICAgIHdkdGggPSBnZEZvbnRUaW55LT53Kmxh
Yl9kdC5zaXplKCk7CgkJICAgIHRwb3MgPSB2bWF4KGhfcG9zLXdkdGgvMixodl9ib3JkZXIpOwoJ
CSAgICBpZiggKHRwb3Mrd2R0aCkgPCBlbmRNYXJrQnJkICYmIHRwb3MgPiBiZWdNYXJrQnJkICkK
CQkgICAgewoJCQlnZEltYWdlU3RyaW5nKGltLGdkRm9udFRpbnksdHBvcyx2X3dfc3RhcnQrdl93
X3NpemUrMytnZEZvbnRUaW55LT5oLCh1bnNpZ25lZCBjaGFyKilsYWJfZHQuY19zdHIoKSxjbHJf
c3ltYik7CgkJCWVuZFBvc1RtID0gdHBvcyt3ZHRoOwoJCSAgICB9CgkJfQoJCWlmKCBsYWJfdG0u
c2l6ZSgpICkKCQl7CgkJICAgIHdkdGggPSBnZEZvbnRUaW55LT53KmxhYl90bS5zaXplKCk7CgkJ
ICAgIHRwb3MgPSB2bWF4KGhfcG9zLXdkdGgvMixodl9ib3JkZXIpOwoJCSAgICBpZiggKHRwb3Mr
d2R0aCkgPCBlbmRNYXJrQnJkICYmIHRwb3MgPiBiZWdNYXJrQnJkICkKCQkgICAgewoJCQlnZElt
YWdlU3RyaW5nKGltLGdkRm9udFRpbnksdHBvcyx2X3dfc3RhcnQrdl93X3NpemUrMywodW5zaWdu
ZWQgY2hhciopbGFiX3RtLmNfc3RyKCksY2xyX3N5bWIpOwoJCQllbmRQb3NEdCA9IHRwb3Mrd2R0
aDsKCQkgICAgfQoJCX0KCQliZWdNYXJrQnJkID0gdm1heChiZWdNYXJrQnJkLHZtYXgoZW5kUG9z
VG0sZW5kUG9zRHQpKTsKCQltZW1jcHkoKGNoYXIqKSZ0dG0xLChjaGFyKikmdHRtLHNpemVvZih0
bSkpOwoJCWZpcnN0X20gPSBmYWxzZTsKCSAgICB9CgkgICAgLy8+Pj4gTmV4dAoJICAgIGlmKCBp
X2ggPj0gaWVuZCApCWJyZWFrOwoJICAgIGlfaCA9IChpX2gvaF9kaXYpKmhfZGl2ICsgaF9kaXY7
CgkgICAgaWYoIGlfaCA+IGllbmQgKQlpX2ggPSBpZW5kOwoJfQogICAgfQoKICAgIC8vPiBNYWtl
IHZlcnRpY2FsIGdyaWQgYW5kIHN5bWJvbHMKICAgIGRvdWJsZQljX3ZhbCwKCQl2X21heCA9IC0z
ZTMwMCwKCQl2X21pbiA9IDNlMzAwOwogICAgZm9yKCBjX3RtID0gYnVmLmJlZ2luKCk7IGNfdG0g
PD0gYnVmLmVuZCgpOyBjX3RtKysgKQogICAgewoJY192YWwgPSBidWYuZ2V0UigmY190bSx0cnVl
KTsKCWlmKGNfdmFsID09IEVWQUxfUkVBTCkJY29udGludWU7Cgl2X21pbiA9IHZtaW4odl9taW4s
Y192YWwpOwoJdl9tYXggPSB2bWF4KHZfbWF4LGNfdmFsKTsKICAgIH0KICAgIGlmKCB2YWxtYXgh
PXZhbG1pbiApCiAgICB7Cgl2X21heCA9IHZtYXgodl9tYXgsdmFsbWF4KTsKCXZfbWluID0gdm1p
bih2X21pbix2YWxtaW4pOwogICAgfQogICAgaWYoIHZfbWF4PT0tM2UzMDAgKQl7IGdkSW1hZ2VE
ZXN0cm95KGltKTsgcmV0dXJuIHJlejsgfQogICAgaWYoIFRTWVM6OnJlYWxSb3VuZCh2X21heCwz
KSA9PSBUU1lTOjpyZWFsUm91bmQodl9taW4sMykgKQl7IHZfbWF4Kz0xLjA7IHZfbWluLT0xLjA7
IH0KICAgIGRvdWJsZSB2X2RpdiA9IDE7CiAgICBkb3VibGUgdl9sZW4gPSB2X21heCAtIHZfbWlu
OwogICAgd2hpbGUoIHZfbGVuID4gMTAgKQl7IHZfZGl2ICo9IDEwOyB2X2xlbiAvPSAxMDsgfQog
ICAgd2hpbGUoIHZfbGVuIDwgMSApIAl7IHZfZGl2IC89IDEwOyB2X2xlbiAqPSAxMDsgfQogICAg
dl9taW4gPSBmbG9vcih2X21pbi92X2Rpdikqdl9kaXY7CiAgICB2X21heCA9IGNlaWwodl9tYXgv
dl9kaXYpKnZfZGl2OwogICAgd2hpbGUoICgodl9tYXgtdl9taW4pL3ZfZGl2KSA8IDUgKSB2X2Rp
diAvPSAyOwogICAgLy8+PiBEcmF3IHZlcnRpY2FsIGdyaWQgYW5kIHN5bWJvbHMKICAgIGZvcigg
ZG91YmxlIGlfdiA9IHZfbWluOyAodl9tYXgtaV92KS92X2RpdiA+IC0wLjE7IGlfdiArPSB2X2Rp
diApCiAgICB7CglpbnQgdl9wb3MgPSB2X3dfc3RhcnQrdl93X3NpemUtKGludCkoKGRvdWJsZSl2
X3dfc2l6ZSooaV92LXZfbWluKS8odl9tYXgtdl9taW4pKTsKCWdkSW1hZ2VMaW5lKGltLGhfd19z
dGFydCx2X3BvcyxoX3dfc3RhcnQraF93X3NpemUsdl9wb3MsY2xyX2dyaWQpOwoJYm9vbCBpc01h
eCA9IChmYWJzKCh2X21heC1pX3YpL3ZfZGl2KSA8IDAuMSk7CglnZEltYWdlU3RyaW5nKGltLGdk
Rm9udFRpbnksaHZfYm9yZGVyKzIsdl9wb3MtKGlzTWF4PzA6Z2RGb250VGlueS0+aCksKHVuc2ln
bmVkIGNoYXIqKVRTWVM6OnN0ck1lc3MoIiVnIixpX3YpLmNfc3RyKCksY2xyX3N5bWIpOwogICAg
fQoKICAgIC8vPiBEcmF3IHRyZW5kCiAgICBkb3VibGUgYXZlcl92bCA9IEVWQUxfUkVBTDsKICAg
IGludCAgICBhdmVyX3Bvcz0gMDsKICAgIGxvbmcgbG9uZyBhdmVyX3RtID0gMDsKICAgIGxvbmcg
bG9uZyBhdmVyX2xzdHRtID0gMDsKICAgIGRvdWJsZSBwcmV2X3ZsID0gRVZBTF9SRUFMOwogICAg
aW50ICAgIHByZXZfcG9zID0gMDsKICAgIGZvciggY190bSA9IGJ1Zi5iZWdpbigpOyB0cnVlOyBj
X3RtKysgKQogICAgewoJaW50IGNfcG9zOwoJaWYoY190bSA8PSBidWYuZW5kKCkpCgl7CgkgICAg
Y192YWwgPSBidWYuZ2V0UigmY190bSx0cnVlKTsKCSAgICBjX3BvcyA9IGhfd19zdGFydCtoX3df
c2l6ZSoodm1heCh2bWluKGNfdG0saF9tYXgpLGhfbWluKS1oX21pbikvKGhfbWF4LWhfbWluKTsK
CX1lbHNlIGNfcG9zID0gMDsKCS8vU3F1YXJlIEF2ZXJhZ2UKCWlmKCBhdmVyX3BvcyA9PSBjX3Bv
cyApCgl7CgkgICAgaWYoIGF2ZXJfdmwgPT0gRVZBTF9SRUFMICkJYXZlcl92bCA9IGNfdmFsOwoJ
ICAgIGVsc2UgaWYoIGNfdmFsICE9IEVWQUxfUkVBTCApCgkJYXZlcl92bCA9IChhdmVyX3ZsKihk
b3VibGUpKGNfdG0tYXZlcl90bSkrY192YWwqKGRvdWJsZSkoY190bS1hdmVyX2xzdHRtKSkvCgkJ
CSAgKChkb3VibGUpKDIqY190bS1hdmVyX3RtLWF2ZXJfbHN0dG0pKTsKCSAgICBhdmVyX2xzdHRt
ID0gY190bTsKCSAgICBjb250aW51ZTsKCX0KCS8vV3JpdGUgcG9pbnQgYW5kIGxpbmUKCWlmKCBh
dmVyX3ZsICE9IEVWQUxfUkVBTCApCgl7CgkgICAgaW50IGNfdnBvcyA9IHZfd19zdGFydCt2X3df
c2l6ZS0oaW50KSgoZG91YmxlKXZfd19zaXplKihhdmVyX3ZsLXZfbWluKS8odl9tYXgtdl9taW4p
KTsKCSAgICBnZEltYWdlU2V0UGl4ZWwoaW0sYXZlcl9wb3MsY192cG9zLGNscl90cm5kKTsKCSAg
ICBpZiggcHJldl92bCAhPSBFVkFMX1JFQUwgKQoJICAgIHsKCQlpbnQgY192cG9zX3BydiA9IHZf
d19zdGFydCt2X3dfc2l6ZS0oaW50KSgoZG91YmxlKXZfd19zaXplKihwcmV2X3ZsLXZfbWluKS8o
dl9tYXgtdl9taW4pKTsKCQlnZEltYWdlTGluZShpbSxwcmV2X3BvcyxjX3Zwb3NfcHJ2LGF2ZXJf
cG9zLGNfdnBvcyxjbHJfdHJuZCk7CgkgICAgfQoJfQoJcHJldl92bCAgPSBhdmVyX3ZsOwoJcHJl
dl9wb3MgPSBhdmVyX3BvczsKCWF2ZXJfdmwgID0gY192YWw7CglhdmVyX3BvcyA9IGNfcG9zOwoJ
YXZlcl90bSA9IGF2ZXJfbHN0dG0gPSBjX3RtOwoJaWYoICFjX3BvcyApIGJyZWFrOwogICAgfQoK
ICAgIC8vPiBHZXQgaW1hZ2UgYW5kIHRyYW5zZmVyIGl0CiAgICBpbnQgaW1nX3N6OwogICAgY2hh
ciAqaW1nX3B0ciA9IChjaGFyICopZ2RJbWFnZVBuZ1B0cihpbSwgJmltZ19zeik7CiAgICByZXou
YXNzaWduKGltZ19wdHIsaW1nX3N6KTsKICAgIGdkRnJlZShpbWdfcHRyKTsKICAgIGdkSW1hZ2VE
ZXN0cm95KGltKTsKCiAgICByZXR1cm4gcmV6Owp9Cgp2b2lkIFRWQXJjaGl2ZTo6Y250ckNtZFBy
b2MoIFhNTE5vZGUgKm9wdCApCnsKICAgIHN0cmluZyBhX3BhdGggPSBvcHQtPmF0dHIoInBhdGgi
KTsKICAgIC8vLSBTZXJ2aWNlIGNvbW1hbmRzIHByb2Nlc3MgLQogICAgaWYoIGFfcGF0aCA9PSAi
L3NlcnYvdmFsIiApCQkvL1ZhbHVlcyBhY2Nlc3MKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwi
aW5mbyIsUldSV1JXLCJyb290Iiwicm9vdCIsU0VRX1JEKSApCS8vVmFsdWUncyBkYXRhIGluZm9y
bWF0aW9uCgl7CgkgICAgc3RyaW5nIGFyY2ggPSBvcHQtPmF0dHIoImFyY2giKTsKCSAgICBvcHQt
PnNldEF0dHIoImVuZCIsVFNZUzo6bGwyc3RyKGVuZChhcmNoKSkpOwoJICAgIG9wdC0+c2V0QXR0
cigiYmVnIixUU1lTOjpsbDJzdHIoYmVnaW4oYXJjaCkpKTsKCSAgICBvcHQtPnNldEF0dHIoInZ0
cCIsVFNZUzo6aW50MnN0cihUVmFsQnVmOjp2YWxUeXBlKCkpKTsKCSAgICBpZiggYXJjaC5lbXB0
eSgpIHx8IGFyY2ggPT0gQlVGX0FSQ0hfTk0gKQoJCW9wdC0+c2V0QXR0cigicGVyIixUU1lTOjps
bDJzdHIoVFZhbEJ1Zjo6cGVyaW9kKCkpKTsKCSAgICBlbHNlCgkgICAgewoJCVJlc0FsbG9jIHJl
cyhhX3JlcyxmYWxzZSk7CgkJZm9yKCBpbnQgaV9hID0gMDsgaV9hIDwgYXJjaF9lbC5zaXplKCk7
IGlfYSsrICkKCQkgICAgaWYoIGFyY2ggPT0gYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCkud29y
a0lkKCkgKQoJCSAgICB7IG9wdC0+c2V0QXR0cigicGVyIixUU1lTOjpsbDJzdHIoKGxvbmcgbG9u
ZykoMTAwMDAwMC4qYXJjaF9lbFtpX2FdLT5hcmNoaXZhdG9yKCkudmFsUGVyaW9kKCkpKSk7IGJy
ZWFrOyAgfQoJICAgIH0KCX0KCWVsc2UgaWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLFJXUldSVywi
cm9vdCIsInJvb3QiLFNFUV9SRCkgKQkvL1ZhbHVlJ3MgZGF0YSByZXF1ZXN0Cgl7CgkgICAgbG9u
ZyBsb25nIHRtICAgICAgPSBhdG9sbChvcHQtPmF0dHIoInRtIikuY19zdHIoKSk7CgkgICAgbG9u
ZyBsb25nIHRtX2dybmQgPSBhdG9sbChvcHQtPmF0dHIoInRtX2dybmQiKS5jX3N0cigpKTsKCSAg
ICBzdHJpbmcgICAgYXJjaCAgICA9IG9wdC0+YXR0cigiYXJjaCIpOwoKCSAgICAvLy0tIFByb2Nl
c3Mgb25lIHZhbHVlIHJlcXVlc3QgLS0KCSAgICBpZiggIXRtICkJdG0gPSBUU1lTOjpjdXJUaW1l
KCk7CgkgICAgaWYoICF0bV9ncm5kICkKCSAgICB7CgkJb3B0LT5zZXRUZXh0KGdldFMoJnRtLGZh
bHNlLGFyY2gpKTsKCQlvcHQtPnNldEF0dHIoInRtIixUU1lTOjpsbDJzdHIodG0pKTsKCQlyZXR1
cm47CgkgICAgfQoJICAgIGlmKCB0bSA8IHRtX2dybmQgKQl0aHJvdyBURXJyb3Iobm9kZVBhdGgo
KS5jX3N0cigpLCJSYW5nZSBlcnJvciIpOwoKCSAgICAvLy0tIFByb2Nlc3Mgb2YgYXJjaGl2ZSBi
bG9jayByZXF1ZXN0IC0tCgkgICAgVFZhbEJ1ZiBidWYoIFRWYWxCdWY6OnZhbFR5cGUoKSwgMTAw
MDAwLCBUVmFsQnVmOjpwZXJpb2QoKSwgdHJ1ZSwgdHJ1ZSApOwoKCSAgICAvLy0tLSBHZXQgdmFs
dWVzIGJ1ZmZlciAtLS0KCSAgICBpZiggKGFyY2guZW1wdHkoKSB8fCBhcmNoID09IEJVRl9BUkNI
X05NKSAmJiB2T0sodG1fZ3JuZCx0bSkgKQoJICAgIHsKCQlUVmFsQnVmOjpnZXRWYWwoYnVmLHRt
X2dybmQsdG0pOwoJCW9wdC0+c2V0QXR0cigiYXJjaCIsQlVGX0FSQ0hfTk0pOwoJICAgIH0KCSAg
ICBlbHNlCgkgICAgewoJCVJlc0FsbG9jIHJlcyggYV9yZXMsIGZhbHNlICk7CgkJZm9yKCBpbnQg
aV9hID0gMDsgaV9hIDwgYXJjaF9lbC5zaXplKCk7IGlfYSsrICkKCQkgICAgaWYoIChhcmNoLmVt
cHR5KCkgfHwgYXJjaCA9PSBhcmNoX2VsW2lfYV0tPmFyY2hpdmF0b3IoKS53b3JrSWQoKSkgJiYK
CQkJKHRtX2dybmQgPD0gYXJjaF9lbFtpX2FdLT5lbmQoKSAmJiB0bSA+IGFyY2hfZWxbaV9hXS0+
YmVnaW4oKSkgKQoJCSAgICB7CgkJCWJ1Zi5zZXRQZXJpb2QoIChsb25nIGxvbmcpKDEwMDAwMDAu
KmFyY2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLnZhbFBlcmlvZCgpKSApOwoJCQlhcmNoX2VsW2lf
YV0tPmdldFZhbCggYnVmLCB0bV9ncm5kLCB0bSApOwoJCQlvcHQtPnNldEF0dHIoImFyY2giLGFy
Y2hfZWxbaV9hXS0+YXJjaGl2YXRvcigpLndvcmtJZCgpKTsKCQkJYnJlYWs7CgkJICAgIH0KCQly
ZXMucmVsZWFzZSgpOwoJICAgIH0KCSAgICAvLy0tLSBQcmVwYXJlIGJ1ZmZlcidzIGRhdGEgZm9y
IHRyYW5zZmVyIC0tLQoJICAgIGJvb2wgICAgaXNFbmQgPSBmYWxzZTsJLy9MYXN0IGFyY2hpdmUg
dmFsdWUgcHJvY2VzcwoJICAgIHN0cmluZyAgdGV4dDsKCSAgICB0ZXh0LnJlc2VydmUoMTAwKTsK
CSAgICBpbnQgdnBvc19iZWcgPSAwLCB2cG9zX2VuZCA9IDAsIHZwb3NfY3VyOwoJICAgIGxvbmcg
bG9uZyBpYmVnID0gYnVmLmJlZ2luKCksIGllbmQgPSBidWYuZW5kKCksIHBlcmlvZCA9IHZtYXgo
YXRvbGwob3B0LT5hdHRyKCJwZXIiKS5jX3N0cigpKSxidWYucGVyaW9kKCkpOwoJICAgIGludCBt
b2RlID0gYXRvaShvcHQtPmF0dHIoIm1vZGUiKS5jX3N0cigpKTsKCSAgICBpZiggbW9kZSA8IDAg
fHwgbW9kZSA+IDIgKSB0aHJvdyBURXJyb3Iobm9kZVBhdGgoKS5jX3N0cigpLCJObyBzdXBwb3J0
IGRhdGEgbW9kZSAnJWQnIixtb2RlKTsKCSAgICBzd2l0Y2goYnVmLnZhbFR5cGUoKSkKCSAgICB7
CgkJY2FzZSBURmxkOjpCb29sZWFuOgoJCXsKCQkgICAgY2hhciB0dmFsX3ByLCB0dmFsX3ByMTsK
CQkgICAgd2hpbGUoIGliZWcgPD0gaWVuZCApCgkJICAgIHsKCQkJY2hhciB0dmFsID0gYnVmLmdl
dEIoJmliZWcsdHJ1ZSk7CgkJCXZwb3NfY3VyID0gKGliZWctYnVmLmJlZ2luKCkpL3BlcmlvZDsK
CQkJaWYoIHZwb3NfY3VyID4gdnBvc19lbmQgKQoJCQkgICAgYm9vbDE6IHN3aXRjaChtb2RlKQoJ
CQkgICAgewoJCQkJY2FzZSAwOiB0ZXh0Kz1UU1lTOjppbnQyc3RyKHR2YWxfcHIpKyJcbiI7CWJy
ZWFrOwoJCQkJY2FzZSAxOgoJCQkJICAgIGlmKCAhdnBvc19lbmQgfHwgdHZhbF9wciAhPSB0dmFs
X3ByMSApCgkJCQkJdGV4dCs9VFNZUzo6aW50MnN0cih2cG9zX2VuZCkrIiAiK1RTWVM6OmludDJz
dHIodHZhbF9wcikrIlxuIjsKCQkJCSAgICB0dmFsX3ByMSA9IHR2YWxfcHI7CQoJCQkJICAgIGJy
ZWFrOwoJCQkJY2FzZSAyOiB0ZXh0Kz10dmFsX3ByOwlicmVhazsKCQkJICAgIH0KCQkJdHZhbF9w
ciA9IHR2YWw7CgkJCXZwb3NfZW5kID0gdnBvc19jdXI7CgkJCWliZWcrKzsKCQkJaWYoIGlzRW5k
ICkJYnJlYWs7CgkJCWlmKCBpYmVnID4gaWVuZCApCXsgaXNFbmQgPSB0cnVlOwlnb3RvIGJvb2wx
OyB9CS8vRmx1c2ggbGFzdCB2YWx1ZQoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCQljYXNlIFRG
bGQ6OkludGVnZXI6CgkJewoJCSAgICBmbG9hdCByb3VuZF9wZXJjID0gYXRvZihvcHQtPmF0dHIo
InJvdW5kX3BlcmMiKS5jX3N0cigpKTsKCQkgICAgaW50IHR2YWxfcHIgPSBFVkFMX0lOVCwgdHZh
bF9wcjE7CgkJICAgIHdoaWxlKCBpYmVnIDw9IGllbmQgKQoJCSAgICB7CgkJCWludCB0dmFsID0g
YnVmLmdldEkoJmliZWcsdHJ1ZSk7CgkJCXZwb3NfY3VyID0gKGliZWctYnVmLmJlZ2luKCkpL3Bl
cmlvZDsKCQkJaWYoIHZwb3NfY3VyIDw9IHZwb3NfZW5kICkKCQkJewoJCQkgICAgaWYoIHR2YWwg
PT0gRVZBTF9JTlQgKSB0dmFsID0gdHZhbF9wcjsKCQkJICAgIGlmKCB0dmFsICE9IEVWQUxfSU5U
ICYmIHR2YWxfcHIgIT0gRVZBTF9JTlQgKQoJCQkgICAgewoJCQkJaW50IHNfayA9IGliZWctcGVy
aW9kKihpYmVnL3BlcmlvZCk7CgkJCQlpbnQgbl9rID0gYnVmLnBlcmlvZCgpOwoJCQkJdHZhbCA9
ICgobG9uZyBsb25nKXR2YWxfcHIqc19rKyhsb25nIGxvbmcpdHZhbCpuX2spLyhzX2srbl9rKTsK
CQkJICAgIH0KCQkJfQoJCQllbHNlIGludDE6IHN3aXRjaChtb2RlKQoJCQl7CgkJCSAgICBjYXNl
IDA6IHRleHQrPVRTWVM6OmludDJzdHIodHZhbF9wcikrIlxuIjsJYnJlYWs7CgkJCSAgICBjYXNl
IDE6IAoJCQkJaWYoICEodnBvc19lbmQgJiYgKCB0dmFsX3ByPT10dmFsX3ByMSB8fCAoKCh0dmFs
X3ByMSA+IDAgJiYgdHZhbF9wciA+IDApIHx8ICh0dmFsX3ByMSA8IDAgJiYgdHZhbF9wciA8IDAp
KSAmJgoJCQkJCTEwMC4qKGRvdWJsZSlhYnModHZhbF9wcjEtdHZhbF9wcikvKGRvdWJsZSl2bWF4
KGFicyh0dmFsX3ByMSksYWJzKHR2YWxfcHIpKSA8PSByb3VuZF9wZXJjKSkpICkKCQkJCXsKCQkJ
CSAgICB0ZXh0Kz1UU1lTOjppbnQyc3RyKHZwb3NfZW5kKSsiICIrVFNZUzo6aW50MnN0cih0dmFs
X3ByKSsiXG4iOwoJCQkJICAgIHR2YWxfcHIxID0gdHZhbF9wcjsKCQkJCX0KCQkJCWJyZWFrOwoJ
CQkgICAgY2FzZSAyOiB0ZXh0Kz1zdHJpbmcoKGNoYXIqKSZ0dmFsX3ByLHNpemVvZihpbnQpKTsg
YnJlYWs7CgkJCX0KCQkJdHZhbF9wciA9IHR2YWw7CgkJCXZwb3NfZW5kID0gdnBvc19jdXI7CgkJ
CWliZWcrKzsKCQkJaWYoIGlzRW5kICkJYnJlYWs7CgkJCWlmKCBpYmVnID4gaWVuZCApCXsgaXNF
bmQgPSB0cnVlOwlnb3RvIGludDE7IH0JLy9GbHVzaCBsYXN0IHZhbHVlCgkJICAgIH0KCQkgICAg
YnJlYWs7CgkJfQoJCWNhc2UgVEZsZDo6UmVhbDoKCQl7CgkJICAgIGZsb2F0IHJvdW5kX3BlcmMg
PSBhdG9mKG9wdC0+YXR0cigicm91bmRfcGVyYyIpLmNfc3RyKCkpOwoJCSAgICBpbnQgICByZWFs
X3ByZWMgID0gYXRvaShvcHQtPmF0dHIoInJlYWxfcHJlYyIpLmNfc3RyKCkpOwoJCSAgICBpZigg
IXJlYWxfcHJlYyApIHJlYWxfcHJlYyA9IDEwOwoJCSAgICBkb3VibGUgdHZhbF9wciA9IEVWQUxf
UkVBTCwgdHZhbF9wcjE7CgkJICAgIHdoaWxlKCBpYmVnIDw9IGllbmQgKQoJCSAgICB7CgkJCWRv
dWJsZSB0dmFsID0gYnVmLmdldFIoJmliZWcsdHJ1ZSk7CgkJCXZwb3NfY3VyID0gKGliZWctYnVm
LmJlZ2luKCkpL3BlcmlvZDsKCQkJaWYoIHZwb3NfY3VyIDw9IHZwb3NfZW5kICkKCQkJewoJCQkg
ICAgaWYoIHR2YWwgPT0gRVZBTF9SRUFMICkgdHZhbCA9IHR2YWxfcHI7CgkJCSAgICBpZiggdHZh
bCAhPSBFVkFMX1JFQUwgJiYgdHZhbF9wciAhPSBFVkFMX1JFQUwgKQoJCQkgICAgewoJCQkJaW50
IHNfayA9IGliZWctcGVyaW9kKihpYmVnL3BlcmlvZCk7CgkJCQlpbnQgbl9rID0gYnVmLnBlcmlv
ZCgpOwoJCQkJdHZhbCA9ICh0dmFsX3ByKnNfayt0dmFsKm5faykvKHNfaytuX2spOwoJCQkgICAg
fQoJCQl9CgkJCWVsc2UgcmVhbDE6IHN3aXRjaChtb2RlKQoJCQl7CgkJCSAgICBjYXNlIDA6IHRl
eHQrPVRTWVM6OnJlYWwyc3RyKHR2YWxfcHIscmVhbF9wcmVjKSsiXG4iOwlicmVhazsKCQkJICAg
IGNhc2UgMToKCQkJCWlmKCAhKHZwb3NfZW5kICYmICggdHZhbF9wcj09dHZhbF9wcjEgfHwgKCgo
dHZhbF9wcjEgPiAwICYmIHR2YWxfcHIgPiAwKSB8fCAodHZhbF9wcjEgPCAwICYmIHR2YWxfcHIg
PCAwKSkgJiYKCQkJCQkxMDAuKmZhYnModHZhbF9wcjEtdHZhbF9wcikvdm1heChmYWJzKHR2YWxf
cHIxKSxmYWJzKHR2YWxfcHIpKSA8PSByb3VuZF9wZXJjKSkpICkKCQkJCXsKCQkJCSAgICB0ZXh0
Kz1UU1lTOjppbnQyc3RyKHZwb3NfZW5kKSsiICIrVFNZUzo6cmVhbDJzdHIodHZhbF9wcixyZWFs
X3ByZWMpKyJcbiI7CgkJCQkgICAgdHZhbF9wcjEgPSB0dmFsX3ByOwoJCQkJfQoJCQkJYnJlYWs7
CgkJCSAgICBjYXNlIDI6IHRleHQrPXN0cmluZygoY2hhciopJnR2YWxfcHIsc2l6ZW9mKGRvdWJs
ZSkpOwlicmVhazsKCQkJfQoJCQl0dmFsX3ByID0gdHZhbDsKCQkJdnBvc19lbmQgPSB2cG9zX2N1
cjsKCQkJaWJlZysrOwoJCQlpZiggaXNFbmQgKQlicmVhazsKCQkJaWYoIGliZWcgPiBpZW5kICkJ
eyBpc0VuZCA9IHRydWU7CWdvdG8gcmVhbDE7IH0JLy9GbHVzaCBsYXN0IHZhbHVlCgkJICAgIH0K
CQkgICAgYnJlYWs7CgkJfQoJCWNhc2UgVEZsZDo6U3RyaW5nOgoJCXsKCQkgICAgc3RyaW5nIHR2
YWxfcHIgPSBFVkFMX1NUUiwgdHZhbF9wcjE7CgkJICAgIHdoaWxlKCBpYmVnIDw9IGllbmQgKQoJ
CSAgICB7CgkJCXN0cmluZyB0dmFsID0gYnVmLmdldFMoJmliZWcsdHJ1ZSk7CgkJCXZwb3NfY3Vy
ID0gKGliZWctYnVmLmJlZ2luKCkpL3BlcmlvZDsKCQkJaWYoIHZwb3NfY3VyID4gdnBvc19lbmQg
KQoJCQkgICAgc3RyMTogc3dpdGNoKG1vZGUpCgkJCSAgICB7CgkJCQljYXNlIDA6IHRleHQrPVRT
WVM6OnN0ckVuY29kZSh0dmFsX3ByLFRTWVM6OkN1c3RvbSwiXG4iKSsiXG4iOwlicmVhazsKCQkJ
CWNhc2UgMToKCQkJCSAgICBpZiggIXZwb3NfZW5kIHx8IHR2YWxfcHIgIT0gdHZhbF9wcjEgKSAK
CQkJCQl0ZXh0Kz1UU1lTOjppbnQyc3RyKHZwb3NfZW5kKSsiICIrVFNZUzo6c3RyRW5jb2RlKHR2
YWxfcHIsVFNZUzo6Q3VzdG9tLCJcbiIpKyJcbiI7CgkJCQkgICAgdHZhbF9wcjEgPSB0dmFsX3By
OwoJCQkJICAgIGJyZWFrOwoJCQkJY2FzZSAyOiB0aHJvdyBURXJyb3Iobm9kZVBhdGgoKS5jX3N0
cigpLCJCaW5hcnkgbW9kZSBubyBzdXBwb3J0IGZvciBzdHJpbmcgZGF0YSIpOwoJCQkgICAgfQoJ
CQl0dmFsX3ByID0gdHZhbDsKCQkJdnBvc19lbmQgPSB2cG9zX2N1cjsKCQkJaWJlZysrOwoJCQlp
ZiggaXNFbmQgKQlicmVhazsKCQkJaWYoIGliZWcgPiBpZW5kICkJeyBpc0VuZCA9IHRydWU7CWdv
dG8gc3RyMTsgfQkvL0ZsdXNoIGxhc3QgdmFsdWUKCQkgICAgfQoJCSAgICBicmVhazsKCQl9Cgkg
ICAgfQoJICAgIC8vLS0tIFNldCByZXN1bHQgYW5kIGluZm9ybWF0aW9uIGF0dHJpYnV0ZXMgLS0t
CgkgICAgb3B0LT5zZXRBdHRyKCJ0bSIsVFNZUzo6bGwyc3RyKCAoYnVmLmVuZCgpL3BlcmlvZCkq
cGVyaW9kICkpOwoJICAgIG9wdC0+c2V0QXR0cigidG1fZ3JuZCIsVFNZUzo6bGwyc3RyKCAoYnVm
LmJlZ2luKCkvcGVyaW9kKSpwZXJpb2QgKyAoKGJ1Zi5iZWdpbigpJXBlcmlvZCk/cGVyaW9kOjAp
ICkpOwoJICAgIG9wdC0+c2V0QXR0cigicGVyIixUU1lTOjpsbDJzdHIocGVyaW9kKSk7CgkgICAg
b3B0LT5zZXRUZXh0KCAobW9kZT09MikgPyBUU1lTOjpzdHJFbmNvZGUodGV4dCxUU1lTOjpiYXNl
NjQpIDogdGV4dCk7Cgl9CglyZXR1cm47CiAgICB9CgogICAgLy8tIEludGVyZmFjZSBjb21hbmRz
IHByb2Nlc3MgLQogICAgLy8tLSBJbmZvIGNvbW1hbmQgcHJvY2VzcyAtLQogICAgaWYoIG9wdC0+
bmFtZSgpID09ICJpbmZvIiApCiAgICB7CglUQ250ck5vZGU6OmNudHJDbWRQcm9jKG9wdCk7Cglj
dHJNa05vZGUoIm9zY2FkYV9jbnRyIixvcHQsLTEsIi8iLF8oIlZhbHVlIGFyY2hpdmU6ICIpK25h
bWUoKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIpOwoJaWYoY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEs
Ii9wcm0iLF8oIkFyY2hpdmUiKSkpCgl7CgkgICAgaWYoY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEs
Ii9wcm0vc3QiLF8oIlN0YXRlIikpKQoJICAgIHsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIv
cHJtL3N0L3N0IixfKCJSdW5pbmciKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIsMSwidHAiLCJib29s
Iik7CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3BybS9zdC9kYiIsXygiQXJjaGl2ZSBEQiIp
LDA2NjQsInJvb3QiLCJBcmNoaXZlIiw0LCJ0cCIsInN0ciIsImRlc3QiLCJzZWxlY3QiLCJzZWxl
Y3QiLCIvZGIvbGlzdCIsCgkJICAgICJoZWxwIixfKCJEQiBhZGRyZXNzIGluIGZvcm1hdCBbPERC
IG1vZHVsZT4uPERCIG5hbWU+XS5cbkZvciB1c2UgbWFpbiB3b3JrIERCIHNldCAnKi4qJy4iKSk7
CgkgICAgfQoJICAgIGlmKGN0ck1rTm9kZSgiYXJlYSIsb3B0LC0xLCIvcHJtL2NmZyIsXygiQ29u
ZmlnIikpKQoJICAgIHsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL2NmZy9pZCIsY2Zn
KCJJRCIpLmZsZCgpLmRlc2NyKCksMDQ0NCwicm9vdCIsIkFyY2hpdmUiLDEsInRwIiwic3RyIik7
CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3BybS9jZmcvbm0iLGNmZygiTkFNRSIpLmZsZCgp
LmRlc2NyKCksMDY2NCwicm9vdCIsIkFyY2hpdmUiLDIsInRwIiwic3RyIiwibGVuIiwiNTAiKTsK
CQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL2NmZy9kc2NyIixjZmcoIkRFU0NSIikuZmxk
KCkuZGVzY3IoKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIsMywidHAiLCJzdHIiLCJjb2xzIiwiNTAi
LCJyb3dzIiwiMyIpOwoJCWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2ZnL3N0YXJ0Iixf
KCJUbyBzdGFydCIpLDA2NjQsInJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIsImJvb2wiKTsKCQljdHJN
a05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL2NmZy92dHAiLGNmZygiVlRZUEUiKS5mbGQoKS5kZXNj
cigpLDA2NjQsInJvb3QiLCJBcmNoaXZlIiwzLCJ0cCIsImRlYyIsImRlc3QiLCJzZWxlY3QiLCJz
ZWxlY3QiLCIvY2ZnL3Z0cF9scyIpOwoJCWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2Zn
L3NyY20iLGNmZygiU291cmNlIikuZmxkKCkuZGVzY3IoKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIs
MywidHAiLCJkZWMiLCJkZXN0Iiwic2VsZWN0Iiwic2VsZWN0IiwiL2NmZy9zcmNtX2xzIik7CgkJ
aWYoIHNyY01vZGUoKSA9PSBQYXNzaXZlQXR0ciB8fCBzcmNNb2RlKCkgPT0gQWN0aXZlQXR0ciAp
CgkJICAgIGN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2ZnL3NyYyIsIiIsMDY2NCwicm9v
dCIsIkFyY2hpdmUiLDMsInRwIiwic3RyIiwiZGVzdCIsInNlbF9lZCIsInNlbGVjdCIsIi9jZmcv
cHJtX2F0cl9scyIpOwoJCWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2ZnL2JfcGVyIixj
ZmcoIkJQRVIiKS5mbGQoKS5kZXNjcigpLDA2NjQsInJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIsInJl
YWwiKTsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL2NmZy9iX3NpemUiLGNmZygiQlNJ
WkUiKS5mbGQoKS5kZXNjcigpLDA2NjQsInJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIsImRlYyIpOwoJ
CWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2ZnL2JfaGdyZCIsY2ZnKCJCSEdSRCIpLmZs
ZCgpLmRlc2NyKCksMDY2NCwicm9vdCIsIkFyY2hpdmUiLDEsInRwIiwiYm9vbCIpOwoJCWN0ck1r
Tm9kZSgiZmxkIixvcHQsLTEsIi9wcm0vY2ZnL2JfaHJlcyIsY2ZnKCJCSFJFUyIpLmZsZCgpLmRl
c2NyKCksMDY2NCwicm9vdCIsIkFyY2hpdmUiLDEsInRwIiwiYm9vbCIpOwoJICAgIH0KCX0KCWlm
KGN0ck1rTm9kZSgiYXJlYSIsb3B0LC0xLCIvYXJjaCIsXygiQXJjaGl2YXRvcnMiKSwwNDQ0LCJy
b290IiwiQXJjaGl2ZSIpKQoJewoJICAgIGlmKGN0ck1rTm9kZSgidGFibGUiLG9wdCwtMSwiL2Fy
Y2gvYXJjaCIsXygiQXJjaGl2YXRvcnMiKSwwNjY0LCJyb290Iiwicm9vdCIsMSwia2V5IiwiYXJj
aCIpKQoJICAgIHsKCQljdHJNa05vZGUoImxpc3QiLG9wdCwtMSwiL2FyY2gvYXJjaC9hcmNoIixf
KCJBcmNoaXZhdG9yIiksMDQ0NCwicm9vdCIsInJvb3QiLDEsInRwIiwic3RyIik7CgkJY3RyTWtO
b2RlKCJsaXN0IixvcHQsLTEsIi9hcmNoL2FyY2gvc3RhcnQiLF8oIlN0YXJ0IiksMDQ0NCwicm9v
dCIsInJvb3QiLDEsInRwIiwiYm9vbCIpOwoJCWN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJj
aC9hcmNoL3Byb2MiLF8oIlByb2Nlc3MiKSwwNjY0LCJyb290Iiwicm9vdCIsMSwidHAiLCJib29s
Iik7CgkJY3RyTWtOb2RlKCJsaXN0IixvcHQsLTEsIi9hcmNoL2FyY2gvcGVyIixfKCJQZXJpb2Qg
KHMpIiksMDQ0NCwicm9vdCIsInJvb3QiLDEsInRwIiwicmVhbCIpOwoJCWN0ck1rTm9kZSgibGlz
dCIsb3B0LC0xLCIvYXJjaC9hcmNoL2JlZyIsXygiQmVnaW4iKSwwNDQ0LCJyb290Iiwicm9vdCIs
MSwidHAiLCJzdHIiKTsKCQljdHJNa05vZGUoImxpc3QiLG9wdCwtMSwiL2FyY2gvYXJjaC9lbmQi
LF8oIkVuZCIpLDA0NDQsInJvb3QiLCJyb290IiwxLCJ0cCIsInN0ciIpOwoJICAgIH0KCX0KCWlm
KCBydW5fc3QgJiYgY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEsIi92YWwiLF8oIlZhbHVlcyIpLDA0
NDAsInJvb3QiLCJBcmNoaXZlIikgKQoJewoJICAgIGN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi92
YWwvdG0iLF8oIlRpbWUiKSwwNjYwLCJyb290IiwiQXJjaGl2ZSIsMSwidHAiLCJ0aW1lIik7Cgkg
ICAgY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3ZhbC91dG0iLCIiLDA2NjAsInJvb3QiLCJBcmNo
aXZlIiw0LCJ0cCIsImRlYyIsImxlbiIsIjYiLCJtaW4iLCIwIiwibWF4IiwiOTk5OTk5Iik7Cgkg
ICAgY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3ZhbC9zaXplIixfKCJTaXplIChzKSIpLDA2NjAs
InJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIsInJlYWwiKTsKCSAgICBjdHJNa05vZGUoImZsZCIsb3B0
LC0xLCIvdmFsL2FyY2giLF8oIkFyY2hpdmF0b3IiKSwwNjYwLCJyb290IiwiQXJjaGl2ZSIsNCwi
dHAiLCJzdHIiLCJkZXN0Iiwic2VsZWN0Iiwic2VsZWN0IiwiL3ZhbC9sc3RBVmFsIiwKCQkiaGVs
cCIsXygiVmFsdWVzIGFyY2hpdmF0b3IuXG5ObyBzZXQgYXJjaGl2YXRvciBmb3IgcHJvY2VzcyBi
eSBidWZmZXIgYW5kIGFsbCBhcmNoaXZhdG9ycy5cblNldCAnPGJ1ZmZlcj4nIGZvciBwcm9jZXNz
IGJ5IGJ1ZmZlci4iKSk7CgkgICAgY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3ZhbC9zd190cmVu
ZCIsXygiU2hvdyB0cmVuZCIpLDA2NjAsInJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIsImJvb2wiKTsK
CSAgICBpZighYXRvaShUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZTaG93VHJu
ZCIsIjAiLG9wdC0+YXR0cigidXNlciIpKS5jX3N0cigpKSkKCSAgICB7CgkJaWYoY3RyTWtOb2Rl
KCJ0YWJsZSIsb3B0LC0xLCIvdmFsL3ZhbCIsXygiVmFsdWVzIHRhYmxlIiksMDQ0MCwicm9vdCIs
IkFyY2hpdmUiKSkKCQl7CgkJICAgIGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvdmFsL3ZhbC8w
IixfKCJUaW1lIiksMDQ0MCwicm9vdCIsIkFyY2hpdmUiLDEsInRwIiwic3RyIik7CgkJICAgIGN0
ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvdmFsL3ZhbC8xIixfKCJWYWx1ZSIpLDA0NDAsInJvb3Qi
LCJBcmNoaXZlIiwxLCJ0cCIsInN0ciIpOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlj
dHJNa05vZGUoImZsZCIsb3B0LC0xLCIvdmFsL3BjdF93IixfKCJQaWN0dXJlIHNpemUiKSwwNjYw
LCJyb290IiwiQXJjaGl2ZSIsMywidHAiLCJkZWMiLCJtaW4iLCIxMDAiLCJtYXgiLCIxMDI0Iik7
CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3ZhbC9wY3RfaCIsIiIsMDY2MCwicm9vdCIsIkFy
Y2hpdmUiLDMsInRwIiwiZGVjIiwibWluIiwiNTAiLCJtYXgiLCI4MDAiKTsKCQljdHJNa05vZGUo
ImZsZCIsb3B0LC0xLCIvdmFsL21heCIsXygiVmFsdWUgc2NhbGUiKSwwNjYwLCJyb290IiwiQXJj
aGl2ZSIsMSwidHAiLCJkZWMiKTsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvdmFsL21pbiIs
IiIsMDY2MCwicm9vdCIsIkFyY2hpdmUiLDEsInRwIiwiZGVjIik7CgkJY3RyTWtOb2RlKCJpbWci
LG9wdCwtMSwiL3ZhbC90cmVuZCIsXygiVmFsdWVzIHRyZW5kIiksMDQ0MCwicm9vdCIsIkFyY2hp
dmUiKTsKCSAgICB9Cgl9CglyZXR1cm47CiAgICB9CiAgICAvLy0tIFByb2Nlc3MgY29tbWFuZCB0
byBwYWdlIC0tCiAgICBpZiggYV9wYXRoID09ICIvcHJtL3N0L3N0IiApCiAgICB7CglpZiggY3Ry
Q2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNl
dFRleHQoIHN0YXJ0U3RhdCgpID8gIjEiIDogIjAiICk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNl
dCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlhdG9pKG9wdC0+dGV4dCgpLmNfc3Ry
KCkpID8gc3RhcnQoKSA6IHN0b3AoKTsKICAgIH0KICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3By
bS9zdC9kYiIgKQogICAgewoJaWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLDA2NjQsInJvb3QiLCJB
cmNoaXZlIixTRVFfUkQpICkJb3B0LT5zZXRUZXh0KCBEQigpICk7CglpZiggY3RyQ2hrTm9kZShv
cHQsInNldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlzZXREQiggb3B0LT50ZXh0
KCkgKTsKICAgIH0KICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvaWQiICYmIGN0ckNo
a05vZGUob3B0KSApCQlvcHQtPnNldFRleHQoaWQoKSk7CiAgICBlbHNlIGlmKCBhX3BhdGggPT0g
Ii9wcm0vY2ZnL25tIiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9v
dCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNldFRleHQoIG5hbWUoKSApOwoJaWYoIGN0ckNo
a05vZGUob3B0LCJzZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0TmFtZSgg
b3B0LT50ZXh0KCkgKTsKICAgIH0KICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvZHNj
ciIgKQogICAgewoJaWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZl
IixTRVFfUkQpICkJb3B0LT5zZXRUZXh0KCBkc2NyKCkgKTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwi
c2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCXNldERzY3IoIG9wdC0+dGV4dCgp
ICk7CiAgICB9CiAgICBlbHNlIGlmKCBhX3BhdGggPT0gIi9wcm0vY2ZnL3N0YXJ0IiApCiAgICB7
CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkg
KQlvcHQtPnNldFRleHQoIHRvU3RhcnQoKSA/ICIxIiA6ICIwIiApOwoJaWYoIGN0ckNoa05vZGUo
b3B0LCJzZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0VG9TdGFydCggYXRv
aShvcHQtPnRleHQoKS5jX3N0cigpKSApOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIv
cHJtL2NmZy92dHAiICkKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290
IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dChUU1lTOjppbnQyc3RyKG1fdnR5cGUp
KTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1dS
KSApCXNldFZhbFR5cGUoKFRGbGQ6OlR5cGUpYXRvaShvcHQtPnRleHQoKS5jX3N0cigpKSk7CiAg
ICB9CiAgICBlbHNlIGlmKCBhX3BhdGggPT0gIi9wcm0vY2ZnL3NyY20iICkKICAgIHsKCWlmKCBj
dHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+
c2V0VGV4dChUU1lTOjppbnQyc3RyKG1fc3JjbW9kZSkpOwoJaWYoIGN0ckNoa05vZGUob3B0LCJz
ZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0U3JjTW9kZSgoVFZBcmNoaXZl
OjpTcmNNb2RlKWF0b2kob3B0LT50ZXh0KCkuY19zdHIoKSksbV9kc291cmMpOwogICAgfQogICAg
ZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL2NmZy9zcmMiICkKICAgIHsKCWlmKCBjdHJDaGtOb2Rl
KG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dCht
X2Rzb3VyYyk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUi
LFNFUV9XUikgKQlzZXRTcmNNb2RlKChUVkFyY2hpdmU6OlNyY01vZGUpbV9zcmNtb2RlLG9wdC0+
dGV4dCgpKTsKICAgIH0KICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvYl9wZXIiICkK
ICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VR
X1JEKSApCW9wdC0+c2V0VGV4dChUU1lTOjpyZWFsMnN0cihtX2JwZXIsNikpOwoJaWYoIGN0ckNo
a05vZGUob3B0LCJzZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0UGVyaW9k
KChsb25nIGxvbmcpKDEwMDAwMDAuKmF0b2Yob3B0LT50ZXh0KCkuY19zdHIoKSkpKTsKICAgIH0K
ICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvYl9zaXplIiApCiAgICB7CglpZiggY3Ry
Q2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNl
dFRleHQoVFNZUzo6aW50MnN0cihtX2JzaXplKSk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIs
MDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlzZXRTaXplKGF0b2kob3B0LT50ZXh0KCku
Y19zdHIoKSkpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL2NmZy9iX2hncmQi
ICkKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIs
U0VRX1JEKSApCW9wdC0+c2V0VGV4dChtX2JoZ3JkPyIxIjoiMCIpOwoJaWYoIGN0ckNoa05vZGUo
b3B0LCJzZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0SGFyZEdyaWQoYXRv
aShvcHQtPnRleHQoKS5jX3N0cigpKSk7CiAgICB9CiAgICBlbHNlIGlmKCBhX3BhdGggPT0gIi9w
cm0vY2ZnL2JfaHJlcyIgKQogICAgewoJaWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLDA2NjQsInJv
b3QiLCJBcmNoaXZlIixTRVFfUkQpICkJb3B0LT5zZXRUZXh0KG1fYmhyZXM/IjEiOiIwIik7Cglp
ZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlz
ZXRIaWdoUmVzVG0oYXRvaShvcHQtPnRleHQoKS5jX3N0cigpKSk7CiAgICB9CiAgICBlbHNlIGlm
KCBhX3BhdGggPT0gIi9jZmcvdnRwX2xzIiAmJiBjdHJDaGtOb2RlKG9wdCkgKQogICAgewoJb3B0
LT5jaGlsZEFkZCgiZWwiKS0+c2V0QXR0cigiaWQiLFRTWVM6OmludDJzdHIoVEZsZDo6Qm9vbGVh
bikpLT5zZXRUZXh0KF8oIkJvb2xlYW4iKSk7CglvcHQtPmNoaWxkQWRkKCJlbCIpLT5zZXRBdHRy
KCJpZCIsVFNZUzo6aW50MnN0cihURmxkOjpJbnRlZ2VyKSktPnNldFRleHQoXygiSW50ZWdlciIp
KTsKCW9wdC0+Y2hpbGRBZGQoImVsIiktPnNldEF0dHIoImlkIixUU1lTOjppbnQyc3RyKFRGbGQ6
OlJlYWwpKS0+c2V0VGV4dChfKCJSZWFsIikpOwoJb3B0LT5jaGlsZEFkZCgiZWwiKS0+c2V0QXR0
cigiaWQiLFRTWVM6OmludDJzdHIoVEZsZDo6U3RyaW5nKSktPnNldFRleHQoXygiU3RyaW5nIikp
OwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvY2ZnL3NyY21fbHMiICYmIGN0ckNoa05v
ZGUob3B0KSApCiAgICB7CglvcHQtPmNoaWxkQWRkKCJlbCIpLT5zZXRBdHRyKCJpZCIsVFNZUzo6
aW50MnN0cihUVkFyY2hpdmU6OlBhc3NpdmUpKS0+c2V0VGV4dChfKCJQYXNzaXZlIikpOwoJb3B0
LT5jaGlsZEFkZCgiZWwiKS0+c2V0QXR0cigiaWQiLFRTWVM6OmludDJzdHIoVFZBcmNoaXZlOjpQ
YXNzaXZlQXR0cikpLT5zZXRUZXh0KF8oIlBhc3NpdmUgcGFyYW0uIGF0cmlidXRlIikpOwoJb3B0
LT5jaGlsZEFkZCgiZWwiKS0+c2V0QXR0cigiaWQiLFRTWVM6OmludDJzdHIoVFZBcmNoaXZlOjpB
Y3RpdmVBdHRyKSktPnNldFRleHQoXygiQWN0aXZlIHBhcmFtLiBhdHJpYnV0ZSIpKTsKICAgIH0K
ICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL2NmZy9wcm1fYXRyX2xzIiAmJiBjdHJDaGtOb2RlKG9w
dCkgKQogICAgewoJdmVjdG9yPHN0cmluZz4gbGlzdDsKCWludCBjX2x2ID0gMDsKCXN0cmluZyBj
X3BhdGggPSAiIiwgY19lbDsKCWZvciggaW50IGNfb2ZmID0gMDsgKGNfZWw9VFNZUzo6c3RyU2Vw
UGFyc2UobV9kc291cmMsMCwnLicsJmNfb2ZmKSkuc2l6ZSgpOyBjX2x2KysgKQoJewoJICAgIG9w
dC0+Y2hpbGRBZGQoImVsIiktPnNldFRleHQoY19wYXRoKTsKCSAgICBpZiggY19sdiApIGNfcGF0
aCs9Ii4iOwoJICAgIGNfcGF0aCs9Y19lbDsKCX0KCW9wdC0+Y2hpbGRBZGQoImVsIiktPnNldFRl
eHQoY19wYXRoKTsKCWlmKCBjX2x2ICE9IDAgKSBjX3BhdGggKz0gIi4iOwoJU1lTLT5ub2RlQXQo
Y19wYXRoLDAsJy4nKS5hdCgpLm5vZGVMaXN0KGxpc3QpOwoJZm9yKCB1bnNpZ25lZCBpX2E9MDsg
aV9hIDwgbGlzdC5zaXplKCk7IGlfYSsrICkKCSAgICBvcHQtPmNoaWxkQWRkKCJlbCIpLT5zZXRU
ZXh0KGNfcGF0aCtsaXN0W2lfYV0pOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvYXJj
aC9hcmNoIiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFy
Y2hpdmUiLFNFUV9SRCkgKQoJewoJICAgIC8vRmlsbCBBcmNoaXZhdG9ycyB0YWJsZQoJICAgIFhN
TE5vZGUgKm5fYXJjaCA9IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJjaC9hcmNoL2FyY2gi
LCIiLDA0NDQpOwoJICAgIFhNTE5vZGUgKm5fc3RhcnQ9IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0x
LCIvYXJjaC9hcmNoL3N0YXJ0IiwiIiwwNDQ0KTsKCSAgICBYTUxOb2RlICpuX3ByYyAgPSBjdHJN
a05vZGUoImxpc3QiLG9wdCwtMSwiL2FyY2gvYXJjaC9wcm9jIiwiIiwwNjY0KTsKCSAgICBYTUxO
b2RlICpuX3BlciAgPSBjdHJNa05vZGUoImxpc3QiLG9wdCwtMSwiL2FyY2gvYXJjaC9wZXIiLCIi
LDA0NDQpOwoJICAgIFhNTE5vZGUgKm5fYmVnICA9IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIv
YXJjaC9hcmNoL2JlZyIsIiIsMDQ0NCk7CgkgICAgWE1MTm9kZSAqbl9lbmQgID0gY3RyTWtOb2Rl
KCJsaXN0IixvcHQsLTEsIi9hcmNoL2FyY2gvZW5kIiwiIiwwNDQ0KTsKCgkgICAgdmVjdG9yPHN0
cmluZz4gdF9hcmNoX2xzLCBhcmNoX2xzOwoJICAgIG93bmVyKCkubW9kTGlzdCh0X2FyY2hfbHMp
OwoJICAgIGZvciggaW50IGlfdGEgPSAwOyBpX3RhIDwgdF9hcmNoX2xzLnNpemUoKTsgaV90YSsr
ICkKCSAgICB7CgkJb3duZXIoKS5hdCh0X2FyY2hfbHNbaV90YV0pLmF0KCkudmFsTGlzdChhcmNo
X2xzKTsKCQlmb3IoIGludCBpX2EgPSAwOyBpX2EgPCBhcmNoX2xzLnNpemUoKTsgaV9hKysgKQoJ
CXsKCQkgICAgVFZBcmNoRWwgKmFfZWwgPSBOVUxMOwoJCSAgICAvL0ZpbmQgYXR0YWNoZWQKCQkg
ICAgUmVzQWxsb2MgcmVzKGFfcmVzLGZhbHNlKTsKCQkgICAgZm9yKCBpbnQgaV9sID0gMDsgaV9s
IDwgYXJjaF9lbC5zaXplKCk7IGlfbCsrICkKCQkJaWYoIGFyY2hfZWxbaV9sXS0+YXJjaGl2YXRv
cigpLm93bmVyKCkubW9kSWQoKSA9PSB0X2FyY2hfbHNbaV90YV0gJiYgCgkJCQlhcmNoX2VsW2lf
bF0tPmFyY2hpdmF0b3IoKS5pZCgpID09IGFyY2hfbHNbaV9hXSApCgkJCSAgICBhX2VsID0gYXJj
aF9lbFtpX2xdOwoJCSAgICAvL0ZpbGwgdGFibGUgZWxlbWVudAoJCSAgICBpZihuX2FyY2gpCW5f
YXJjaC0+Y2hpbGRBZGQoImVsIiktPnNldFRleHQob3duZXIoKS5hdCh0X2FyY2hfbHNbaV90YV0p
LmF0KCkudmFsQXQoYXJjaF9sc1tpX2FdKS5hdCgpLndvcmtJZCgpKTsKCQkgICAgaWYobl9zdGFy
dCkJbl9zdGFydC0+Y2hpbGRBZGQoImVsIiktPnNldFRleHQob3duZXIoKS5hdCh0X2FyY2hfbHNb
aV90YV0pLmF0KCkudmFsQXQoYXJjaF9sc1tpX2FdKS5hdCgpLnN0YXJ0U3RhdCgpPyIxIjoiMCIp
OwoJCSAgICBpZihuX3BlcikJbl9wZXItPmNoaWxkQWRkKCJlbCIpLT5zZXRUZXh0KFRTWVM6OnJl
YWwyc3RyKG93bmVyKCkuYXQodF9hcmNoX2xzW2lfdGFdKS5hdCgpLnZhbEF0KGFyY2hfbHNbaV9h
XSkuYXQoKS52YWxQZXJpb2QoKSw2KSk7CgkJICAgIGlmKGFfZWwpCgkJICAgIHsKCQkJaWYobl9w
cmMpCW5fcHJjLT5jaGlsZEFkZCgiZWwiKS0+c2V0VGV4dCgiMSIpOwoJCQlzdHJ1Y3QgdG0gdHRt
OwoJCQlpZihuX2VuZCkKCQkJewoJCQkgICAgdGltZV90IHRtX3QgPSBhX2VsLT5lbmQoKS8xMDAw
MDAwOyBsb2NhbHRpbWVfcigmdG1fdCwmdHRtKTsKCQkJICAgIG5fZW5kLT5jaGlsZEFkZCgiZWwi
KS0+c2V0VGV4dChUU1lTOjpzdHJNZXNzKCIlZC0lMDJkLSVkICVkOiUwMmQ6JTAyZC4lZCIsCgkJ
CQkgICAgdHRtLnRtX21kYXksdHRtLnRtX21vbisxLHR0bS50bV95ZWFyKzE5MDAsdHRtLnRtX2hv
dXIsdHRtLnRtX21pbix0dG0udG1fc2VjLGFfZWwtPmVuZCgpJTEwMDAwMDApKTsKCQkJfQoJCQlp
ZihuX2JlZykKCQkJewoJCQkgICAgdGltZV90IHRtX3QgPSBhX2VsLT5iZWdpbigpLzEwMDAwMDA7
IGxvY2FsdGltZV9yKCZ0bV90LCZ0dG0pOwoJCQkgICAgbl9iZWctPmNoaWxkQWRkKCJlbCIpLT5z
ZXRUZXh0KFRTWVM6OnN0ck1lc3MoIiVkLSUwMmQtJWQgJWQ6JTAyZDolMDJkLiVkIiwKCQkJCSAg
ICB0dG0udG1fbWRheSx0dG0udG1fbW9uKzEsdHRtLnRtX3llYXIrMTkwMCx0dG0udG1faG91cix0
dG0udG1fbWluLHR0bS50bV9zZWMsYV9lbC0+YmVnaW4oKSUxMDAwMDAwKSk7CgkJCX0KCQkgICAg
fQoJCSAgICBlbHNlCgkJICAgIHsKCQkJaWYobl9wcmMpCW5fcHJjLT5jaGlsZEFkZCgiZWwiKS0+
c2V0VGV4dCgiMCIpOyAKCQkJaWYobl9lbmQpCW5fZW5kLT5jaGlsZEFkZCgiZWwiKS0+c2V0VGV4
dCgiIik7IAoJCQlpZihuX2JlZykJbl9iZWctPmNoaWxkQWRkKCJlbCIpLT5zZXRUZXh0KCIiKTsK
CQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2NCwicm9v
dCIsIkFyY2hpdmUiLFNFUV9XUikgKQoJewoJICAgIGlmKCBvcHQtPmF0dHIoImNvbCIpID09ICJw
cm9jIiApCgkgICAgewoJCWF0b2kob3B0LT50ZXh0KCkuY19zdHIoKSkgPyBhcmNoaXZhdG9yQXR0
YWNoKCBvcHQtPmF0dHIoImtleV9hcmNoIikgKSA6CgkJCQkJICAgIGFyY2hpdmF0b3JEZXRhY2go
IG9wdC0+YXR0cigia2V5X2FyY2giKSwgdHJ1ZSApOwoJCW1vZGlmKCk7CgkgICAgfQoJfQogICAg
fQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvdmFsL3RtIiApCiAgICB7CglpZiggY3RyQ2hrTm9k
ZShvcHQsImdldCIsMDY2MCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQoJewoJICAgIG9wdC0+
c2V0VGV4dChUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZhVG0iLCIwIixvcHQt
PmF0dHIoInVzZXIiKSkpOwoJICAgIGlmKCAhYXRvaShvcHQtPnRleHQoKS5jX3N0cigpKSApCW9w
dC0+c2V0VGV4dChUU1lTOjppbnQyc3RyKHRpbWUoTlVMTCkpKTsKCX0KCWlmKCBjdHJDaGtOb2Rl
KG9wdCwic2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCgkgICAgVEJEUzo6Z2Vu
REJTZXQob3duZXIoKS5ub2RlUGF0aCgpKyJ2YVRtIiwoYXRvaShvcHQtPnRleHQoKS5jX3N0cigp
KT49dGltZShOVUxMKSk/IjAiOm9wdC0+dGV4dCgpLG9wdC0+YXR0cigidXNlciIpKTsKICAgIH0K
ICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3ZhbC91dG0iICkKICAgIHsKCWlmKCBjdHJDaGtOb2Rl
KG9wdCwiZ2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dChU
QkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZhVG1fdSIsIjAiLG9wdC0+YXR0cigi
dXNlciIpKSk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2MCwicm9vdCIsIkFyY2hpdmUi
LFNFUV9XUikgKQlUQkRTOjpnZW5EQlNldChvd25lcigpLm5vZGVQYXRoKCkrInZhVG1fdSIsb3B0
LT50ZXh0KCksb3B0LT5hdHRyKCJ1c2VyIikpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09
ICIvdmFsL3NpemUiICkKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjYwLCJyb290
IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dChUQkRTOjpnZW5EQkdldChvd25lcigp
Lm5vZGVQYXRoKCkrInZhU2l6ZSIsIjEiLG9wdC0+YXR0cigidXNlciIpKSk7CglpZiggY3RyQ2hr
Tm9kZShvcHQsInNldCIsMDY2MCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlUQkRTOjpnZW5E
QlNldChvd25lcigpLm5vZGVQYXRoKCkrInZhU2l6ZSIsb3B0LT50ZXh0KCksb3B0LT5hdHRyKCJ1
c2VyIikpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvdmFsL2FyY2giKQogICAgewoJ
aWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLDA2NjAsInJvb3QiLCJBcmNoaXZlIixTRVFfUkQpICkJ
b3B0LT5zZXRUZXh0KFRCRFM6OmdlbkRCR2V0KG93bmVyKCkubm9kZVBhdGgoKSsidkFyY2giLCIi
LG9wdC0+YXR0cigidXNlciIpKSk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2MCwicm9v
dCIsIkFyY2hpdmUiLFNFUV9XUikgKQlUQkRTOjpnZW5EQlNldChvd25lcigpLm5vZGVQYXRoKCkr
InZBcmNoIixvcHQtPnRleHQoKSxvcHQtPmF0dHIoInVzZXIiKSk7CiAgICB9CiAgICBlbHNlIGlm
KCBhX3BhdGggPT0gIi92YWwvc3dfdHJlbmQiICkKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwi
Z2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dChUQkRTOjpn
ZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZTaG93VHJuZCIsIjAiLG9wdC0+YXR0cigidXNl
ciIpKSk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2MCwicm9vdCIsIkFyY2hpdmUiLFNF
UV9XUikgKQlUQkRTOjpnZW5EQlNldChvd25lcigpLm5vZGVQYXRoKCkrInZTaG93VHJuZCIsb3B0
LT50ZXh0KCksb3B0LT5hdHRyKCJ1c2VyIikpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09
ICIvdmFsL3BjdF93IiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2MCwicm9v
dCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNldFRleHQoVEJEUzo6Z2VuREJHZXQob3duZXIo
KS5ub2RlUGF0aCgpKyJ2UGN0VyIsIjY1MCIsb3B0LT5hdHRyKCJ1c2VyIikpKTsKCWlmKCBjdHJD
aGtOb2RlKG9wdCwic2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCVRCRFM6Omdl
bkRCU2V0KG93bmVyKCkubm9kZVBhdGgoKSsidlBjdFciLG9wdC0+dGV4dCgpLG9wdC0+YXR0cigi
dXNlciIpKTsKICAgIH0KICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3ZhbC9wY3RfaCIgKQogICAg
ewoJaWYoIGN0ckNoa05vZGUob3B0LCJnZXQiLDA2NjAsInJvb3QiLCJBcmNoaXZlIixTRVFfUkQp
ICkJb3B0LT5zZXRUZXh0KFRCRFM6OmdlbkRCR2V0KG93bmVyKCkubm9kZVBhdGgoKSsidlBjdEgi
LCIyMzAiLG9wdC0+YXR0cigidXNlciIpKSk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNldCIsMDY2
MCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlUQkRTOjpnZW5EQlNldChvd25lcigpLm5vZGVQ
YXRoKCkrInZQY3RIIixvcHQtPnRleHQoKSxvcHQtPmF0dHIoInVzZXIiKSk7CiAgICB9CiAgICBl
bHNlIGlmKCBhX3BhdGggPT0gIi92YWwvbWF4IiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQs
ImdldCIsMDY2MCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNldFRleHQoVEJEUzo6
Z2VuREJHZXQob3duZXIoKS5ub2RlUGF0aCgpKyJ2TWF4IiwiMCIsb3B0LT5hdHRyKCJ1c2VyIikp
KTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1dS
KSApCVRCRFM6OmdlbkRCU2V0KG93bmVyKCkubm9kZVBhdGgoKSsidk1heCIsb3B0LT50ZXh0KCks
b3B0LT5hdHRyKCJ1c2VyIikpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvdmFsL21p
biIgKQogICAgewogICAgICAgIGlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjYwLCJyb290Iiwi
QXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0VGV4dChUQkRTOjpnZW5EQkdldChvd25lcigpLm5v
ZGVQYXRoKCkrInZNaW4iLCIwIixvcHQtPmF0dHIoInVzZXIiKSkpOwogICAgICAgIGlmKCBjdHJD
aGtOb2RlKG9wdCwic2V0IiwwNjYwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCVRCRFM6Omdl
bkRCU2V0KG93bmVyKCkubm9kZVBhdGgoKSsidk1pbiIsb3B0LT50ZXh0KCksb3B0LT5hdHRyKCJ1
c2VyIikpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvdmFsL2xzdEFWYWwiICYmIGN0
ckNoa05vZGUob3B0LCJnZXQiLDA0NDApICkKICAgIHsKCW9wdC0+Y2hpbGRBZGQoImVsIiktPnNl
dFRleHQoIiIpOwoJb3B0LT5jaGlsZEFkZCgiZWwiKS0+c2V0VGV4dChCVUZfQVJDSF9OTSk7Cgl2
ZWN0b3I8c3RyaW5nPiBsc20sIGxzYTsKCW93bmVyKCkubW9kTGlzdChsc20pOwoJZm9yKCBpbnQg
aV9tID0gMDsgaV9tIDwgbHNtLnNpemUoKTsgaV9tKysgKQoJewoJICAgIG93bmVyKCkuYXQobHNt
W2lfbV0pLmF0KCkudmFsTGlzdChsc2EpOwoJICAgIGZvciggaW50IGlfYSA9IDA7IGlfYSA8IGxz
YS5zaXplKCk7IGlfYSsrICkKCSAgICBvcHQtPmNoaWxkQWRkKCJlbCIpLT5zZXRUZXh0KGxzbVtp
X21dKyIuIitsc2FbaV9hXSk7Cgl9CiAgICB9CiAgICBlbHNlIGlmKCBhX3BhdGggPT0gIi92YWwv
dmFsIiAmJiBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNDQwLCJyb290IiwiQXJjaGl2ZSIsU0VRX1JE
KSApCiAgICB7Cglsb25nIGxvbmcgZW5kID0gKGxvbmcgbG9uZylhdG9pKFRCRFM6OmdlbkRCR2V0
KG93bmVyKCkubm9kZVBhdGgoKSsidmFUbSIsIjAiLG9wdC0+YXR0cigidXNlciIpKS5jX3N0cigp
KSoxMDAwMDAwOwoJaWYoICEoZW5kLzEwMDAwMDApICkgZW5kID0gKGxvbmcgbG9uZyl0aW1lKE5V
TEwpICogMTAwMDAwMDsKCWVuZCArPSBhdG9pKFRCRFM6OmdlbkRCR2V0KG93bmVyKCkubm9kZVBh
dGgoKSsidmFUbV91IiwiMCIsb3B0LT5hdHRyKCJ1c2VyIikpLmNfc3RyKCkpOwoJbG9uZyBsb25n
IGJlZyA9IGVuZCAtIChsb25nIGxvbmcpKGF0b2YoVEJEUzo6Z2VuREJHZXQob3duZXIoKS5ub2Rl
UGF0aCgpKyJ2YVNpemUiLCIxIixvcHQtPmF0dHIoInVzZXIiKSkuY19zdHIoKSkqMWU2KTsKCglU
VmFsQnVmIGJ1ZiggVEZsZDo6U3RyaW5nLCAwLCAwLCBmYWxzZSwgdHJ1ZSApOwoJZ2V0VmFsKCBi
dWYsIGJlZywgZW5kLCBUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZBcmNoIiwi
IixvcHQtPmF0dHIoInVzZXIiKSksIDIwMDAgKTsKCglYTUxOb2RlICpuX3RtICAgPSBjdHJNa05v
ZGUoImxpc3QiLG9wdCwtMSwiL3ZhbC92YWwvMCIsIiIsMDQ0MCk7CglYTUxOb2RlICpuX3ZhbCAg
PSBjdHJNa05vZGUoImxpc3QiLG9wdCwtMSwiL3ZhbC92YWwvMSIsIiIsMDQ0MCk7CgoJc3RydWN0
IHRtIHR0bTsKCXRpbWVfdCB0bV90OwoJbG9uZyBsb25nIGNfdG0gPSBidWYuYmVnaW4oKTsKCWlm
KGJ1Zi5lbmQoKSAmJiBidWYuYmVnaW4oKSkKCSAgICB3aGlsZShjX3RtIDw9IGJ1Zi5lbmQoKSkK
CSAgICB7CgkgICAgICAgIHN0cmluZyB2YWwgPSBidWYuZ2V0UygmY190bSx0cnVlKTsKCQlpZigg
bl90bSApCgkJewoJCSAgICB0bV90ID0gY190bS8xMDAwMDAwOwoJCSAgICBsb2NhbHRpbWVfcigm
dG1fdCwmdHRtKTsKCQkgICAgbl90bS0+Y2hpbGRBZGQoImVsIiktPnNldFRleHQoVFNZUzo6c3Ry
TWVzcygiJWQtJTAyZC0lZCAlZDolMDJkOiUwMmQuJWQiLAoJCQl0dG0udG1fbWRheSx0dG0udG1f
bW9uKzEsdHRtLnRtX3llYXIrMTkwMCx0dG0udG1faG91cix0dG0udG1fbWluLHR0bS50bV9zZWMs
Y190bSUxMDAwMDAwKSk7CgkJfQoJCWlmKCBuX3ZhbCApCW5fdmFsLT5jaGlsZEFkZCgiZWwiKS0+
c2V0VGV4dCh2YWwpOwoJCWNfdG0rKzsKCSAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBhX3BhdGgg
PT0gIi92YWwvdHJlbmQiICYmIGN0ckNoa05vZGUob3B0LCJnZXQiLDA0NDQsInJvb3QiLCJBcmNo
aXZlIixTRVFfUkQpICkKICAgIHsKCWludCB2UGN0VyA9IHZtaW4oMTAyNCx2bWF4KDEwMCxhdG9p
KFRCRFM6OmdlbkRCR2V0KG93bmVyKCkubm9kZVBhdGgoKSsidlBjdFciLCI2NTAiLG9wdC0+YXR0
cigidXNlciIpKS5jX3N0cigpKSkpOwoJaW50IHZQY3RIID0gdm1pbig4MDAsdm1heCg1MCxhdG9p
KFRCRFM6OmdlbkRCR2V0KG93bmVyKCkubm9kZVBhdGgoKSsidlBjdEgiLCIyMzAiLG9wdC0+YXR0
cigidXNlciIpKS5jX3N0cigpKSkpOwoJZG91YmxlIHZNYXggPSBhdG9mKFRCRFM6OmdlbkRCR2V0
KG93bmVyKCkubm9kZVBhdGgoKSsidk1heCIsIjAiLG9wdC0+YXR0cigidXNlciIpKS5jX3N0cigp
KTsKCWRvdWJsZSB2TWluID0gYXRvZihUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkr
InZNaW4iLCIwIixvcHQtPmF0dHIoInVzZXIiKSkuY19zdHIoKSk7Cglsb25nIGxvbmcgZW5kID0g
KGxvbmcgbG9uZykgYXRvaShUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZhVG0i
LFRTWVM6OmludDJzdHIodGltZShOVUxMKSksb3B0LT5hdHRyKCJ1c2VyIikpLmNfc3RyKCkpKjEw
MDAwMDArCgkJCQkgICAgYXRvaShUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRoKCkrInZh
VG1fdSIsIjAiLG9wdC0+YXR0cigidXNlciIpKS5jX3N0cigpKTsKCWlmKCAhKGVuZC8xMDAwMDAw
KSApCWVuZCA9IChsb25nIGxvbmcpdGltZShOVUxMKSAqIDEwMDAwMDA7Cglsb25nIGxvbmcgYmVn
ID0gZW5kIC0gKGxvbmcgbG9uZykoYXRvZihUQkRTOjpnZW5EQkdldChvd25lcigpLm5vZGVQYXRo
KCkrInZhU2l6ZSIsIjEiLG9wdC0+YXR0cigidXNlciIpKS5jX3N0cigpKSoxZTYpOwoKCW9wdC0+
c2V0VGV4dChUU1lTOjpzdHJFbmNvZGUobWFrZVRyZW5kSW1nKGJlZyxlbmQsVEJEUzo6Z2VuREJH
ZXQob3duZXIoKS5ub2RlUGF0aCgpKyJ2QXJjaCIsIiIsb3B0LT5hdHRyKCJ1c2VyIikpLHZQY3RX
LHZQY3RILHZNYXgsdk1pbiksVFNZUzo6YmFzZTY0KSk7CglvcHQtPnNldEF0dHIoInRwIiwicG5n
Iik7CiAgICB9CiAgICBlbHNlIFRDbnRyTm9kZTo6Y250ckNtZFByb2Mob3B0KTsKfQoKLy8qKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vKiBUVkFyY2hp
dmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgovLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVFZBcmNoaXZhdG9yOjpUVkFyY2hp
dmF0b3IoIGNvbnN0IHN0cmluZyAmaWlkLCBjb25zdCBzdHJpbmcgJmlkYiwgVEVsZW0gKmNmX2Vs
ICkgOiBydW5fc3QoZmFsc2UpLCBwcmNfc3QoZmFsc2UpLAogICAgdG1fY2FsYygwLjApLCBUQ29u
ZmlnKGNmX2VsKSwgbV9kYihpZGIpLCBtX2lkKGNmZygiSUQiKS5nZXRTZCgpKSwgbV9uYW1lKGNm
ZygiTkFNRSIpLmdldFNkKCkpLAogICAgbV9kc2NyKGNmZygiREVTQ1IiKS5nZXRTZCgpKSwgbV9h
ZGRyKGNmZygiQUREUiIpLmdldFNkKCkpLCBtX3N0YXJ0KGNmZygiU1RBUlQiKS5nZXRCZCgpKSwK
ICAgIG1fdl9wZXIoY2ZnKCJWX1BFUiIpLmdldFJkKCkpLCBtX2FfcGVyKGNmZygiQV9QRVIiKS5n
ZXRJZCgpKQp7CiAgICBtX2lkID0gaWlkOwoKICAgIC8vPiBDcmVhdGUgY2FsYyB0aW1lcgogICAg
c3RydWN0IHNpZ2V2ZW50IHNpZ2V2OwogICAgbWVtc2V0KCZzaWdldiwwLHNpemVvZihzaWdldikp
OwogICAgc2lnZXYuc2lnZXZfbm90aWZ5ID0gU0lHRVZfVEhSRUFEOwogICAgc2lnZXYuc2lnZXZf
dmFsdWUuc2l2YWxfcHRyID0gdGhpczsKICAgIHNpZ2V2LnNpZ2V2X25vdGlmeV9mdW5jdGlvbiA9
IFRhc2s7CiAgICBzaWdldi5zaWdldl9ub3RpZnlfYXR0cmlidXRlcyA9IE5VTEw7CiAgICB0aW1l
cl9jcmVhdGUoQ0xPQ0tfUkVBTFRJTUUsJnNpZ2V2LCZ0bUlkKTsKfQoKVFZBcmNoaXZhdG9yOjp+
VFZBcmNoaXZhdG9yKCkKewogICAgdGltZXJfZGVsZXRlKHRtSWQpOwp9CgpUQ250ck5vZGUgJlRW
QXJjaGl2YXRvcjo6b3BlcmF0b3I9KCBUQ250ck5vZGUgJm5vZGUgKQp7CiAgICBUVkFyY2hpdmF0
b3IgKnNyY19uID0gZHluYW1pY19jYXN0PFRWQXJjaGl2YXRvcio+KCZub2RlKTsKICAgIGlmKCAh
c3JjX24gKSByZXR1cm4gKnRoaXM7CgogICAgLy8+IENvbmZpZ3VyYXRpb24gY29weQogICAgc3Ry
aW5nIHRpZCA9IGlkKCk7CiAgICAqKFRDb25maWcqKXRoaXMgPSAqKFRDb25maWcqKXNyY19uOwog
ICAgbV9pZCA9IHRpZDsKICAgIG1fZGIgPSBzcmNfbi0+bV9kYjsKCiAgICBpZiggc3JjX24tPnN0
YXJ0U3RhdCgpICYmIHRvU3RhcnQoKSAmJiAhc3RhcnRTdGF0KCkgKQogICAgICAgIHN0YXJ0KCAp
OwoKICAgIHJldHVybiAqdGhpczsKfQoKc3RyaW5nIFRWQXJjaGl2YXRvcjo6bmFtZSgpCnsKICAg
IHJldHVybiAobV9uYW1lLnNpemUoKSk/bV9uYW1lOm1faWQ7Cn0KCnN0cmluZyBUVkFyY2hpdmF0
b3I6OnRibCggKQp7CiAgICByZXR1cm4gb3duZXIoKS5vd25lcigpLnN1YklkKCkrIl92YWxfcHJv
YyI7Cn0KCnZvaWQgVFZBcmNoaXZhdG9yOjpzZXRWYWxQZXJpb2QoIGRvdWJsZSBpcGVyICkKewog
ICAgbV92X3BlciA9IGlwZXIgPyBpcGVyIDogMS47CgogICAgLy8+IENhbGwgc29ydCBmb3IgYWxs
IGFyY2hpdmVzCiAgICBSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwogICAgZm9yKCBtYXA8c3Ry
aW5nLFRWQXJjaEVsKj46Oml0ZXJhdG9yIGllbCA9IGFyY2hFbC5iZWdpbigpOyBpZWwgIT0gYXJj
aEVsLmVuZCgpOyArK2llbCApCglpZWwtPnNlY29uZC0+YXJjaGl2ZSgpLmFyY2hpdmF0b3JTb3J0
KCk7CgogICAgbW9kaWYoKTsKfQoKdm9pZCBUVkFyY2hpdmF0b3I6OnBvc3RFbmFibGUoaW50IGZs
YWcpCnsKICAgIGNmZygiTU9EVUwiKS5zZXRTKG93bmVyKCkubW9kSWQoKSk7Cn0KCnZvaWQgVFZB
cmNoaXZhdG9yOjpwcmVEaXNhYmxlKCBpbnQgZmxhZyApCnsKICAgIGlmKCBzdGFydFN0YXQoKSAp
CXN0b3AoIGZsYWcgKTsKfQoKdm9pZCBUVkFyY2hpdmF0b3I6OnBvc3REaXNhYmxlKCBpbnQgZmxh
ZyApCnsKICAgIHRyeQogICAgewoJaWYoIGZsYWcgKQoJICAgIFNZUy0+ZGIoKS5hdCgpLmRhdGFE
ZWwoZnVsbERCKCksU1lTLT5hcmNoaXZlKCkuYXQoKS5ub2RlUGF0aCgpK3RibCgpLCp0aGlzLHRy
dWUpOwogICAgfWNhdGNoKFRFcnJvciBlcnIpCiAgICB7IG1lc3Nfd2FybmluZyhlcnIuY2F0LmNf
c3RyKCksIiVzIixlcnIubWVzcy5jX3N0cigpKTsgfQp9CgpzdHJpbmcgVFZBcmNoaXZhdG9yOjp3
b3JrSWQoKQp7CiAgICByZXR1cm4gb3duZXIoKS5tb2RJZCgpKyIuIitpZCgpOwp9Cgp2b2lkIFRW
QXJjaGl2YXRvcjo6c3RhcnQoKQp7CiAgICBpZiggcnVuX3N0ICkgcmV0dXJuOwogICAgLy8+IFN0
YXJ0IGludGVydmFsIHRpbWVyIGZvciBwZXJpb2RpYyB0aHJlYWQgY3JlYXRpbmcKICAgIHN0cnVj
dCBpdGltZXJzcGVjIGl0dmFsOwogICAgaXR2YWwuaXRfaW50ZXJ2YWwudHZfc2VjID0gaXR2YWwu
aXRfdmFsdWUudHZfc2VjID0gbV9hX3BlcjsKICAgIGl0dmFsLml0X2ludGVydmFsLnR2X25zZWMg
PSBpdHZhbC5pdF92YWx1ZS50dl9uc2VjID0gMDsKICAgIHRpbWVyX3NldHRpbWUodG1JZCwgMCwg
Jml0dmFsLCBOVUxMKTsKCiAgICBydW5fc3QgPSB0cnVlOwp9OwoKdm9pZCBUVkFyY2hpdmF0b3I6
OnN0b3AoIGJvb2wgZnVsbF9kZWwgKQp7CiAgICBpZiggIXJ1bl9zdCApIHJldHVybjsKCiAgICAv
Lz4gU3RvcCBpbnRlcnZhbCB0aW1lciBmb3IgcGVyaW9kaWMgdGhyZWFkIGNyZWF0aW5nCiAgICBz
dHJ1Y3QgaXRpbWVyc3BlYyBpdHZhbDsKICAgIGl0dmFsLml0X2ludGVydmFsLnR2X3NlYyA9IGl0
dmFsLml0X2ludGVydmFsLnR2X25zZWMgPSBpdHZhbC5pdF92YWx1ZS50dl9zZWMgPSBpdHZhbC5p
dF92YWx1ZS50dl9uc2VjID0gMDsKICAgIHRpbWVyX3NldHRpbWUodG1JZCwgMCwgJml0dmFsLCBO
VUxMKTsKICAgIGlmKCBUU1lTOjpldmVudFdhaXQoIHByY19zdCwgZmFsc2UsIG5vZGVQYXRoKCkr
InN0b3AiLDUpICkKCXRocm93IFRFcnJvcihub2RlUGF0aCgpLmNfc3RyKCksXygiQXJjaGl2ZSB0
aHJlYWQgaXMgbm90IHN0b3BwZWQhIikpOwoKICAgIC8vPiBEZXRhY2ggZnJvbSBhbGwgYXJjaGl2
ZXMKICAgIFJlc0FsbG9jIHJlcyhhX3JlcyxmYWxzZSk7CiAgICB3aGlsZShhcmNoRWwuc2l6ZSgp
KQogICAgewoJQXV0b0hEPFRWQXJjaGl2ZT4gYXJjaCgmYXJjaEVsLmJlZ2luKCktPnNlY29uZC0+
YXJjaGl2ZSgpKTsKCXJlcy5yZWxlYXNlKCk7CglhcmNoLmF0KCkuYXJjaGl2YXRvckRldGFjaCh3
b3JrSWQoKSxmdWxsX2RlbCk7CglyZXMucmVxdWVzdChmYWxzZSk7CiAgICB9CgogICAgcnVuX3N0
ID0gZmFsc2U7Cn07Cgp2b2lkIFRWQXJjaGl2YXRvcjo6YXJjaGl2ZUxpc3QoIHZlY3RvcjxzdHJp
bmc+ICZscyApCnsKICAgIFJlc0FsbG9jIHJlcyhhX3JlcyxmYWxzZSk7CiAgICBscy5jbGVhcigp
OwogICAgZm9yKCBtYXA8c3RyaW5nLFRWQXJjaEVsKj46Oml0ZXJhdG9yIGllbCA9IGFyY2hFbC5i
ZWdpbigpOyBpZWwgIT0gYXJjaEVsLmVuZCgpOyArK2llbCApCglscy5wdXNoX2JhY2soaWVsLT5m
aXJzdCk7Cn0KCmJvb2wgVFZBcmNoaXZhdG9yOjphcmNoaXZlUHJlc2VudCggY29uc3Qgc3RyaW5n
ICZpaWQgKQp7CiAgICBSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwogICAgaWYoIGFyY2hFbC5m
aW5kKGlpZCkgIT0gYXJjaEVsLmVuZCgpICkJcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7
Cn0KClRWQXJjaEVsICpUVkFyY2hpdmF0b3I6OmFyY2hpdmVQbGFjZSggVFZBcmNoaXZlICZpdGVt
ICkKewogICAgUmVzQWxsb2MgcmVzKGFfcmVzLHRydWUpOwogICAgbWFwPHN0cmluZyxUVkFyY2hF
bCo+OjppdGVyYXRvciBpZWwgPSBhcmNoRWwuZmluZChpdGVtLmlkKCkpOwogICAgaWYoIGllbCAh
PSBhcmNoRWwuZW5kKCkgKQlyZXR1cm4gaWVsLT5zZWNvbmQ7CiAgICBUVkFyY2hFbCAqaXRfZWwg
PSBnZXRBcmNoRWwoIGl0ZW0gKTsKICAgIGFyY2hFbFtpdGVtLmlkKCldID0gaXRfZWw7CgogICAg
cmV0dXJuIGl0X2VsOwp9Cgp2b2lkIFRWQXJjaGl2YXRvcjo6YXJjaGl2ZVJlbW92ZSggY29uc3Qg
c3RyaW5nICZpaWQsIGJvb2wgZnVsbCApCnsKICAgIFJlc0FsbG9jIHJlcyhhX3Jlcyx0cnVlKTsK
ICAgIG1hcDxzdHJpbmcsVFZBcmNoRWwqPjo6aXRlcmF0b3IgaWVsID0gYXJjaEVsLmZpbmQoaWlk
KTsKICAgIGlmKCBpZWwgIT0gYXJjaEVsLmVuZCgpICkKICAgIHsKCWlmKCBmdWxsICkgaWVsLT5z
ZWNvbmQtPmZ1bGxFcmFzZSgpOwoJZGVsZXRlIGllbC0+c2Vjb25kOwoJYXJjaEVsLmVyYXNlKGll
bCk7CiAgICB9Cn0KClRWQXJjaEVsICpUVkFyY2hpdmF0b3I6OmdldEFyY2hFbCggVFZBcmNoaXZl
ICZhcmNoICkKewogICAgcmV0dXJuIG5ldyBUVkFyY2hFbCggYXJjaCwgKnRoaXMgKTsKfQoKVFRp
cEFyY2hpdmF0b3IgJlRWQXJjaGl2YXRvcjo6b3duZXIoKQp7CiAgICByZXR1cm4gKihUVGlwQXJj
aGl2YXRvciAqKW5vZGVQcmV2KCk7Cn0KCnZvaWQgVFZBcmNoaXZhdG9yOjpsb2FkXyggKQp7CiAg
ICBpZiggIVNZUy0+Y2hrU2VsREIoREIoKSkgKSByZXR1cm47CiAgICBTWVMtPmRiKCkuYXQoKS5k
YXRhR2V0KGZ1bGxEQigpLFNZUy0+YXJjaGl2ZSgpLmF0KCkubm9kZVBhdGgoKSt0YmwoKSwqdGhp
cyk7Cn0KCnZvaWQgVFZBcmNoaXZhdG9yOjpzYXZlXyggKQp7CiAgICBTWVMtPmRiKCkuYXQoKS5k
YXRhU2V0KGZ1bGxEQigpLFNZUy0+YXJjaGl2ZSgpLmF0KCkubm9kZVBhdGgoKSt0YmwoKSwqdGhp
cyk7Cn0KCnZvaWQgVFZBcmNoaXZhdG9yOjpUYXNrKHVuaW9uIHNpZ3ZhbCBvYmopCnsKICAgIFRW
QXJjaGl2YXRvciAqYXJjaCA9IChUVkFyY2hpdmF0b3IqKW9iai5zaXZhbF9wdHI7CiAgICBpZigg
YXJjaC0+cHJjX3N0ICkgIHJldHVybjsKICAgIGFyY2gtPnByY19zdCA9IHRydWU7CgojaWYgT1ND
X0RFQlVHID49IDIKICAgIG1lc3NfZGVidWcoYXJjaC0+bm9kZVBhdGgoKS5jX3N0cigpLF8oIlRp
bWVyJ3MgdGhyZWFkIDwldT4gY2FsbC4gVElEOiAlbGQiKSxwdGhyZWFkX3NlbGYoKSwobG9uZyBp
bnQpc3lzY2FsbCgyMjQpKTsKI2VuZGlmCgogICAgLy8tIEFyY2hpdmluZyAtCiAgICB0cnkKICAg
IHsKCXVuc2lnbmVkIGxvbmcgbG9uZyB0X2NudCA9IFNZUy0+c2hydENudCgpOwoKCVJlc0FsbG9j
IHJlcyhhcmNoLT5hX3JlcyxmYWxzZSk7Cglsb25nIGxvbmcgYmVnLCBlbmQ7Cglmb3IoIG1hcDxz
dHJpbmcsVFZBcmNoRWwqPjo6aXRlcmF0b3IgaWVsID0gYXJjaC0+YXJjaEVsLmJlZ2luKCk7IGll
bCAhPSBhcmNoLT5hcmNoRWwuZW5kKCk7ICsraWVsICkKCSAgICBpZiggaWVsLT5zZWNvbmQtPmFy
Y2hpdmUoKS5zdGFydFN0YXQoKSApCgkgICAgewoJCVRWQXJjaEVsICphcmNoX2VsID0gaWVsLT5z
ZWNvbmQ7CgkJYmVnID0gdm1heChhcmNoX2VsLT5tX2xhc3RfZ2V0LGFyY2hfZWwtPmFyY2hpdmUo
KS5iZWdpbigpKTsKCQllbmQgPSBhcmNoX2VsLT5hcmNoaXZlKCkuZW5kKCk7CgkJaWYoIWJlZyB8
fCAhZW5kIHx8IGJlZyA+IGVuZCApCWNvbnRpbnVlOwoJCS8vLS0gQXZlcmFnaW5nIC0tCgkJbG9u
ZyBsb25nIGFfcGVyID0gKGxvbmcgbG9uZykoMTAwMDAwMC4qYXJjaC0+dmFsUGVyaW9kKCkpOwoJ
CWlmKCBhX3BlciA+IGFyY2hfZWwtPmFyY2hpdmUoKS5wZXJpb2QoKSApCgkJewoJCSAgICBUVmFs
QnVmIGJ1ZihhcmNoX2VsLT5hcmNoaXZlKCkudmFsVHlwZSgpLCgoZW5kLWJlZykvYV9wZXIpKzEs
YV9wZXIsdHJ1ZSx0cnVlKTsKCQkgICAgZm9yKCBsb25nIGxvbmcgY190bSA9IGJlZzsgY190bSA8
PSBlbmQ7KQoJCSAgICB7CgkJCXN3aXRjaChhcmNoX2VsLT5hcmNoaXZlKCkudmFsVHlwZSgpKQoJ
CQl7CgkJCSAgICBjYXNlIFRGbGQ6OkJvb2xlYW46CgkJCSAgICB7CgkJCQljaGFyIGNfdmFsID0g
YXJjaF9lbC0+YXJjaGl2ZSgpLmdldEIoJmNfdG0sdHJ1ZSk7CgkJCQlidWYuc2V0QihjX3ZhbCxj
X3RtKTsKCQkJCWNfdG0rPWFfcGVyOwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJCSAgICBjYXNlIFRG
bGQ6OlN0cmluZzoKCQkJICAgIHsKCQkJCXN0cmluZyBjX3ZhbCA9IGFyY2hfZWwtPmFyY2hpdmUo
KS5nZXRTKCZjX3RtLHRydWUpOwoJCQkJYnVmLnNldFMoY192YWwsY190bSk7CgkJCQljX3RtKz1h
X3BlcjsKCQkJCWJyZWFrOwoJCQkgICAgfQoJCQkgICAgY2FzZSBURmxkOjpJbnRlZ2VyOgoJCQkg
ICAgewoJCQkJaW50IGNfdmFsID0gYXJjaF9lbC0+YXJjaGl2ZSgpLmdldEkoJmNfdG0sdHJ1ZSk7
CgkJCQlpbnQgdmRpZiA9IGNfdG0vYV9wZXIgLSBhcmNoX2VsLT5wcmV2X3RtL2FfcGVyOwoJCQkJ
aWYoICF2ZGlmICkKCQkJCXsKCQkJCSAgICBpbnQgdl9vID0gKihpbnQqKWFyY2hfZWwtPnByZXZf
dmFsLmNfc3RyKCk7CgkJCQkgICAgaWYoIGNfdmFsID09IEVWQUxfSU5UICkgY192YWwgPSB2X287
CgkJCQkgICAgaWYoIGNfdmFsICE9IEVWQUxfSU5UICYmIHZfbyAhPSBFVkFMX0lOVCApCgkJCQkg
ICAgewoJCQkJCWxvbmcgbG9uZyBzX2sgPSBjX3RtLWFfcGVyKihjX3RtL2FfcGVyKTsKCQkJCQls
b25nIGxvbmcgbl9rID0gYXJjaF9lbC0+YXJjaGl2ZSgpLnBlcmlvZCgpOwoJCQkJCWNfdmFsID0g
KChsb25nIGxvbmcpdl9vKnNfaysobG9uZyBsb25nKWNfdmFsKm5faykvKHNfaytuX2spOwoJCQkJ
ICAgIH0KCQkJCSAgICBhcmNoX2VsLT5wcmV2X3ZhbC5hc3NpZ24oKGNoYXIqKSZjX3ZhbCxzaXpl
b2YoaW50KSk7CgkJCQkgICAgYXJjaF9lbC0+cHJldl90bSA9IGNfdG07CgkJCQl9CgkJCQlpZigg
dmRpZiA9PSAxIHx8IGNfdG0rMSA+IGVuZCApCgkJCQkgICAgYnVmLnNldEkoKihpbnQqKWFyY2hf
ZWwtPnByZXZfdmFsLmNfc3RyKCksYXJjaF9lbC0+cHJldl90bSk7CgkJCQlpZiggdmRpZiApCgkJ
CQl7CgkJCQkgICAgYXJjaF9lbC0+cHJldl92YWwuYXNzaWduKChjaGFyKikmY192YWwsc2l6ZW9m
KGludCkpOwoJCQkJICAgIGFyY2hfZWwtPnByZXZfdG0gPSBjX3RtOwoJCQkJfQoJCQkJY190bSsr
OwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJCSAgICBjYXNlIFRGbGQ6OlJlYWw6CgkJCSAgICB7CgkJ
CQlkb3VibGUgY192YWwgPSBhcmNoX2VsLT5hcmNoaXZlKCkuZ2V0UigmY190bSx0cnVlKTsKCQkJ
CWludCB2ZGlmID0gY190bS9hX3BlciAtIGFyY2hfZWwtPnByZXZfdG0vYV9wZXI7CgkJCQlpZigg
IXZkaWYgKQoJCQkJewoJCQkJICAgIGRvdWJsZSB2X28gPSAqKGRvdWJsZSopYXJjaF9lbC0+cHJl
dl92YWwuY19zdHIoKTsKCQkJCSAgICBpZiggY192YWwgPT0gRVZBTF9SRUFMICkgY192YWwgPSB2
X287CgkJCQkgICAgaWYoIGNfdmFsICE9IEVWQUxfUkVBTCAmJiB2X28gIT0gRVZBTF9SRUFMICkK
CQkJCSAgICB7CgkJCQkJbG9uZyBsb25nIHNfayA9IGNfdG0tYV9wZXIqKGNfdG0vYV9wZXIpOwoJ
CQkJCWxvbmcgbG9uZyBuX2sgPSBhcmNoX2VsLT5hcmNoaXZlKCkucGVyaW9kKCk7CgkJCQkJY192
YWwgPSAodl9vKnNfaytjX3ZhbCpuX2spLyhzX2srbl9rKTsKCQkJCSAgICB9CgkJCQkgICAgYXJj
aF9lbC0+cHJldl92YWwuYXNzaWduKChjaGFyKikmY192YWwsc2l6ZW9mKGRvdWJsZSkpOwoJCQkJ
ICAgIGFyY2hfZWwtPnByZXZfdG0gPSBjX3RtOwoJCQkJfQoJCQkJaWYoIHZkaWYgPT0gMSB8fCBj
X3RtKzEgPiBlbmQgKQoJCQkJICAgIGJ1Zi5zZXRSKCooZG91YmxlKilhcmNoX2VsLT5wcmV2X3Zh
bC5jX3N0cigpLGFyY2hfZWwtPnByZXZfdG0pOwoJCQkJaWYoIHZkaWYgKQoJCQkJewoJCQkJICAg
IGFyY2hfZWwtPnByZXZfdmFsLmFzc2lnbigoY2hhciopJmNfdmFsLHNpemVvZihkb3VibGUpKTsK
CQkJCSAgICBhcmNoX2VsLT5wcmV2X3RtID0gY190bTsKCQkJCX0KCQkJCWNfdG0rKzsKCQkJCWJy
ZWFrOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQkgICAgYXJjaF9lbC0+c2V0VmFsKCBidWYsIGJ1
Zi5iZWdpbigpLCBlbmQgKTsKCQl9CgkJZWxzZSBhcmNoX2VsLT5zZXRWYWwoIGFyY2hfZWwtPmFy
Y2hpdmUoKSwgYmVnLCBlbmQgKTsKCQkKCQlhcmNoX2VsLT5tX2xhc3RfZ2V0ID0gZW5kKzE7Cgkg
ICAgfQoKCWFyY2gtPnRtX2NhbGMgPSAxLjBlMyooKGRvdWJsZSkoU1lTLT5zaHJ0Q250KCktdF9j
bnQpKS8oKGRvdWJsZSlTWVMtPnN5c0NsaygpKTsKICAgIH0gY2F0Y2goVEVycm9yIGVycikKICAg
IHsgbWVzc19lcnIoZXJyLmNhdC5jX3N0cigpLCIlcyIsZXJyLm1lc3MuY19zdHIoKSApOyB9Cgog
ICAgYXJjaC0+cHJjX3N0ID0gZmFsc2U7Cn0KCnZvaWQgVFZBcmNoaXZhdG9yOjpzZXRBcmNoUGVy
aW9kKCBpbnQgaXBlciApCnsKICAgIG1fYV9wZXIgPSBpcGVyID8gaXBlciA6IDE7CiAgICBpZigg
c3RhcnRTdGF0KCkgKQogICAgewoJc3RydWN0IGl0aW1lcnNwZWMgaXR2YWw7CglpdHZhbC5pdF9p
bnRlcnZhbC50dl9zZWMgPSBpdHZhbC5pdF92YWx1ZS50dl9zZWMgPSBtX2FfcGVyOwoJaXR2YWwu
aXRfaW50ZXJ2YWwudHZfbnNlYyA9IGl0dmFsLml0X3ZhbHVlLnR2X25zZWMgPSAwOwoJdGltZXJf
c2V0dGltZSh0bUlkLCAwLCAmaXR2YWwsIE5VTEwpOwogICAgfQoKICAgIG1vZGlmKCk7Cn0KCnZv
aWQgVFZBcmNoaXZhdG9yOjpjbnRyQ21kUHJvYyggWE1MTm9kZSAqb3B0ICkKewogICAgLy8tIEdl
dCBwYWdlIGluZm8gLQogICAgaWYoIG9wdC0+bmFtZSgpID09ICJpbmZvIiApCiAgICB7CglUQ250
ck5vZGU6OmNudHJDbWRQcm9jKG9wdCk7CgljdHJNa05vZGUoIm9zY2FkYV9jbnRyIixvcHQsLTEs
Ii8iLF8oIlZhbHVlIGFyY2hpdmF0b3I6ICIpK25hbWUoKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIp
OwoJaWYoY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEsIi9wcm0iLF8oIkFyY2hpdmF0b3IiKSkpCgl7
CgkgICAgaWYoY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEsIi9wcm0vc3QiLF8oIlN0YXRlIikpKQoJ
ICAgIHsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL3N0L3N0IixfKCJSdW5pbmciKSww
NjY0LCJyb290IiwiQXJjaGl2ZSIsMSwidHAiLCJib29sIik7CgkJY3RyTWtOb2RlKCJmbGQiLG9w
dCwtMSwiL3BybS9zdC90YXJjaCIsXygiQXJjaGl2aW5nIHRpbWUgKG1zZWspIiksMDQ0NCwicm9v
dCIsIkFyY2hpdmUiLDEsInRwIiwicmVhbCIpOwoJCWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9w
cm0vc3QvZGIiLF8oIkFyY2hpdmF0b3IgREIiKSwwNjY0LCJyb290Iiwicm9vdCIsNCwidHAiLCJz
dHIiLCJkZXN0Iiwic2VsZWN0Iiwic2VsZWN0IiwiL2RiL2xpc3QiLAoJCSAgICAiaGVscCIsXygi
REIgYWRkcmVzcyBpbiBmb3JtYXQgWzxEQiBtb2R1bGU+LjxEQiBuYW1lPl0uXG5Gb3IgdXNlIG1h
aW4gd29yayBEQiBzZXQgJyouKicuIikpOwoJICAgIH0KCSAgICBpZihjdHJNa05vZGUoImFyZWEi
LG9wdCwtMSwiL3BybS9jZmciLF8oIkNvbmZpZyIpKSkKCSAgICB7CgkJY3RyTWtOb2RlKCJmbGQi
LG9wdCwtMSwiL3BybS9jZmcvaWQiLGNmZygiSUQiKS5mbGQoKS5kZXNjcigpLDA0NDQsInJvb3Qi
LCJBcmNoaXZlIiwxLCJ0cCIsInN0ciIpOwoJCWN0ck1rTm9kZSgiZmxkIixvcHQsLTEsIi9wcm0v
Y2ZnL25tIixjZmcoIk5BTUUiKS5mbGQoKS5kZXNjcigpLDA2NjQsInJvb3QiLCJBcmNoaXZlIiwy
LCJ0cCIsInN0ciIsImxlbiIsIjUwIik7CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3BybS9j
ZmcvZHNjciIsY2ZnKCJERVNDUiIpLmZsZCgpLmRlc2NyKCksMDY2NCwicm9vdCIsIkFyY2hpdmUi
LDMsInRwIiwic3RyIiwiY29scyIsIjUwIiwicm93cyIsIjMiKTsKCQljdHJNa05vZGUoImZsZCIs
b3B0LC0xLCIvcHJtL2NmZy92cGVyIixjZmcoIlZfUEVSIikuZmxkKCkuZGVzY3IoKSwwNjY0LCJy
b290IiwiQXJjaGl2ZSIsMSwidHAiLCJyZWFsIik7CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwi
L3BybS9jZmcvYXBlciIsY2ZnKCJBX1BFUiIpLmZsZCgpLmRlc2NyKCksMDY2NCwicm9vdCIsIkFy
Y2hpdmUiLDEsInRwIiwiZGVjIik7CgkJY3RyTWtOb2RlKCJmbGQiLG9wdCwtMSwiL3BybS9jZmcv
YWRkciIsY2ZnKCJBRERSIikuZmxkKCkuZGVzY3IoKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIsMSwi
dHAiLCJzdHIiKTsKCQljdHJNa05vZGUoImZsZCIsb3B0LC0xLCIvcHJtL2NmZy9zdGFydCIsXygi
VG8gc3RhcnQiKSwwNjY0LCJyb290IiwiQXJjaGl2ZSIsMSwidHAiLCJib29sIik7CgkgICAgfQoJ
fQoJaWYoY3RyTWtOb2RlKCJhcmVhIixvcHQsLTEsIi9hcmNoIixfKCJBcmNoaXZlcyIpKSkKCSAg
ICBpZihjdHJNa05vZGUoInRhYmxlIixvcHQsLTEsIi9hcmNoL2FyY2giLF8oIkFyY2hpdmVzIiks
MDQ0NCwicm9vdCIsIkFyY2hpdmUiKSkKCSAgICB7CgkJY3RyTWtOb2RlKCJsaXN0IixvcHQsLTEs
Ii9hcmNoL2FyY2gvMCIsXygiQXJjaGl2ZSIpLDA0NDQsInJvb3QiLCJBcmNoaXZlIiwxLCJ0cCIs
InN0ciIpOwoJCWN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJjaC9hcmNoLzEiLF8oIlBlcmlv
ZCAocykiKSwwNDQ0LCJyb290IiwiQXJjaGl2ZSIsMSwidHAiLCJyZWFsIik7CgkJY3RyTWtOb2Rl
KCJsaXN0IixvcHQsLTEsIi9hcmNoL2FyY2gvMiIsXygiQnVmZmVyIHNpemUiKSwwNDQ0LCJyb290
IiwiQXJjaGl2ZSIsMSwidHAiLCJkZWMiKTsKCSAgICB9CglyZXR1cm47CiAgICB9CgogICAgLy8t
IFByb2Nlc3MgY29tbWFuZCB0byBwYWdlIC0KICAgIHN0cmluZyBhX3BhdGggPSBvcHQtPmF0dHIo
InBhdGgiKTsKICAgIGlmKCBhX3BhdGggPT0gIi9wcm0vc3Qvc3QiICkKICAgIHsKCWlmKCBjdHJD
aGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1JEKSApCW9wdC0+c2V0
VGV4dCggc3RhcnRTdGF0KCkgPyAiMSIgOiAiMCIgKTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0
IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCWF0b2kob3B0LT50ZXh0KCkuY19zdHIo
KSkgPyBzdGFydCgpIDogc3RvcCgpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJt
L3N0L3RhcmNoIiAmJiBjdHJDaGtOb2RlKG9wdCkgKQkJb3B0LT5zZXRUZXh0KFRTWVM6OnJlYWwy
c3RyKHRtX2NhbGMsNikpOwogICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL3N0L2RiIiApCiAg
ICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9S
RCkgKQlvcHQtPnNldFRleHQoIERCKCkgKTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0IiwwNjY0
LCJyb290IiwiQXJjaGl2ZSIsU0VRX1dSKSApCXNldERCKCBvcHQtPnRleHQoKSApOwogICAgfQog
ICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL2NmZy9pZCIgJiYgY3RyQ2hrTm9kZShvcHQpICkJ
CW9wdC0+c2V0VGV4dChpZCgpKTsKICAgIGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvbm0i
ICkKICAgIHsKCWlmKCBjdHJDaGtOb2RlKG9wdCwiZ2V0IiwwNjY0LCJyb290IiwiQXJjaGl2ZSIs
U0VRX1JEKSApCW9wdC0+c2V0VGV4dCggbmFtZSgpICk7CglpZiggY3RyQ2hrTm9kZShvcHQsInNl
dCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9XUikgKQlzZXROYW1lKCBvcHQtPnRleHQoKSAp
OwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL2NmZy9kc2NyIiApCiAgICB7Cglp
ZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlv
cHQtPnNldFRleHQoIGRzY3IoKSApOwoJaWYoIGN0ckNoa05vZGUob3B0LCJzZXQiLDA2NjQsInJv
b3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0RHNjciggb3B0LT50ZXh0KCkgKTsKICAgIH0KICAg
IGVsc2UgaWYoIGFfcGF0aCA9PSAiL3BybS9jZmcvYWRkciIgKQogICAgewoJaWYoIGN0ckNoa05v
ZGUob3B0LCJnZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfUkQpICkJb3B0LT5zZXRUZXh0
KCBhZGRyKCkgKTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0IiwwNjY0LCJyb290IiwiQXJjaGl2
ZSIsU0VRX1dSKSApCXNldEFkZHIoIG9wdC0+dGV4dCgpICk7CiAgICB9CiAgICBlbHNlIGlmKCBh
X3BhdGggPT0gIi9wcm0vY2ZnL3N0YXJ0IiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdl
dCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNldFRleHQoIHRvU3RhcnQo
KSA/ICIxIiA6ICIwIiApOwoJaWYoIGN0ckNoa05vZGUob3B0LCJzZXQiLDA2NjQsInJvb3QiLCJB
cmNoaXZlIixTRVFfV1IpICkJc2V0VG9TdGFydCggYXRvaShvcHQtPnRleHQoKS5jX3N0cigpKSAp
OwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09ICIvcHJtL2NmZy92cGVyIiApCiAgICB7Cglp
ZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwicm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlv
cHQtPnNldFRleHQoVFNZUzo6cmVhbDJzdHIodmFsUGVyaW9kKCksNikpOwoJaWYoIGN0ckNoa05v
ZGUob3B0LCJzZXQiLDA2NjQsInJvb3QiLCJBcmNoaXZlIixTRVFfV1IpICkJc2V0VmFsUGVyaW9k
KGF0b2Yob3B0LT50ZXh0KCkuY19zdHIoKSkpOwogICAgfQogICAgZWxzZSBpZiggYV9wYXRoID09
ICIvcHJtL2NmZy9hcGVyIiApCiAgICB7CglpZiggY3RyQ2hrTm9kZShvcHQsImdldCIsMDY2NCwi
cm9vdCIsIkFyY2hpdmUiLFNFUV9SRCkgKQlvcHQtPnNldFRleHQoVFNZUzo6aW50MnN0cihhcmNo
UGVyaW9kKCkpKTsKCWlmKCBjdHJDaGtOb2RlKG9wdCwic2V0IiwwNjY0LCJyb290IiwiQXJjaGl2
ZSIsU0VRX1dSKSApCXNldEFyY2hQZXJpb2QoYXRvaShvcHQtPnRleHQoKS5jX3N0cigpKSk7CiAg
ICB9CiAgICBlbHNlIGlmKCBhX3BhdGggPT0gIi9hcmNoL2FyY2giICYmIGN0ckNoa05vZGUob3B0
KSApCiAgICB7CgkvLy0tIEZpbGwgQXJjaGl2ZXMgdGFibGUgLS0KCVhNTE5vZGUgKm5fYXJjaCA9
IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJjaC9hcmNoLzAiLCIiKTsKCVhNTE5vZGUgKm5f
cGVyICA9IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJjaC9hcmNoLzEiLCIiKTsKCVhNTE5v
ZGUgKm5fc2l6ZSA9IGN0ck1rTm9kZSgibGlzdCIsb3B0LC0xLCIvYXJjaC9hcmNoLzIiLCIiKTsK
CglSZXNBbGxvYyByZXMoYV9yZXMsZmFsc2UpOwoJZm9yKCBtYXA8c3RyaW5nLFRWQXJjaEVsKj46
Oml0ZXJhdG9yIGllbCA9IGFyY2hFbC5iZWdpbigpOyBpZWwgIT0gYXJjaEVsLmVuZCgpOyArK2ll
bCApCgl7CgkgICAgaWYobl9hcmNoKQluX2FyY2gtPmNoaWxkQWRkKCJlbCIpLT5zZXRUZXh0KGll
bC0+c2Vjb25kLT5hcmNoaXZlKCkuaWQoKSk7CgkgICAgaWYobl9wZXIpCW5fcGVyLT5jaGlsZEFk
ZCgiZWwiKS0+c2V0VGV4dChUU1lTOjpyZWFsMnN0cigoZG91YmxlKWllbC0+c2Vjb25kLT5hcmNo
aXZlKCkucGVyaW9kKCkvMTAwMDAwMC4sNikpOwoJICAgIGlmKG5fc2l6ZSkJbl9zaXplLT5jaGls
ZEFkZCgiZWwiKS0+c2V0VGV4dChUU1lTOjppbnQyc3RyKGllbC0+c2Vjb25kLT5hcmNoaXZlKCku
c2l6ZSgpKSk7Cgl9CiAgICB9CiAgICBlbHNlIFRDbnRyTm9kZTo6Y250ckNtZFByb2Mob3B0KTsK
fQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8v
KiBUVkFyY2hFbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgovLyoqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVFZBcmNoRWw6OlRW
QXJjaEVsKCBUVkFyY2hpdmUgJmlhcmNoaXZlLCBUVkFyY2hpdmF0b3IgJmlhcmNoaXZhdG9yICkg
OgogICAgbV9hY2hpdmUoaWFyY2hpdmUpLCBtX2FyY2hpdmF0b3IoaWFyY2hpdmF0b3IpLCBtX2xh
c3RfZ2V0KDApLCBwcmV2X3RtKDApCnsKCn0KClRWQXJjaEVsOjp+VFZBcmNoRWwoKQp7Cgp9CgpU
VkFyY2hpdmUgJlRWQXJjaEVsOjphcmNoaXZlKCkKewogICAgcmV0dXJuIG1fYWNoaXZlOwp9CgpU
VkFyY2hpdmF0b3IgJlRWQXJjaEVsOjphcmNoaXZhdG9yKCkKewogICAgcmV0dXJuIG1fYXJjaGl2
YXRvcjsKfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>