v20210126, vacancy details, basic track data, dlgs
authorKilian Saffran <ksaffran@dks.lu>
Tue, 26 Jan 2021 19:00:15 +0000 (20:00 +0100)
committerKilian Saffran <ksaffran@dks.lu>
Tue, 26 Jan 2021 19:00:15 +0000 (20:00 +0100)
38 files changed:
app/db.cgi
app/lib/POT/Period.pm
app/lib/POT/Staff.pm
app/lib/POT/TimeTracker.pm
app/lib/dksconfig.pm
app/lib/dksdb.pm
app/static/css/theme.css
app/static/js/app.js
app/static/js/app.min.js [deleted file]
app/static/js/dataform.js
app/static/vendors/suneditor/css/suneditor.min.css [new file with mode: 0644]
app/static/vendors/suneditor/suneditor.min.js [new file with mode: 0644]
app/tmpl/block/dlgstaffperioddays.tt
app/tmpl/block/dlgstaffpointages.tt
app/tmpl/index.tt
app/tmpl/lang/de.tt
app/tmpl/lang/fr.tt
app/tmpl/module/admin/companies.js
app/tmpl/module/admin/sectors.js
app/tmpl/module/admin/users.js
app/tmpl/module/admin/worktimes.js
app/tmpl/module/company/company.js
app/tmpl/module/company/pnl_basedata.tt
app/tmpl/module/periods.tt
app/tmpl/module/periods/reportperiod.js
app/tmpl/module/periods/staffperiodweeks.js
app/tmpl/module/periods/tlb_staffperiodweeks.tt
app/tmpl/module/staff.tt
app/tmpl/module/staff/dlg_addvacancyyears.tt [new file with mode: 0644]
app/tmpl/module/staff/pnl_basedata.tt
app/tmpl/module/staff/staff.js
app/tmpl/module/staff/staffcontract.js
app/tmpl/module/staff/staffperiods.js
app/tmpl/module/staff/staffvacancy.js [new file with mode: 0644]
app/tmpl/module/workplans/dlg_workplanday.tt
app/tmpl/module/workplans/workplans.js
ipad/Import.log [deleted file]
ipad/POT.fmp12 [deleted file]

index e24935f..950c69b 100644 (file)
@@ -142,7 +142,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       }elsif ($p->{get} eq 'recuperationtypes'){
         $hres = $wk->getRecuperationTypes($schema);
       }
-    } elsif ($p->{get} =~ /staffcontractdates$|staffcontract$|stafflist$|staff$/){
+    } elsif ($p->{get} =~ /staffcontractdates$|staffcontract$|stafflist$|staff$|getStaffVacancy$|getStaffVacancyYears$/){
       my $st = POT::Staff->new({db => $db});
       if ($p->{get} eq 'staffcontractdates'){
         $hres = $st->getStaffContractDates($schema,$db->securetext($p->{id_staff}));
@@ -150,8 +150,11 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
         $hres = $st->getStaffContract($schema,$db->securetext($p->{id}));
       } elsif ($p->{get} eq 'staff'){
         $hres = $st->getStaff($schema,$db->securetext($p->{id}));
-      } elsif ($p->{get} eq 'stafflist'){
-        #print STDERR Dumper($sess)."\n";
+      } elsif($p->{get} eq 'getStaffVacancyYears'){
+        $hres = $st->getStaffVacancyYears($schema,$db->securetext($p->{id}));
+      } elsif($p->{get} eq 'getStaffVacancy'){
+        $hres = $st->getStaffVacancy($schema,$db->securetext($p->{id}));
+      }elsif ($p->{get} eq 'stafflist'){
         if ($sess->{usergroup} eq "teamleader"){
           $hres = $st->getStaffList($schema,$sess->{staffgroups});
         } else {
@@ -160,12 +163,14 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
         
       } 
 
-    } elsif ($p->{get} =~ /gettrackday$|emptytrackdataset$/){
+    } elsif ($p->{get} =~ /gettrackday$|emptytrackdataset$|getTimeTrackerList$/){
       my $st = POT::TimeTracker->new({db => $db});
       if ($p->{get} eq 'gettrackday'){
         $hres = $st->getTrackDay($schema,$db->securetext($p->{id_staff}),$db->securetext($p->{daydate}));
       } elsif ($p->{get} eq 'emptytrackdataset'){
         $hres = $st->getEmptyTrackDataSet($schema,$db->securetext($p->{id_staff}),$db->securetext($p->{daydate}));
+      } elsif ($p->{get} eq 'getTimeTrackerList'){
+        $hres = $st->getTimeTrackerList($schema);
       }
     } elsif ($p->{get} =~ /userschemaaccess$|termsstatus$|userlist$|user$|usergrouplist$/){
       my $us = POT::User->new({db => $db});
index dbb0c8f..abd8dd4 100644 (file)
@@ -82,9 +82,10 @@ sub getStaffPeriodSplitted(){
   max(daydate) as enddate,
   to_char(sum(pd.workhours), 'HH24:MI'::text) as workhours,
   to_char(sum(pd.dayhours), 'HH24:MI'::text) as totalhours,
-  to_char(sum(coalesce(pd.vacancyhours,'00:00:00'::time)), 'HH24:MI'::text) as vacancyhours,
-  to_char(sum(case when pd.id_vacancytype = 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end), 'HH24:MI'::text) as vacancyill,
-  to_char(sum(case when pd.id_vacancytype != 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end), 'HH24:MI'::text) as vacancynormal,
+  to_char(sum(coalesce(pd.vacancyhours,'00:00:00'::time)), 'HH24:MI'::text) as vacancynormal,
+  to_char(sum(coalesce(pd.vacillhours,'00:00:00'::time)), 'HH24:MI'::text) as vacancyill,
+  to_char(sum(coalesce(pd.vacextrahours,'00:00:00'::time)), 'HH24:MI'::text) as vacancyextra,
+  to_char(sum(coalesce(pd.partunemplhours,'00:00:00'::time)), 'HH24:MI'::text) as partunemplhours,
   to_char(sum(coalesce(pd.recuperationhours,'00:00:00'::time)), 'HH24:MI'::text) as recuperationhours,sgr.groupname
   from ".$schema.".staffreportperioddays pd
   join (
@@ -122,9 +123,11 @@ sub getStaffPeriods(){
   my $sql = "SELECT st.prename, st.surname,
     to_char(srp.contracthours, 'HH24:MI'::text) AS contracthours,
     to_char(srp.workhours, 'HH24:MI'::text) AS workhours,
-    to_char(srp.vacancyhours, 'HH24:MI'::text) AS vacancyhours,
+    --to_char(srp.vacancyhours, 'HH24:MI'::text) AS vacancyhours,
     to_char(srp.vacancyill, 'HH24:MI'::text) AS vacancyill,
     to_char(srp.vacancynormal, 'HH24:MI'::text) AS vacancynormal,
+    to_char(srp.vacancyextra, 'HH24:MI'::text) AS vacancyextra,
+    to_char(srp.partunemplhours, 'HH24:MI'::text) AS partunemplhours,
     to_char(srp.recuperationhours, 'HH24:MI'::text) AS recuperationhours,
     case when position('-' in to_char(srp.hoursdiff, 'HH24:MI')) > 0 then '-' || replace(to_char(srp.hoursdiff, 'HH24:MI'),'-','') else to_char(srp.hoursdiff, 'HH24:MI') end  as hoursdiff,
     to_char(srp.totalhours, 'HH24:MI'::text) AS totalhours,
@@ -168,7 +171,11 @@ sub getPeriodWeekSums(){
   $date_end=$pdate->{enddate};
   my $sql = "select ws.weekstart,ws.weekend,ws.calweek,ws.calyear, ws.id_staff
   ,to_char(ws.workhours::interval,'HH24:MI') as workhours
-  ,to_char(ws.vacancyhours,'HH24:MI') as vacancyhours
+  ,to_char(ws.vacancyhours+ws.vacillhours+ws.vacextrahours,'HH24:MI') as vacancyhours
+  ,to_char(ws.vacancyhours,'HH24:MI') as vacancynormal,
+  ,to_char(ws.vacillhours,'HH24:MI') as vacancyill,
+  ,to_char(ws.vacextrahours,'HH24:MI') as vacancyextra,
+  ,to_char(ws.partunemplhours,'HH24:MI') as partunemplhours
   ,to_char(ws.recuperationhours,'HH24:MI') as recuperationhours
   ,to_char(ws.totalhours,'HH24:MI') as totalhours
   ,cd.contractworkdays
@@ -191,9 +198,12 @@ sub getPeriodWeekSums(){
   SELECT weekstart,weekend,calweek,calyear, id_staff,
                     sum(CASE WHEN srpd.workhours IS NULL THEN '00:00:00'::interval ELSE srpd.workhours::interval END) AS workhours,
                     sum(CASE WHEN srpd.vacancyhours IS NULL THEN '00:00:00'::interval ELSE srpd.vacancyhours::interval END) AS vacancyhours,
+                    sum(CASE WHEN srpd.vacillhours IS NULL THEN '00:00:00'::interval ELSE srpd.vacillhours::interval END) AS vacillhours,
+                    sum(CASE WHEN srpd.vacextrahours IS NULL THEN '00:00:00'::interval ELSE srpd.vacextrahours::interval END) AS vacextrahours,
                     sum(CASE WHEN srpd.recuperationhours IS NULL THEN '00:00:00'::interval ELSE srpd.recuperationhours::interval END) AS recuperationhours,
+                    sum(CASE WHEN srpd.partunemplhours IS NULL THEN '00:00:00'::interval ELSE srpd.partunemplhours::interval END) AS partunemplhours,
                     sum(CASE WHEN srpd.dayhours IS NULL THEN '00:00:00'::interval ELSE srpd.dayhours::interval END) AS totalhours,
-                    sum(CASE WHEN srpd.workhours > '00:00:00'::time without time zone OR srpd.recuperationhours > '00:00:00'::time without time zone OR srpd.vacancyhours > '00:00:00'::time without time zone THEN 1 ELSE 0 END) AS workdays,
+                    sum(CASE WHEN srpd.workhours > '00:00:00'::time without time zone OR srpd.recuperationhours > '00:00:00'::time without time zone OR srpd.vacancyhours > '00:00:00'::time without time zone OR srpd.vacillhours > '00:00:00'::time without time zone OR srpd.vacextrahours > '00:00:00'::time without time zone OR srpd.partunemplhours > '00:00:00'::time without time zone THEN 1 ELSE 0 END) AS workdays,
                     sum( CASE WHEN srpd.contracthours IS NULL THEN '00:00:00'::interval ELSE srpd.contracthours::interval END) AS contracthours
                    FROM (select *,date(date_trunc('week', daydate)) AS weekstart,
                     date(date_trunc('week', daydate) + interval '6 days') AS weekend,
@@ -238,15 +248,23 @@ sub getPeriodDays(){
   my $id_staff = shift;
   my $date_start = shift;
   my $date_end = shift;
-  my $sql = "SELECT pd.id,pd.id_staff,pd.id_reportperiod,pd.daydate,pd.payedpause,pd.id_vacancytype,pd.daytype,pd.id_recuperationtype,
+  my $sql = "SELECT pd.id,pd.id_staff,pd.id_reportperiod,pd.daydate,pd.payedpause,pd.daytype,
+            vacancycomment,vacillcomment,vacextracomment,recupcomment,partunempcomment,
             date(date_trunc('week',pd.daydate)) as weekstart,
             to_char(pd.timestart1::interval, 'HH24:MI') AS timestart1,
             to_char(pd.timeend1::interval, 'HH24:MI') AS timeend1,
             to_char(pd.timestart2::interval, 'HH24:MI') AS timestart2,
             to_char(pd.timeend2::interval, 'HH24:MI') AS timeend2,
             to_char(pd.timepause::interval, 'HH24:MI') AS timepause,
+             coalesce('<div class=\"dspvacancynormal\">' || to_char(CASE WHEN pd.vacancyhours::interval = '00:00:00'::interval THEN null ELSE pd.vacancyhours END::interval, 'HH24:MI') || '</div>','')  ||
+            coalesce('<div class=\"dspvacancyill\">' || to_char(CASE WHEN pd.vacillhours::interval = '00:00:00'::interval THEN null else pd.vacillhours END::interval, 'HH24:MI') || '</div>','') || 
+            coalesce('<div class=\"dspvacancyextra\">' || to_char(CASE WHEN pd.vacextrahours::interval = '00:00:00'::interval THEN null ELSE pd.vacextrahours END::interval, 'HH24:MI') || '</div>','') AS dspvacancyhours,
             to_char(CASE WHEN pd.vacancyhours::interval = '00:00:00'::interval THEN NULL ELSE pd.vacancyhours END::interval, 'HH24:MI') AS vacancyhours,
+            to_char(CASE WHEN pd.vacillhours::interval = '00:00:00'::interval THEN NULL ELSE pd.vacillhours END::interval, 'HH24:MI') AS vacillhours,
+            to_char(CASE WHEN pd.vacextrahours::interval = '00:00:00'::interval THEN NULL ELSE pd.vacextrahours END::interval, 'HH24:MI') AS vacextrahours,
+            to_char(CASE WHEN pd.partunemplhours::interval = '00:00:00'::interval THEN NULL ELSE pd.partunemplhours END::interval, 'HH24:MI') AS partunemplhours,
             to_char(pd.contracthours::interval, 'HH24:MI') AS contracthours,
+            
             to_char(CASE WHEN pd.workhours::interval = '00:00:00'::interval THEN NULL ELSE pd.workhours END::interval, 'HH24:MI') AS workhours,
             to_char(CASE WHEN pd.dayhours::interval = '00:00:00'::interval THEN NULL ELSE pd.dayhours END::interval, 'HH24:MI') AS dayhours,
             to_char(case WHEN pd.recuperationhours::interval = '00:00:00'::interval THEN NULL ELSE pd.recuperationhours END::interval, 'HH24:MI') AS recuperationhours,
@@ -376,15 +394,20 @@ sub updatePeriodDaySums(){
   }
   #case when payedpause is null then  (preds.dt1+preds.dt2) else  (preds.dt1+preds.dt2)-(preds.pdt1+preds.pdt2) end as worktime,
   my $sql = "update ".$schema.".staffreportperioddays spds set
-  workhours=ds.worktime, timepause=case when ds.timepause::interval > '00:00:00' then ds.timepause else null end, dayhours=(ds.worktime + ds.vachours + ds.recup)::interval, interruptionhours = ds.interruption , contracthours=case when ds.worktime + ds.vachours + ds.recup > '00:00:00'::interval then ds.wdcontracthours else null end 
+  workhours=ds.worktime, timepause=case when ds.timepause::interval > '00:00:00' then ds.timepause else null end, 
+  dayhours=(ds.worktime::interval + ds.vachours::interval  + ds.vacillhours::interval  + ds.vacextrahours::interval  + ds.partunemplhours::interval  + ds.recup::interval )::interval, interruptionhours = ds.interruption , 
+  contracthours=case when ds.worktime::interval + ds.vachours::interval  + ds.vacillhours::interval  + ds.vacextrahours::interval  + ds.partunemplhours::interval  + ds.recup::interval > '00:00:00'::interval then ds.wdcontracthours else null end 
   from (
     select preds.id,case when preds.recuperationhours is null then '00:00:00'::interval else preds.recuperationhours::interval end as recup,
     case when preds.vacancyhours is null then '00:00:00'::time else preds.vacancyhours end as vachours,
+    case when preds.vacillhours is null then '00:00:00'::time else preds.vacillhours end as vacillhours,
+    case when preds.vacextrahours is null then '00:00:00'::time else preds.vacextrahours end as vacextrahours,
+    case when preds.partunemplhours is null then '00:00:00'::time else preds.partunemplhours end as partunemplhours,
     preds.interruption,
     (preds.dt1+preds.dt2)-(case when preds.payedpause is null then preds.pdt1+preds.pdt2 else '00:00:00'::interval end)  as worktime,
   (preds.pdt1+preds.pdt2) as timepause,
   wdcontracthours
-       from ( select id, recuperationhours,vacancyhours,payedpause,
+       from ( select id, recuperationhours,vacancyhours,vacillhours,vacextrahours,partunemplhours,payedpause,
                case when timestart1 is not null and timeend1 is not null then case when timeend1 < timestart1 then  '24:00:00'::interval + timeend1 - timestart1 else  timeend1 - timestart1 end else  '00:00:00'::interval end as dt1,
                case when timestart2 is not null and timeend2 is not null then case when timeend2 < timestart2 then  '24:00:00'::interval + timeend2 - timestart2 else  timeend2 - timestart2 end  else  '00:00:00'::interval end as dt2,
                case when pausestart1 is not null and pauseend1 is not null then case when pauseend1 < pausestart1 then  '24:00:00'::interval + pauseend1 - pausestart1 else  pauseend1 - pausestart1 end else '00:00:00'::interval end as pdt1,
@@ -479,9 +502,10 @@ sum(CASE WHEN srpd.dayhours IS NULL THEN '00:00:00'::interval ELSE srpd.dayhours
   $sql = "update ".$schema.".staffreportperiod rpd set
   --contracthours=csp.contracthours,
   workhours=csp.workhours,
-  vacancyhours=csp.vacancyhours,
-  vacancyill=csp.vacancyill,
+  vacancyill=csp.vacillhours,
   vacancynormal=csp.vacancynormal,
+  vacancyextra=csp.vacextrahours,
+  partunemplhours=csp.partunemplhours,
   totalhours=csp.totalhours,
   recuperationhours=csp.recuperationhours,";
   #if ((defined($statussuncount) && $staffprdprev->{prevperiod} ne '')){
@@ -493,13 +517,14 @@ sum(CASE WHEN srpd.dayhours IS NULL THEN '00:00:00'::interval ELSE srpd.dayhours
   $sql .= "avgtotalweekhours=".(($whavg->{avgtotalhours} eq "")?'null':"'".$whavg->{avgtotalhours}."'::interval").",";
   $sql .= "hoursdiff=csp.diffhours
   FROM (
-  select contracthours,workhours,vacancyhours,totalhours,recuperationhours, totalhours-contracthours-transferedhours as diffhours,id,vacancyill,vacancynormal from (
+  select contracthours,workhours,totalhours,recuperationhours, totalhours-contracthours-transferedhours as diffhours,id,vacillhours,vacancynormal,vacextrahours,partunemplhours from (
   select dp.id,
   sum(pd.workhours) as workhours,
   sum(pd.dayhours) as totalhours,
-  sum(coalesce(pd.vacancyhours,'00:00:00'::time)) as vacancyhours,
-  sum(case when pd.id_vacancytype = 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end) as vacancyill,
-  sum(case when pd.id_vacancytype != 'ill' and pd.vacancyhours > '00:00:00'::time then coalesce(pd.vacancyhours,'00:00:00'::time) else '00:00:00'::time end) as vacancynormal,
+  sum(coalesce(pd.vacancyhours,'00:00:00'::time)) as vacancynormal,
+  sum(coalesce(pd.vacillhours,'00:00:00'::time)) as vacillhours,
+  sum(coalesce(pd.vacextrahours,'00:00:00'::time)) as vacextrahours,
+  sum(coalesce(pd.partunemplhours,'00:00:00'::time)) as partunemplhours,
   sum(coalesce(pd.recuperationhours,'00:00:00'::time)) as recuperationhours, 
   coalesce(dp.contracthours,'00:00:00'::interval) as contracthours,
   coalesce(dp.payedhours0,'00:00:00'::interval) as payedhours0,
@@ -513,11 +538,17 @@ sum(CASE WHEN srpd.dayhours IS NULL THEN '00:00:00'::interval ELSE srpd.dayhours
   #print STDERR "\n==STAFF CONTRACT===\n".$sql."\n=======\n"; 
   $self->{db}->exec($sql);
   #TODO: syncStaffToPointeuse
-  return 1;
+  my $allreps = $self->getStaffPeriods($schema,$id_staff,$id_period,undef,"0");
+  my $retdata = ();
+  foreach my $s (keys(%{$allreps})){
+    if ($allreps->{$s}->{id_reportperiod} eq $id_period){
+      $retdata->{0} = $allreps->{$s};
+      last; 
+    }
+  }
+  return $retdata;
 }
 
-
-
 # sub setPeriodPayedhours(){
 #   my $self = shift;
 #   my $schema = shift;
@@ -617,8 +648,11 @@ sub clonePeriodDay(){
                                                                                                           pausestart2=".$self->{db}->value($copy->{pausestart2}).",
                                                                                                           pauseend2=".$self->{db}->value($copy->{pauseend2}).", 
                                                                                                           vacancyhours=".$self->{db}->value($copy->{vacancyhours}).",
-                                                                                                          id_vacancytype=".$self->{db}->value($copy->{id_vacancytype}).", 
-                                                                                                          id_recuperationtype=".$self->{db}->value($copy->{id_recuperationtype}).", 
+                               vacillhours=".$self->{db}->value($copy->{vacillhours}).",
+                               vacextrahours=".$self->{db}->value($copy->{vacextrahours}).",
+                               partunemplhours=".$self->{db}->value($copy->{partunemplhours}).", 
+                                                                                                          --id_vacancytype=".$self->{db}->value($copy->{id_vacancytype}).", 
+                                                                                                          --id_recuperationtype=".$self->{db}->value($copy->{id_recuperationtype}).", 
                                                                                                           recuperationhours=".$self->{db}->value($copy->{recuperationhours})." 
                where id in ('".join("','",@{$pasteids})."');";
     $sql =~ s/\s+/ /g;
@@ -646,9 +680,12 @@ sub cleanPeriodDays(){
                                                                                                pausestart2 = null, 
                                                                                                pauseend2 = null,
                                                                                                timepause = null, 
-                                                                                               vacancyhours = null, 
-                                                                                               id_vacancytype = null, 
-                                                                                               id_recuperationtype = null, 
+                                                                                               vacancyhours = null,
+                          vacillhours = null,
+                          vacextrahours = null,
+                          partunemplhours = null,  
+                                                                                               --id_vacancytype = null, 
+                                                                                               --id_recuperationtype = null, 
                                                                                                recuperationhours = null,
                                                                                                workhours=null, 
                                                                                                dayhours=null 
@@ -681,7 +718,7 @@ sub replaceDayWorkplan(){
     $self->{db}->exec("update ".$schema.".staffreportperioddays set timestart1=".$self->{db}->value($copy->{$c}->{start1}).",timeend1=".$self->{db}->value($copy->{$c}->{end1}).",timestart2=".$self->{db}->value($copy->{$c}->{start2}).",timeend2=".$self->{db}->value($copy->{$c}->{end2}).", timepause=".$self->{db}->value($copy->{$c}->{pause}).",
                pausestart1=".$self->{db}->value($copy->{$c}->{pausestart1}).",pauseend1=".$self->{db}->value($copy->{$c}->{pauseend1}).",pausestart2=".$self->{db}->value($copy->{$c}->{pausestart2}).",pauseend2=".$self->{db}->value($copy->{$c}->{pauseend2})." where id in ('".join("','",@{$replaceids})."') and date_part('isodow',daydate)::INT4='".$copy->{$c}->{weekday}."';");
                if ($keepvac ne "1"){
-      $self->{db}->exec("update ".$schema.".staffreportperioddays set vacancyhours=null,id_vacancytype=null
+      $self->{db}->exec("update ".$schema.".staffreportperioddays set vacancyhours=null,vacillhours=null,vacextrahours=null
                                where id in ('".join("','",@{$replaceids})."') and date_part('isodow',daydate)::INT4='".$copy->{$c}->{weekday}."';");
     }
     if ($keeprec ne "1"){
index 356dc95..fa1aab4 100644 (file)
@@ -149,9 +149,14 @@ left join (
       my $usql = "update ".$schema.".staffreportperiod set maxdays=".(($checkhours->{maxdays} ne "")?$checkhours->{maxdays}:'null').",contracthours=".(($checkhours->{itmcontracthours} ne "")?"'".$checkhours->{itmcontracthours}."'":'null')." where id_staff='".$id_staff."' and id_reportperiod='".$perioddata->{$pp}->{id}."';" ;
       $self->{db}->exec($usql);
       $period->updateStaffPeriod($schema,$perioddata->{$pp}->{id},$id_staff);
+      
     }
     
   }
+  my $ysql ="insert into ".$schema.".staffvacancyyear (id_staff,vacyear)
+  select id_staff,to_char(daydate,'YYYY')::int4 as vyear from ".$schema.".staffreportperioddays where id_staff='".$id_staff."' group by id_staff,vyear order by id_staff,vyear
+  on conflict on constraint staffvacancyyear_id_staff_vacyear_key do nothing;";
+  $self->{db}->exec($ysql);
   # print STDERR "END Staff::setStaffContractDays()\n";
 }
 
@@ -195,4 +200,25 @@ sub getStaff(){
   return $self->{db}->query($sql);
 }
 
+sub getStaffVacancyYears(){
+  my $self = shift;
+  my $schema = shift;
+  my $id_staff = shift;
+  my $sql = "select id,id_staff,vacyear,to_char(vachours,'HH24:MI') as vachours from ".$schema.".staffvacancyyear where id_staff='".$id_staff."' order by vacyear;";
+  return $self->{db}->querysorted($sql);
+}
+
+sub getStaffVacancy(){
+  my $self = shift;
+  my $schema = shift;
+  my $id_staff = shift;
+  my $sql = "select to_char(daydate,'YYYY') as vacyear,daydate,
+  to_char(vacancyhours::interval,'HH24:MI') as vacancyhours,
+  to_char(vacillhours::interval,'HH24:MI') as vacillhours,
+  to_char(vacextrahours::interval,'HH24:MI') as vacextrahours, 
+  coalesce ('<div>' || vacancycomment || '</div>','') || coalesce('<div>' ||  vacillcomment|| '</div>','') || coalesce('<div>' || vacextracomment|| '</div>','') as description 
+  from ".$schema.".staffreportperioddays where (vacancyhours is not null or vacillhours is not null or vacextrahours is not null) and id_staff='".$id_staff."' order by daydate;";
+  return $self->{db}->querysorted($sql);
+}
+
 1;
\ No newline at end of file
index ea8ea08..271acef 100644 (file)
@@ -66,8 +66,19 @@ sub getTimeTrackData(){
 
 }
 
-sub ImportTimeTrackExcel(){
+sub ImportTimeTrackDSKExcel(){
   my $self = shift;
 }
 
+sub ImportTimeTrackProSysPDF(){
+  my $self = shift;
+}
+
+sub getTimeTrackerList(){
+  my $self = shift;
+  my $schema = shift;
+  my $sql = "select id,trackername from ".$schema.".timetrackerconfig order by trackername";
+  return $self->{db}->querysorted($sql);
+}
+
 1;
\ No newline at end of file
index bc0e4a4..2086bf9 100644 (file)
@@ -11,8 +11,8 @@ our @EXPORT_OK = qw($sitecfg);
 our $sitecfg ={
   cookiename => 'potlu',
   dbtype => 'PgPP',
-  #dsn => 'DBI:PgPP:dbname=potlu2_db;host=localhost',
-  dsn => 'DBI:PgPP:dbname=potlu2_db;host=sql12.your-server.de',
+  dsn => 'DBI:PgPP:dbname=potlu2_db;host=localhost',
+  #dsn => 'DBI:PgPP:dbname=potlu2_db;host=sql12.your-server.de',
   dbuser => 'potlu2_user',
   dbpassword => 'dMY8xGB6cBLzrDGE',
   page => 'index.tt',
index 3ca21b2..0d40d53 100644 (file)
@@ -20,7 +20,7 @@ sub new {
     my $class = shift;
     my $p = shift;
     my $self = bless {}, $class;
-    $self->{debug} = 0;
+    $self->{debug} = 1;
     $self->{dbh} = DBI->connect($p->{dsn},$p->{dbuser},$p->{dbpassword},{PrintError=>1,RaiseError=>1,AutoCommit=>1})  or return "query Connection Error!".$!;
     return $self;
 }
index e999b13..2a532f8 100644 (file)
@@ -37,7 +37,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
 .bordered tr,.table-all tr{border-bottom:1px solid #ddd}.striped tbody tr:nth-child(even){background-color:#f1f1f1}
 .table-all tr:nth-child(odd){background-color:#fff}.table-all tr:nth-child(even){background-color:#f1f1f1}
 .hoverable tbody tr:hover,.ul.hoverable li:hover{background-color:#ccc}.centered tr th,.centered tr td{text-align:center}
-.table td,.table th,.table-all td,.table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
+.table td,.table th,.table-all td,.table-all th{padding:3px 3px;display:table-cell;text-align:left;vertical-align:top}
 .table th:first-child,.table td:first-child,.table-all th:first-child,.table-all td:first-child{padding-left:16px}
 .btn,.button{border:none;display:inline-block;padding:4px 8px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
 .btn:hover{box-shadow:0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
@@ -70,7 +70,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
 .bar-block .bar-item{width:100%;display:block;padding:4px 8px;text-align:left;border:none;white-space:normal;float:none;outline:0}
 .bar-block.center .bar-item{text-align:center}.block{display:block;width:100%}
 .responsive{display:block;overflow-x:auto}
-.container:after,.container:before,.datapanel:after,.datapanel:before,.row:after,.row:before,.row-padding:after,.row-padding:before,
+.container:after,.container:before,.container-none:after,.container-none:before,.container-lefte:after,.container-left:before,.container-right:after,.container-right:before,.datapanel:after,.datapanel:before,.row:after,.row:before,.row-padding:after,.row-padding:before,
 .cell-row:before,.cell-row:after,.clear:after,.clear:before,.bar:before,.bar:after{content:"";display:table;clear:both}
 .col,.half,.third,.twothird,.threequarter,.quarter,.fifth,.twofifth,.threefifth,.fourfifth{float:left;width:100%}
 .col.s1{width:8.33333%}.col.s2{width:16.66666%}.col.s3{width:24.99999%}.col.s4{width:33.33333%}
@@ -111,6 +111,7 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
 .round-small{border-radius:2px}.round,.round-medium{border-radius:4px}.round-large{border-radius:8px}.round-xlarge{border-radius:16px}.round-xxlarge{border-radius:32px}
 .row-padding,.row-padding>.half,.row-padding>.third,.row-padding>.twothird,.row-padding>.threequarter,.row-padding>.quarter,.row-padding>.col{padding:0 8px}
 .container,.datapanel{padding:0.01em 8px}.datapanel{margin-top:8px;margin-bottom:8px}
+.container-none{padding: 0px;}.container-right{padding:0.01em 8px 0.01em 0px;}.container-left{padding:0.01em 0px 0.01em 8px;}
 .code,.codespan{font-family:Consolas,"courier new";font-size:16px}
 .code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
 .codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
@@ -345,8 +346,12 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0}
   background-color: #d3d3d3!important;
 }
 
-
-
+.readonlybasic {
+  pointer-events:none;
+  color: #000!important;
+  background-color: #efefef!important;
+  border: 0px!important;
+}
 .right-side-bg {
   background: url("../img/bg1.jpg");
   background-size: cover;
@@ -498,6 +503,12 @@ div.PageHeadTitle
        color: #fff;
 }
 
+.SubHeadTitle {
+       font-size: 13pt;
+  color: #fff;
+  font-weight: normal;
+}
+
 div.SubHeadTitle
 {
        font-size: 13pt;
@@ -508,6 +519,23 @@ div.SubHeadTitle
   font-size: 16px;
 }
 
+tr.inforow {
+  background-color: #EFEFEF;
+}
+
+tr.resultrow {
+  background-color: #484848;
+  color: #fff!important;
+}
+
+.resultcol, td.resultcol {
+  width: 90px!important;
+  text-align: right!important;
+}
+
+.labelcol, td.labelcol,th.labelcol {
+  width: 150px!important;
+}
 
 button.toolbarbtn
 {
@@ -902,3 +930,14 @@ a.inlinebtn:focus
   100% { transform: rotate(360deg); }
 }
 
+.dspvacancynormal {
+  color:#000;
+}
+
+.dspvacancyill {
+  color: red;
+}
+
+.dspvacancyextra {
+  color: blue;
+}
\ No newline at end of file
index d789c71..d0e47d9 100644 (file)
@@ -62,10 +62,31 @@ let app = {
     },\r
     closedlg: function(dlgid){\r
       document.getElementById(dlgid).style.display='none';\r
-    }\r
+    },\r
+    viewpwd(id,force){\r
+  \r
+      if (force == "text"){\r
+        document.getElementById(id).type = "text";\r
+        document.getElementById("btn_" + id).innerHTML='<span class="icon icon-eye-close"></span>';\r
+      } else if (force == "pwd"){\r
+        document.getElementById(id).type = "password";\r
+        document.getElementById("btn_" + id).innerHTML='<span class="icon icon-eye-open"></span>';\r
+      }else {\r
+        var fldtype = document.getElementById(id).type;\r
+        if (fldtype == "text"){\r
+          document.getElementById(id).type = "password";\r
+          document.getElementById("btn_" + id).innerHTML='<span class="icon icon-eye-open"></span>';\r
+        } else {\r
+          document.getElementById(id).type = "text";\r
+          document.getElementById("btn_" + id).innerHTML='<span class="icon icon-eye-close"></span>';\r
+        }\r
+      }\r
+      \r
+      return false;\r
+    },\r
 }\r
 document.addEventListener("DOMContentLoaded", function() {\r
-  moment.locale('fr');\r
+  \r
   initpage();\r
 });\r
 \r
diff --git a/app/static/js/app.min.js b/app/static/js/app.min.js
deleted file mode 100644 (file)
index b21a478..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-let app={loadpage:function(e,t){location.href=e},logout:function(){postData(location.href,{logout:"1"}).then(e=>{location.href="login.html"})},reloadpage(){},changedataset:function(){},getCurrentSchemata:function(){return schemata},changedataset:function(){let e=document.getElementById("current_schemata").value
-schemata=e,postData("db.cgi",{fn:"setsessiondata",params:{schemata:e}}).then(t=>{document.getElementById("current_schemata").dataset.selected=e})},setschemata(e){},reload_page:function(){location.href=location.href},viewpanel:function(e){let t=document.getElementsByClassName("panel"),n=document.getElementsByClassName("paneltoolbar")
-currentview=e
-for(let e=0;e<t.length;e++)t[e].style.display="none"
-for(let e=0;e<n.length;e++)n[e].style.display="none"
-return document.getElementById("pnl_"+e)&&(document.getElementById("pnl_"+e).style.display="block"),document.getElementById("tlb_"+e)&&(document.getElementById("tlb_"+e).style.display="block"),!1},viewdialog:function(e){document.getElementById("dlg_"+e)&&(document.getElementById("dlg_"+e).style.display="block")},opendlg:function(e,t,n){for(var o in t)document.getElementById(e+o)&&(document.getElementById(e+o).innerHTML=t[o])
-n&&(document.getElementById(e+"_button")&&document.getElementById(e+"_button").addEventListener("click",n,!0),document.getElementById(e+"_button")&&document.getElementById(e+"_button").addEventListener("click",n,!0))},closedlg:function(e){document.getElementById(e).style.display="none"}}
-document.addEventListener("DOMContentLoaded",function(){moment.locale("fr"),initpage()}),"serviceWorker"in navigator&&window.addEventListener("load",function(){navigator.serviceWorker.register("/static/js/sw.js").then(e=>void 0).catch(e=>void 0)})
index 2251bae..683ca5c 100644 (file)
@@ -38,7 +38,7 @@ saveformdata: function(flds,aftercallback,clientschema){
 formsaved: function(data){
   var sb = document.getElementById("snackbar");
   sb.className="show green";
-  sb.innerHTML = 'Les données ont été sauvegardées!';
+  sb.innerHTML = lbl.datasaved;
   setTimeout(function(){ sb.className = sb.className.replace("show green", ""); }, 3000);
   return false;
 },
@@ -60,7 +60,8 @@ getformcontent: function(frmid,dataflds){
         flds[field.getAttribute("name")] = ndata;
       }else if (field.tagName == "TEXTAREA" ){
         if (field.classList.contains("richeditarea")){
-          flds[field.getAttribute("name")] = tinymce.get(field.id).getContent();
+          flds[field.getAttribute("name")] = dataflds[field.getAttribute("id")].getContents(true);
+          //flds[field.getAttribute("name")] = tinymce.get(field.id).getContent();
         } else {
           flds[field.getAttribute("name")] = field.innerHTML;
         }
@@ -115,7 +116,8 @@ cleanform: function(frmname){
     }
     if (frm[f].tagName == 'TEXTAREA'){
       if (frm[f].classList.contains("richeditarea")){
-        tinymce.get(frm[f].id).setContent("");
+        choices[frm[f].id].setContents("");
+        //tinymce.get(frm[f].id).setContent("");
       } else {
         frm[f].innerHTML = "";
       } 
@@ -155,7 +157,8 @@ cleanform2: function(frmname,choices){
     }
     if (frm[f].tagName == 'TEXTAREA'){
       if (frm[f].classList.contains("richeditarea")){
-        tinymce.get(frm[f].id).setContent("");
+        choices[frm[f].id].setContents("");
+        //tinymce.get(frm[f].id).setContent("");
       } else {
         frm[f].innerHTML = "";
       } 
@@ -237,6 +240,15 @@ savefield: function(obj,callback){
   postData("db.cgi",fdata).then(data => { if (callback){callback(data);}});
   return false;
 },
+savefielddata: function(obj,objdata,callback){
+  fdata = obj.dataset;
+  fdata["save"] = "field";
+  fdata["schemata"] = schemata;
+  fdata["value"] = objdata;
+  console.log("savefielddata",fdata);
+  if (callback){}
+  //postData("db.cgi",fdata).then(data => { if (callback){callback(data);}});
+},
 saveschemafield: function(obj,schema){
   fdata = obj.dataset;
   fdata["save"] = "field";
diff --git a/app/static/vendors/suneditor/css/suneditor.min.css b/app/static/vendors/suneditor/css/suneditor.min.css
new file mode 100644 (file)
index 0000000..5fc9aaa
--- /dev/null
@@ -0,0 +1 @@
+.sun-editor{width:auto;height:auto;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;border:1px solid #dadada;background-color:#fff;color:#000;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.sun-editor *{box-sizing:border-box;-webkit-user-drag:none;overflow:visible}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{margin:0;padding:0;border:0}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{resize:none;border:0;padding:0}.sun-editor button{border:0;background-color:transparent;touch-action:manipulation;cursor:pointer;outline:none}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button span{display:block;margin:0;padding:0}.sun-editor button .txt{display:block;margin-top:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sun-editor button *{pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-svg,.sun-editor button>svg{width:16px;height:16px;margin:auto;fill:currentColor;display:block;text-align:center;float:none}.sun-editor .close>svg,.sun-editor .se-dialog-close>svg{width:10px;height:10px}.sun-editor .se-btn-select>svg{float:right;width:10px;height:10px}.sun-editor .se-btn-list>.se-list-icon{display:inline-block;width:16px;height:16px;margin:-1px 10px 0 0;vertical-align:middle}.sun-editor .se-line-breaker>button>svg{width:24px;height:24px}.sun-editor button>i:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;font-size:15px;line-height:2}.sun-editor button>[class=se-icon-text]{font-size:20px;line-height:1}.sun-editor .se-arrow,.sun-editor .se-arrow:after{position:absolute;display:block;width:0;height:0;border:11px solid transparent}.sun-editor .se-arrow.se-arrow-up{top:-11px;left:20px;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.sun-editor .se-arrow.se-arrow-up:after{top:1px;margin-left:-11px;content:" ";border-top-width:0;border-bottom-color:#fff}.sun-editor .se-toolbar .se-arrow.se-arrow-up:after{border-bottom-color:#fafafa}.sun-editor .se-arrow.se-arrow-down{top:0;left:0;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,.25)}.sun-editor .se-arrow.se-arrow-down:after{top:-12px;margin-left:-11px;content:" ";border-bottom-width:0;border-top-color:#fff}.sun-editor .se-toolbar .se-arrow.se-arrow-down:after{border-top-color:#fafafa}.sun-editor .se-container{position:relative;width:100%;height:100%}.sun-editor button{color:#000}.sun-editor .se-btn{float:left;width:34px;height:34px;border:0;border-radius:4px;margin:1px!important;padding:0;font-size:12px;line-height:27px}.sun-editor .se-btn:enabled:focus,.sun-editor .se-btn:enabled:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled:active{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-btn-primary{color:#000;background-color:#c7deff;border:1px solid #80bdff;border-radius:4px}.sun-editor .se-btn-primary:focus,.sun-editor .se-btn-primary:hover{color:#000;background-color:#80bdff;border-color:#3f9dff;outline:0 none}.sun-editor .se-btn-primary:active{color:#fff;background-color:#3f9dff;border-color:#4592ff;-webkit-box-shadow:inset 0 3px 5px #4592ff;box-shadow:inset 0 3px 5px #4592ff}.sun-editor input,.sun-editor select,.sun-editor textarea{color:#000;border:1px solid #ccc;border-radius:4px}.sun-editor input:focus,.sun-editor select:focus,.sun-editor textarea:focus{border:1px solid #80bdff!important;outline:0;-webkit-box-shadow:0 0 0 .2rem #c7deff;box-shadow:0 0 0 .2rem #c7deff;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor .se-btn:enabled.active{color:#4592ff;outline:0 none}.sun-editor .se-btn:enabled.active:focus,.sun-editor .se-btn:enabled.active:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled.active:active{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-btn:enabled.on{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled.on:focus,.sun-editor .se-btn:enabled.on:hover{background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn:enabled.on:active{background-color:#c1c1c1;border-color:#b1b1b1;-webkit-box-shadow:inset 0 3px 5px #b1b1b1;box-shadow:inset 0 3px 5px #b1b1b1}.sun-editor .se-btn-list:disabled,.sun-editor .se-btn:disabled,.sun-editor button:disabled{cursor:not-allowed;background-color:inherit;color:#bdbdbd}.sun-editor .se-loading-box{position:absolute;display:none;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.7;filter:alpha(opacity=70);z-index:2147483647}.sun-editor .se-loading-box .se-loading-effect{position:absolute;display:block;top:50%;left:50%;height:25px;width:25px;border-top:2px solid #07d;border-right:2px solid transparent;border-radius:50%;animation:spinner .8s linear infinite;margin:-25px 0 0 -25px}.sun-editor .se-line-breaker{position:absolute;display:none;width:100%;height:1px;cursor:text;border-top:1px solid #3288ff;z-index:7}.sun-editor .se-line-breaker>button.se-btn{position:relative;display:inline-block;width:30px;height:30px;top:-15px;float:none;left:-50%;background-color:#fff;border:1px solid #0c2240;opacity:.6;cursor:pointer}.sun-editor .se-line-breaker>button.se-btn:hover{opacity:.9;background-color:#fff;border-color:#041b39}.sun-editor .se-line-breaker-component{position:absolute;display:none;width:24px;height:24px;background-color:#fff;border:1px solid #0c2240;opacity:.6;border-radius:4px;cursor:pointer;z-index:7}.sun-editor .se-line-breaker-component:hover{opacity:.9}.sun-editor .se-toolbar{display:block;position:relative;height:auto;width:100%;overflow:visible;padding:0;margin:0;background-color:#fafafa;outline:1px solid #dadada;z-index:5}.sun-editor .se-toolbar-cover{position:absolute;display:none;font-size:36px;width:100%;height:100%;top:0;left:0;background-color:#fefefe;opacity:.5;filter:alpha(opacity=50);cursor:not-allowed;z-index:4}.sun-editor .se-toolbar-separator-vertical{display:inline-block;height:0;width:0;margin:1px;vertical-align:top}.sun-editor .se-toolbar.se-toolbar-balloon,.sun-editor .se-toolbar.se-toolbar-inline{display:none;position:absolute;z-index:2147483647;box-shadow:0 3px 9px rgba(0,0,0,.5);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5)}.sun-editor .se-toolbar.se-toolbar-balloon{width:auto}.sun-editor .se-toolbar.se-toolbar-sticky{position:fixed;top:0}.sun-editor .se-toolbar-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .se-btn-module{display:inline-block}.sun-editor .se-btn-module-border{border:1px solid #dadada;border-radius:4px}.sun-editor .se-btn-module-enter{display:block;width:100%;height:1px;margin-bottom:5px;background-color:transparent}.sun-editor .se-toolbar-more-layer{margin:0 -3px;background-color:#f3f3f3}.sun-editor .se-toolbar-more-layer .se-more-layer{display:none;border-top:1px solid #dadada}.sun-editor .se-toolbar-more-layer .se-more-layer .se-more-form{display:inline-block;width:100%;height:auto;padding:4px 3px 0}.sun-editor .se-btn-module .se-btn-more.se-btn-more-text{width:auto;padding:0 4px}.sun-editor .se-btn-module .se-btn-more:focus,.sun-editor .se-btn-module .se-btn-more:hover{color:#000;background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn-module .se-btn-more.on{color:#333;background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn-module .se-btn-more.on:hover{color:#000;background-color:#c1c1c1;border-color:#b1b1b1;outline:0 none}.sun-editor .se-menu-list,.sun-editor .se-menu-list li{float:left;padding:0;margin:0}.sun-editor .se-menu-list li{position:relative}.sun-editor .se-btn-select{width:auto;display:flex;padding:4px 6px}.sun-editor .se-btn-select .txt{flex:auto;text-align:left}.sun-editor.se-rtl .se-btn-select svg{margin:auto 1px}.sun-editor .se-btn-select.se-btn-tool-font{width:100px}.sun-editor .se-btn-select.se-btn-tool-format{width:82px}.sun-editor .se-btn-select.se-btn-tool-size{width:78px}.sun-editor .se-btn-tray{position:relative;width:100%;height:100%;padding:4px 3px 0;margin:0}.sun-editor .se-menu-tray{position:absolute;top:0;left:0;width:100%;height:0}.sun-editor .se-submenu{overflow-x:hidden;overflow-y:auto}.sun-editor .se-list-layer{display:none;position:absolute;top:0;left:0;height:auto;z-index:5;border:1px solid #bababa;border-radius:4px;padding:6px 0;background-color:#fff;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none}.sun-editor .se-list-layer .se-list-inner{padding:0;margin:0;overflow-x:initial;overflow-y:initial;overflow:visible}.sun-editor .se-list-layer button{margin:0;width:100%}.sun-editor .se-list-inner .se-list-basic{width:100%;padding:0}.sun-editor .se-list-inner .se-list-basic li{width:100%}.sun-editor .se-list-inner .se-list-basic li>button{min-width:100%;width:max-content}.sun-editor .se-list-inner .se-list-basic li button.active{background-color:#80bdff;border:1px solid #3f9dff;border-left:0;border-right:0}.sun-editor .se-list-inner .se-list-basic li button.active:hover{background-color:#3f9dff;border:1px solid #4592ff;border-left:0;border-right:0}.sun-editor .se-list-inner .se-list-basic li button.active:active{background-color:#4592ff;border:1px solid #407dd1;border-left:0;border-right:0;-webkit-box-shadow:inset 0 3px 5px #407dd1;box-shadow:inset 0 3px 5px #407dd1}.sun-editor .se-btn-list{width:100%;height:auto;min-height:32px;padding:0 14px;cursor:pointer;font-size:12px;line-height:normal;text-indent:0;text-decoration:none;text-align:left}.sun-editor .se-btn-list.default_value{background-color:#f3f3f3;border-top:1px dotted #b1b1b1;border-bottom:1px dotted #b1b1b1}.sun-editor .se-btn-list:focus,.sun-editor .se-btn-list:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn-list:active{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-list-layer.se-list-font-size{min-width:140px;max-height:300px}.sun-editor .se-list-layer.se-list-font-family{min-width:156px}.sun-editor .se-list-layer.se-list-font-family .default{border-bottom:1px solid #ccc}.sun-editor .se-list-layer.se-list-line{width:125px}.sun-editor .se-list-layer.se-list-align .se-list-inner{left:9px;width:125px}.sun-editor .se-list-layer.se-list-format{min-width:156px}.sun-editor .se-list-layer.se-list-format li{padding:0;width:100%}.sun-editor .se-list-layer.se-list-format ul .se-btn-list{line-height:100%}.sun-editor .se-list-layer.se-list-format ul .se-btn-list[data-value=h1]{height:40px}.sun-editor .se-list-layer.se-list-format ul .se-btn-list[data-value=h2]{height:34px}.sun-editor .se-list-layer.se-list-format ul p{font-size:13px}.sun-editor .se-list-layer.se-list-format ul div{font-size:13px;padding:4px 2px}.sun-editor .se-list-layer.se-list-format ul h1{font-size:2em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h2{font-size:1.5em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h3{font-size:1.17em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h4{font-size:1em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h5{font-size:.83em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h6{font-size:.67em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul blockquote{font-size:13px;color:#999;height:22px;margin:0;background-color:transparent;line-height:1.5;border-color:#b1b1b1;padding:0 0 0 7px;border-left:5px #b1b1b1;border-style:solid}.sun-editor .se-list-layer.se-list-format ul pre{font-size:13px;color:#666;padding:4px 11px;margin:0;background-color:#f9f9f9;border:1px solid #e1e1e1;border-radius:4px}.sun-editor .se-selector-table{display:none;position:absolute;top:34px;left:1px;z-index:5;padding:5px 0;float:left;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.sun-editor .se-selector-table .se-table-size{font-size:18px;padding:0 5px}.sun-editor .se-selector-table .se-table-size-picker{position:absolute!important;z-index:3;font-size:18px;width:10em;height:10em;cursor:pointer}.sun-editor .se-selector-table .se-table-size-highlighted{position:absolute!important;z-index:2;font-size:18px;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADJmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4QTZCNzMzN0I3RUYxMUU4ODcwQ0QwMjM1NTgzRTJDNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4QTZCNzMzNkI3RUYxMUU4ODcwQ0QwMjM1NTgzRTJDNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzYyNEUxRUI3RUUxMUU4ODZGQzgwRjNBODgyNTdFOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzYyNEUxRkI3RUUxMUU4ODZGQzgwRjNBODgyNTdFOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl0yAuwAAABBSURBVDhPY/wPBAxUAGCDGvdBeWSAeicIDTfIXREiQArYeR9hEBOEohyMGkQYjBpEGAxjg6ib+yFMygCVvMbAAABj0hwMTNeKJwAAAABJRU5ErkJggg==") repeat}.sun-editor .se-selector-table .se-table-size-unhighlighted{position:relative!important;z-index:1;font-size:18px;width:10em;height:10em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.sun-editor .se-selector-table .se-table-size-display{padding-left:5px}.sun-editor .se-list-layer.se-table-split{top:36px}.sun-editor .se-list-layer .se-selector-color{display:flex;width:max-content;max-width:270px;height:auto;padding:0;margin:auto}.sun-editor .se-list-layer .se-selector-color .se-color-pallet{width:100%;height:100%;padding:0}.sun-editor .se-list-layer .se-selector-color .se-color-pallet li{display:flex;float:left;position:relative;margin:0}.sun-editor .se-list-layer .se-selector-color .se-color-pallet button{display:block;cursor:default;width:30px;height:30px;text-indent:-9999px}.sun-editor .se-list-layer .se-selector-color .se-color-pallet button.active,.sun-editor .se-list-layer .se-selector-color .se-color-pallet button:focus,.sun-editor .se-list-layer .se-selector-color .se-color-pallet button:hover{border:3px solid #fff}.sun-editor .se-form-group{display:flex;width:100%;min-height:40px;height:auto;padding:4px}.sun-editor .se-form-group input{flex:auto;display:inline-block;width:auto;height:33px;font-size:12px;margin:1px 0;padding:0;border-radius:.25rem;border:1px solid #ccc}.sun-editor .se-form-group button,.sun-editor .se-submenu-form-group button{float:right;width:34px;height:34px;margin:0 2px!important}.sun-editor .se-form-group button.se-btn{border:1px solid #ccc}.sun-editor .se-form-group>div{position:relative}.sun-editor .se-form-group label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}.sun-editor .se-form-group-label{width:100%;height:auto;padding:0 4px}.sun-editor .se-form-group-label label{font-size:13px;font-weight:700}.sun-editor .se-submenu .se-form-group input{width:auto;height:33px;color:#555}.sun-editor .se-submenu .se-form-group .se-color-input{width:72px;text-transform:uppercase;border:none;border-bottom:2px solid #b1b1b1;outline:none}.sun-editor .se-submenu .se-form-group .se-color-input:focus{border-bottom:3px solid #b1b1b1}.sun-editor .se-wrapper{position:relative!important;width:100%;height:auto;overflow:hidden;z-index:1}.sun-editor .se-wrapper .se-wrapper-inner{width:100%;height:100%;min-height:65px;overflow-y:auto;overflow-x:auto;-webkit-overflow-scrolling:touch;user-select:auto;-o-user-select:auto;-moz-user-select:auto;-khtml-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto}.sun-editor .se-wrapper .se-wrapper-inner:focus{outline:none}.sun-editor .se-wrapper .se-wrapper-code{background-color:#191919;color:#fff;font-size:13px;word-break:break-all;padding:4px;margin:0;resize:none!important}.sun-editor .se-wrapper .se-wrapper-wysiwyg{background-color:#fff;display:block}.sun-editor .se-wrapper .se-wrapper-code-mirror{font-size:13px}.sun-editor .se-wrapper .se-placeholder{position:absolute;display:none;white-space:nowrap;text-overflow:ellipsis;z-index:1;color:#b1b1b1;font-size:13px;line-height:1.5;top:0;left:0;right:0;overflow:hidden;margin-top:0;padding-top:16px;padding-left:16px;margin-left:0;padding-right:16px;margin-right:0;pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-resizing-bar{display:flex;width:auto;height:auto;min-height:16px;border-top:1px solid #dadada;padding:0 4px;background-color:#fafafa;cursor:ns-resize}.sun-editor .se-resizing-bar.se-resizing-none{cursor:default}.sun-editor .se-resizing-back{position:absolute;display:none;cursor:default;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-resizing-bar .se-navigation{flex:auto;position:relative;width:auto;height:auto;color:#666;margin:0;padding:0;font-size:10px;font-weight:700;line-height:1.5;background:transparent}.sun-editor .se-resizing-bar .se-char-counter-wrapper{flex:none;position:relative;display:block;width:auto;height:auto;margin:0;padding:0;color:#999;font-size:13px;background:transparent}.sun-editor .se-resizing-bar .se-char-counter-wrapper.se-blink{color:#b94a48;animation:blinker .2s linear infinite}.sun-editor .se-resizing-bar .se-char-counter-wrapper .se-char-label{margin-right:4px}.sun-editor .se-dialog{position:absolute;display:none;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-dialog button,.sun-editor .se-dialog input,.sun-editor .se-dialog label{font-size:14px;line-height:1.5;color:#111;margin:0}.sun-editor .se-dialog .se-dialog-back{background-color:#222;opacity:.5}.sun-editor .se-dialog .se-dialog-back,.sun-editor .se-dialog .se-dialog-inner{position:absolute;width:100%;height:100%;top:0;left:0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content{position:relative;width:auto;max-width:500px;margin:1.75rem auto;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:4px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}@media screen and (max-width:509px){.sun-editor .se-dialog .se-dialog-inner .se-dialog-content{width:100%}}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content .se-btn-primary{display:inline-block;padding:6px 12px;margin:0 0 10px!important;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;border-radius:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header{height:50px;padding:6px 15px;border-bottom:1px solid #e5e5e5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header .se-dialog-close{float:right;font-weight:700;text-shadow:0 1px 0 #fff;-webkit-appearance:none;filter:alpha(opacity=100);opacity:1}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header .se-modal-title{float:left;font-size:14px;font-weight:700;margin:0;padding:0;line-height:2.5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-body{position:relative;padding:15px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form{margin-bottom:10px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form-footer{margin-top:10px;margin-bottom:0}.sun-editor .se-dialog .se-dialog-inner input:disabled{background-color:#f3f3f3}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text{width:100%}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text .size-h,.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text .size-w{width:70px;text-align:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-x{margin:0 8px;width:25px;text-align:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer{height:55px;padding:10px 15px 0;text-align:right;border-top:1px solid #e5e5e5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer>div{float:left}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer>div>label{margin:0 5px 0 0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-radio{margin-left:12px;margin-right:6px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-check{margin-left:12px;margin-right:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form-footer .se-dialog-btn-check{margin-left:0;margin-right:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files{position:relative;display:flex;align-items:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files>input{flex:auto}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button{flex:auto;opacity:.8;border:1px solid #ccc}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button.se-file-remove>svg{width:8px;height:8px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button:hover{background-color:#f0f0f0;outline:0 none}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button:active{background-color:#e9e9e9;-webkit-box-shadow:inset 0 3px 5px #d6d6d6;box-shadow:inset 0 3px 5px #d6d6d6}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-select{display:inline-block;width:auto;height:34px;font-size:14px;text-align:center;line-height:1.42857143}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-control{display:inline-block;width:70px;height:34px;font-size:14px;text-align:center;line-height:1.42857143}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form{display:block;width:100%;height:34px;font-size:14px;line-height:1.42857143;padding:0 4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-input-url{direction:ltr}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-input-url:disabled{text-decoration:line-through;color:#999}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-video-ratio{width:70px;margin-left:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form a{color:#004cff}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert{border:1px solid #ccc}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert:active{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-dialog-tabs{width:100%;height:25px;border-bottom:1px solid #e5e5e5}.sun-editor .se-dialog-tabs button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .se-dialog-tabs button:hover{background-color:#fff}.sun-editor .se-dialog-tabs button.active{background-color:#fff;border-bottom:0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-math-exp{resize:vertical;height:4rem;border:1px solid #ccc;font-size:13px;padding:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-select.se-math-size{width:6em;height:28px;margin-left:1em}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-math-preview{font-size:13px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-math-preview>span{display:inline-block;-webkit-box-shadow:0 0 0 .1rem #c7deff;box-shadow:0 0 0 .1rem #c7deff}.sun-editor .se-dialog .se-dialog-inner .se-link-preview{display:block;height:auto;max-height:18px;margin:4px 0 0 4px;font-size:13px;font-weight:400;font-family:inherit;color:#666;background-color:transparent;overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:pre}.sun-editor .se-dialog .se-dialog-inner .se-svg.se-link-bookmark{color:#4592ff}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer .se-link-rel{float:left}.sun-editor .se-controller .se-arrow.se-arrow-up{border-bottom-color:rgba(0,0,0,.25)}.sun-editor .se-controller{position:absolute;display:none;overflow:visible;z-index:6;border:1px solid rgba(0,0,0,.25);border-radius:4px;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.sun-editor .se-controller .se-btn-group{position:relative;display:flex;vertical-align:middle;padding:2px;top:0;left:0}.sun-editor .se-controller .se-btn-group .se-btn-group-sub{left:50%;min-width:auto;width:max-content;display:none}.sun-editor .se-controller .se-btn-group .se-btn-group-sub button{margin:0;min-width:72px}.sun-editor .se-controller .se-btn-group button{position:relative;min-height:34px;height:auto;border:none;border-radius:4px;margin:1px;padding:5px 10px;font-size:12px;line-height:1.5;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation}.sun-editor .se-controller .se-btn-group button:focus:enabled,.sun-editor .se-controller .se-btn-group button:hover:enabled{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:active:enabled{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-controller .se-btn-group button span{display:block;padding:0;margin:0}.sun-editor .se-controller .se-btn-group button:enabled.active{color:#4592ff;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.active:focus,.sun-editor .se-controller .se-btn-group button:enabled.active:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.active:active{background-color:#d1d1d1;border-color:#c1c1c1;-webkit-box-shadow:inset 0 3px 5px #c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-controller .se-btn-group button:enabled.on{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.on:focus,.sun-editor .se-controller .se-btn-group button:enabled.on:hover{background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.on:active{background-color:#c1c1c1;border-color:#b1b1b1;-webkit-box-shadow:inset 0 3px 5px #b1b1b1;box-shadow:inset 0 3px 5px #b1b1b1}.sun-editor .se-controller .se-form-group input{min-width:120px}.sun-editor .se-controller-resizing{margin-top:-50px!important;padding:0;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143}.sun-editor .se-controller-resizing .se-btn-group .se-btn-group-sub.se-resizing-align-list{width:74px}.sun-editor .se-resizing-container{position:absolute;display:none;outline:1px solid #3f9dff;background-color:transparent}.sun-editor .se-resizing-container .se-modal-resize{position:absolute;display:inline-block;background-color:#3f9dff;opacity:.3}.sun-editor .se-resizing-container .se-resize-dot{position:absolute;top:0;left:0;width:100%;height:100%}.sun-editor .se-resizing-container .se-resize-dot>span{position:absolute;width:7px;height:7px;background-color:#3f9dff;border:1px solid #4592ff}.sun-editor .se-resizing-container .se-resize-dot>span.tl{top:-5px;left:-5px;cursor:nw-resize}.sun-editor .se-resizing-container .se-resize-dot>span.tr{top:-5px;right:-5px;cursor:ne-resize}.sun-editor .se-resizing-container .se-resize-dot>span.bl{bottom:-5px;left:-5px;cursor:sw-resize}.sun-editor .se-resizing-container .se-resize-dot>span.br{right:-5px;bottom:-5px;cursor:se-resize}.sun-editor .se-resizing-container .se-resize-dot>span.lw{left:-7px;bottom:50%;cursor:w-resize}.sun-editor .se-resizing-container .se-resize-dot>span.th{left:50%;top:-7px;cursor:n-resize}.sun-editor .se-resizing-container .se-resize-dot>span.rw{right:-7px;bottom:50%;cursor:e-resize}.sun-editor .se-resizing-container .se-resize-dot>span.bh{right:50%;bottom:-7px;cursor:s-resize}.sun-editor .se-resizing-container .se-resize-display{position:absolute;right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#333;border-radius:4px}.sun-editor .se-controller-table,.sun-editor .se-controller-table-cell{width:auto}.sun-editor .se-controller-link,.sun-editor .se-controller-table,.sun-editor .se-controller-table-cell{padding:0;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143}.sun-editor .se-controller-link:after,.sun-editor .se-controller-link:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.sun-editor .se-controller-link .link-content{padding:0;margin:0}.sun-editor .se-controller-link .link-content a{display:inline-block;color:#4592ff;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;margin-left:5px}.sun-editor .se-file-browser{position:absolute;display:none;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-file-browser button,.sun-editor .se-file-browser input,.sun-editor .se-file-browser label{font-size:14px;line-height:1.5;color:#111;margin:0}.sun-editor .se-file-browser .se-file-browser-back{background-color:#222;opacity:.5}.sun-editor .se-file-browser .se-file-browser-back,.sun-editor .se-file-browser .se-file-browser-inner{position:absolute;display:block;width:100%;height:100%;top:0;left:0}.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{position:relative;width:960px;max-width:100%;margin:20px auto;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:4px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.sun-editor .se-file-browser .se-file-browser-header{height:auto;min-height:50px;padding:6px 15px;border-bottom:1px solid #e5e5e5}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-close{float:right;font-weight:700;text-shadow:0 1px 0 #fff;-webkit-appearance:none;filter:alpha(opacity=100);opacity:1}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-close>svg{width:12px;height:12px}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-title{font-size:16px;font-weight:700;margin:0;padding:0;line-height:2.2}.sun-editor .se-file-browser .se-file-browser-tags{display:block;width:100%;padding:0;text-align:left;margin:0 -15px}.sun-editor .se-file-browser .se-file-browser-tags a{display:inline-block;background-color:#f5f5f5;padding:6px 12px;margin:8px 0 8px 8px;color:#333;text-decoration:none;border-radius:32px;-moz-border-radius:32px;-webkit-border-radius:32px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;cursor:pointer}.sun-editor .se-file-browser .se-file-browser-tags a:hover{background-color:#e1e1e1}.sun-editor .se-file-browser .se-file-browser-tags a:active{background-color:#d1d1d1}.sun-editor .se-file-browser .se-file-browser-tags a.on{background-color:#ebf3fe;color:#4592ff}.sun-editor .se-file-browser .se-file-browser-tags a.on:hover{background-color:#d8e8fe}.sun-editor .se-file-browser .se-file-browser-tags a.on:active{background-color:#c7deff}.sun-editor .se-file-browser .se-file-browser-body{position:relative;height:auto;min-height:350px;padding:20px;overflow-y:auto}.sun-editor .se-file-browser .se-file-browser-body .se-file-browser-list{position:relative;width:100%}@media screen and (max-width:992px){.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{width:748px}}@media screen and (max-width:768px){.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{width:600px}}.sun-editor .se-file-browser .se-file-browser-list .se-file-item-column{position:relative;display:block;height:auto;float:left}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(25% - 20px);margin:0 10px}@media screen and (max-width:992px){.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(33% - 20px)}}@media screen and (max-width:768px){.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(50% - 20px)}}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img{position:relative;display:block;cursor:pointer;width:100%;height:auto;border-radius:4px;outline:0;margin:10px 0}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img:hover{opacity:.8;-webkit-box-shadow:0 0 0 .2rem #3288ff;box-shadow:0 0 0 .2rem #3288ff}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>img{position:relative;display:block;width:100%;border-radius:4px;outline:0;height:auto}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>.se-file-img-name{position:absolute;z-index:1;font-size:13px;color:#fff;left:0;bottom:0;padding:5px 10px;background-color:transparent;width:100%;height:30px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>.se-file-img-name.se-file-name-back{background-color:#333;opacity:.6}.sun-editor .se-notice{position:absolute;top:0;display:none;z-index:7;width:100%;height:auto;word-break:break-all;font-size:13px;color:#b94a48;background-color:#f2dede;padding:15px;margin:0;border:1px solid #eed3d7;user-select:auto;-o-user-select:auto;-moz-user-select:auto;-khtml-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto}.sun-editor .se-notice button{float:right;padding:7px}.sun-editor .se-tooltip{position:relative;overflow:visible}.sun-editor .se-tooltip .se-tooltip-inner{visibility:hidden;position:absolute;display:block;width:auto;top:120%;left:50%;background:transparent;opacity:0;z-index:1;line-height:1.5;transition:opacity .5s;margin:0;padding:0;bottom:auto;float:none;pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text{position:relative;display:inline-block;width:auto;left:-50%;font-size:.9em;margin:0;padding:4px 6px;border-radius:2px;background-color:#333;color:#fff;text-align:center;line-height:unset;white-space:nowrap;cursor:auto}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text:after{content:"";position:absolute;bottom:100%;left:50%;margin-left:-5px;border:5px solid transparent;border-bottom-color:#333}.sun-editor .se-tooltip:hover .se-tooltip-inner{visibility:visible;opacity:1}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut{display:block!important}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut>.se-shortcut-key{display:inline;font-weight:700}.sun-editor.se-rtl .se-btn-tray{direction:rtl}.sun-editor.se-rtl .se-btn-select .txt{flex:auto;text-align:right;direction:rtl}.sun-editor.se-rtl .se-btn-list{text-align:right}.sun-editor.se-rtl .se-btn-list>.se-list-icon{margin:-1px 0 0 10px}.sun-editor.se-rtl .se-menu-list,.sun-editor.se-rtl .se-menu-list li{float:right}.sun-editor.se-rtl .se-list-layer *{direction:rtl}.sun-editor.se-rtl .se-list-layer.se-list-format ul blockquote{padding:0 7px 0 0;border-right-width:5px;border-left-width:0}.sun-editor.se-rtl .se-list-layer .se-selector-color .se-color-pallet li{float:right}.sun-editor.se-rtl .se-tooltip .se-tooltip-inner .se-tooltip-text,.sun-editor.se-rtl .se-wrapper .se-placeholder{direction:rtl}.sun-editor.se-rtl .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut{direction:ltr}.sun-editor.se-rtl .se-dialog *{direction:rtl}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-header .se-dialog-close{float:left}.sun-editor.se-rtl .se-dialog-tabs button,.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-header .se-modal-title{float:right}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-size-text{padding-right:34px}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-content .se-btn-primary{float:left}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer>div{float:right}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer>div>label{margin:0 0 0 5px}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer .se-link-rel{float:right}.sun-editor.se-rtl .se-file-browser *{direction:rtl}.sun-editor.se-rtl .se-file-browser .se-file-browser-tags{text-align:right}.sun-editor.se-rtl .se-file-browser .se-file-browser-tags a{margin:8px 8px 0}.sun-editor.se-rtl .se-file-browser .se-file-browser-header .se-file-browser-close{float:left}.sun-editor.se-rtl .se-controller .se-btn-group,.sun-editor.se-rtl .se-resizing-container .se-resize-display{direction:rtl}@keyframes blinker{50%{opacity:0}}@keyframes spinner{to{transform:rotate(361deg)}}.sun-editor-editable{font-family:Helvetica Neue,sans-serif;font-size:13px;color:#333;line-height:1.5;background-color:#fff;word-break:normal;word-wrap:break-word;padding:16px;margin:0}.sun-editor-editable *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:inherit;font-size:inherit;color:inherit}.sun-editor-editable.se-rtl *{direction:rtl}.sun-editor-editable audio,.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th,.sun-editor-editable video{position:relative}.sun-editor-editable .__se__float-left{float:left}.sun-editor-editable .__se__float-right{float:right}.sun-editor-editable .__se__float-center{float:center}.sun-editor-editable .__se__float-none{float:none}.sun-editor-editable span{display:inline;vertical-align:baseline;margin:0;padding:0}.sun-editor-editable span.katex{display:inline-block}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable span[style~="color:"] a{color:inherit}.sun-editor-editable a:focus,.sun-editor-editable a:hover{cursor:pointer;color:#0093ff;text-decoration:underline}.sun-editor-editable a.on{color:#0093ff;background-color:#e8f7ff}.sun-editor-editable pre{display:block;padding:8px;margin:0 0 10px;font-family:monospace;color:#666;line-height:1.45;background-color:#f9f9f9;border:1px solid #e1e1e1;border-radius:2px;white-space:pre-wrap;word-wrap:break-word;overflow:visible}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{list-style-position:inside;display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0;margin-inline-end:0;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;text-align:-webkit-match-parent;margin-bottom:5px}.sun-editor-editable ol ol,.sun-editor-editable ol ul,.sun-editor-editable ul ol,.sun-editor-editable ul ul{margin:0}.sun-editor-editable ol ol,.sun-editor-editable ul ol{list-style-type:lower-alpha}.sun-editor-editable ol ol ol,.sun-editor-editable ul ol ol,.sun-editor-editable ul ul ol{list-style-type:upper-roman}.sun-editor-editable ol ul,.sun-editor-editable ul ul{list-style-type:circle}.sun-editor-editable ol ol ul,.sun-editor-editable ol ul ul,.sun-editor-editable ul ul ul{list-style-type:square}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin:0 0 10px}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{display:block;font-family:inherit;font-size:inherit;color:#999;margin-block-start:1em;margin-block-end:1em;margin-inline-start:0;margin-inline-end:0;padding:0 5px 0 20px;border:solid #b1b1b1;border-width:0 0 0 5px}.sun-editor-editable blockquote blockquote{border-color:#c1c1c1}.sun-editor-editable blockquote blockquote blockquote{border-color:#d1d1d1}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#e1e1e1}.sun-editor-editable.se-rtl blockquote{padding-left:5px;padding-right:20px;border-left-width:0;border-right-width:5px}.sun-editor-editable h1{font-size:2em;margin-block-start:.67em;margin-block-end:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h2{font-size:1.5em;margin-block-start:.83em;margin-block-end:.83em}.sun-editor-editable h3{font-size:1.17em;margin-block-start:1em;margin-block-end:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h4{font-size:1em;margin-block-start:1.33em;margin-block-end:1.33em}.sun-editor-editable h5{font-size:.83em;margin-block-start:1.67em;margin-block-end:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;margin-inline-start:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h6{font-size:.67em;margin-block-start:2.33em;margin-block-end:2.33em}.sun-editor-editable hr{display:flex;border-width:1px 0 0;border-color:#000;border-image:initial;height:1px}.sun-editor-editable hr.__se__solid{border-style:solid none none}.sun-editor-editable hr.__se__dotted{border-style:dotted none none}.sun-editor-editable hr.__se__dashed{border-style:dashed none none}.sun-editor-editable table{display:table;table-layout:auto;border:1px solid #ccc;width:100%;max-width:100%;margin:0 0 10px;background-color:transparent;border-spacing:0;border-collapse:collapse}.sun-editor-editable.se-rtl table{margin:0 0 10px auto}.sun-editor-editable table thead{border-bottom:2px solid #333}.sun-editor-editable table tr{border:1px solid #efefef}.sun-editor-editable table th{background-color:#f3f3f3}.sun-editor-editable table td,.sun-editor-editable table th{border:1px solid #e1e1e1;padding:.4em;background-clip:padding-box}.sun-editor-editable table.se-table-size-auto{width:auto!important}.sun-editor-editable table.se-table-size-100{width:100%!important}.sun-editor-editable table.se-table-layout-auto{table-layout:auto!important}.sun-editor-editable table.se-table-layout-fixed{table-layout:fixed!important}.sun-editor-editable table td.se-table-selected-cell,.sun-editor-editable table th.se-table-selected-cell{border:1px double #4592ff;background-color:#f1f7ff}.sun-editor-editable.se-disabled *{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.sun-editor-editable .se-component{display:flex;padding:1px;margin:0 0 10px}.sun-editor-editable .se-component.__se__float-left{margin:0 20px 10px 0}.sun-editor-editable .se-component.__se__float-right{margin:0 0 10px 20px}.sun-editor-editable[contenteditable=true] .se-component{outline:1px dashed #e1e1e1}.sun-editor-editable[contenteditable=true] .se-component.se-component-copy{-webkit-box-shadow:0 0 0 .2rem #80bdff;box-shadow:0 0 0 .2rem #3f9dff;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor-editable audio,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable video{display:block;margin:0;padding:0;width:auto;height:auto;max-width:100%}.sun-editor-editable[contenteditable=true] figure:after{position:absolute;content:"";z-index:1;top:0;left:0;right:0;bottom:0;cursor:default;display:block;background:transparent}.sun-editor-editable[contenteditable=true] figure a,.sun-editor-editable[contenteditable=true] figure iframe,.sun-editor-editable[contenteditable=true] figure img,.sun-editor-editable[contenteditable=true] figure video{z-index:0}.sun-editor-editable[contenteditable=true] figure figcaption{display:block;z-index:2}.sun-editor-editable[contenteditable=true] figure figcaption:focus{border-color:#80bdff;outline:0;-webkit-box-shadow:0 0 0 .2rem #c7deff;box-shadow:0 0 0 .2rem #c7deff}.sun-editor-editable .se-image-container,.sun-editor-editable .se-video-container{width:auto;height:auto;max-width:100%}.sun-editor-editable figure{display:block;outline:none;margin:0;padding:0}.sun-editor-editable figure figcaption{padding:1em .5em;margin:0;background-color:#f9f9f9;outline:none}.sun-editor-editable figure figcaption p{line-height:2;margin:0}.sun-editor-editable .se-image-container a img{padding:1px;margin:1px;outline:1px solid #4592ff}.sun-editor-editable .se-video-container iframe,.sun-editor-editable .se-video-container video{outline:1px solid #9e9e9e;position:absolute;top:0;left:0;border:0;width:100%;height:100%}.sun-editor-editable .se-video-container figure{left:0;width:100%;max-width:100%}.sun-editor-editable audio{width:300px;height:54px}.sun-editor-editable audio.active{outline:2px solid #80bdff}.sun-editor-editable.se-show-block div,.sun-editor-editable.se-show-block h1,.sun-editor-editable.se-show-block h2,.sun-editor-editable.se-show-block h3,.sun-editor-editable.se-show-block h4,.sun-editor-editable.se-show-block h5,.sun-editor-editable.se-show-block h6,.sun-editor-editable.se-show-block li,.sun-editor-editable.se-show-block ol,.sun-editor-editable.se-show-block p,.sun-editor-editable.se-show-block pre,.sun-editor-editable.se-show-block ul{border:1px dashed #3f9dff!important;padding:14px 8px 8px!important}.sun-editor-editable.se-show-block ol,.sun-editor-editable.se-show-block ul{border:1px dashed #d539ff!important}.sun-editor-editable.se-show-block pre{border:1px dashed #27c022!important}.se-show-block p{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==") no-repeat}.se-show-block div{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==") no-repeat}.se-show-block h1{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC") no-repeat}.se-show-block h2{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==") no-repeat}.se-show-block h3{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC") no-repeat}.se-show-block h4{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC") no-repeat}.se-show-block h5{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC") no-repeat}.se-show-block h6{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC") no-repeat}.se-show-block li{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA7SURBVDhPYxgFcNDQ0PAfykQBIHEYhgoRB/BpwCfHBKWpBkaggYxQGgOgBzyQD1aLLA4TGwWDGjAwAACR3RcEU9Ui+wAAAABJRU5ErkJggg==") no-repeat}.se-show-block ol{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABHSURBVDhPYxgFcNDQ0PAfhKFcFIBLHCdA1oBNM0kGEmMAPgOZoDTVANUNxAqQvURMECADRiiNAWCagDSGGhyW4DRrMAEGBgAu0SX6WpGgjAAAAABJRU5ErkJggg==") no-repeat}.se-show-block ul{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA1SURBVDhPYxgFDA0NDf+hTBSALI5LDQgwQWmqgVEDKQcsUBoF4ItFGEBXA+QzQpmDGjAwAAA8DQ4Lni6gdAAAAABJRU5ErkJggg==") no-repeat}.sun-editor-editable .__se__p-bordered,.sun-editor .__se__p-bordered{border-top:1px solid #b1b1b1;border-bottom:1px solid #b1b1b1;padding:4px 0}.sun-editor-editable .__se__p-spaced,.sun-editor .__se__p-spaced{letter-spacing:1px}.sun-editor-editable .__se__p-neon,.sun-editor .__se__p-neon{font-weight:200;font-style:italic;background:#000;color:#fff;padding:6px 4px;border:2px solid #fff;border-radius:6px;text-transform:uppercase;animation:neonFlicker 1.5s infinite alternate}@keyframes neonFlicker{0%,19%,21%,23%,25%,54%,56%,to{text-shadow:-.2rem -.2rem 1rem #fff,.2rem .2rem 1rem #fff,0 0 2px #f40,0 0 4px #f40,0 0 6px #f40,0 0 8px #f40,0 0 10px #f40;box-shadow:0 0 .5px #fff,inset 0 0 .5px #fff,0 0 2px #08f,inset 0 0 2px #08f,0 0 4px #08f,inset 0 0 4px #08f}20%,24%,55%{text-shadow:none;box-shadow:none}}.sun-editor-editable .__se__t-shadow,.sun-editor .__se__t-shadow{text-shadow:-.2rem -.2rem 1rem #fff,.2rem .2rem 1rem #fff,0 0 .2rem #999,0 0 .4rem #888,0 0 .6rem #777,0 0 .8rem #666,0 0 1rem #555}.sun-editor-editable .__se__t-code,.sun-editor .__se__t-code{font-family:monospace;color:#666;background-color:rgba(27,31,35,.05);border-radius:6px;padding:.2em .4em}
\ No newline at end of file
diff --git a/app/static/vendors/suneditor/suneditor.min.js b/app/static/vendors/suneditor/suneditor.min.js
new file mode 100644 (file)
index 0000000..efb85b3
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e){var t={};function n(i){if(t[i])return t[i].exports;var l=t[i]={i:i,l:!1,exports:{}};return e[i].call(l.exports,l,l.exports,n),l.l=!0,l.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)n.d(i,l,function(t){return e[t]}.bind(null,l));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s="XJR1")}({"1kvd":function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={name:"dialog",add:function(e){const t=e.context;t.dialog={kind:"",updateModal:!1,_closeSignal:!1};let n=e.util.createElement("DIV");n.className="se-dialog sun-editor-common";let i=e.util.createElement("DIV");i.className="se-dialog-back",i.style.display="none";let l=e.util.createElement("DIV");l.className="se-dialog-inner",l.style.display="none",n.appendChild(i),n.appendChild(l),t.dialog.modalArea=n,t.dialog.back=i,t.dialog.modal=l,t.dialog.modal.addEventListener("mousedown",this._onMouseDown_dialog.bind(e)),t.dialog.modal.addEventListener("click",this._onClick_dialog.bind(e)),t.element.relative.appendChild(n),n=null,i=null,l=null},_onMouseDown_dialog:function(e){/se-dialog-inner/.test(e.target.className)?this.context.dialog._closeSignal=!0:this.context.dialog._closeSignal=!1},_onClick_dialog:function(e){e.stopPropagation(),(/close/.test(e.target.getAttribute("data-command"))||this.context.dialog._closeSignal)&&this.plugins.dialog.close.call(this)},open:function(e,t){if(this.modalForm)return!1;this.plugins.dialog._bindClose&&(this._d.removeEventListener("keydown",this.plugins.dialog._bindClose),this.plugins.dialog._bindClose=null),this.plugins.dialog._bindClose=function(e){/27/.test(e.keyCode)&&this.plugins.dialog.close.call(this)}.bind(this),this._d.addEventListener("keydown",this.plugins.dialog._bindClose),this.context.dialog.updateModal=t,"full"===this.options.popupDisplay?this.context.dialog.modalArea.style.position="fixed":this.context.dialog.modalArea.style.position="absolute",this.context.dialog.kind=e,this.modalForm=this.context[e].modal;const n=this.context[e].focusElement;"function"==typeof this.plugins[e].on&&this.plugins[e].on.call(this,t),this.context.dialog.modalArea.style.display="block",this.context.dialog.back.style.display="block",this.context.dialog.modal.style.display="block",this.modalForm.style.display="block",n&&n.focus()},_bindClose:null,close:function(){this.plugins.dialog._bindClose&&(this._d.removeEventListener("keydown",this.plugins.dialog._bindClose),this.plugins.dialog._bindClose=null);const e=this.context.dialog.kind;this.modalForm.style.display="none",this.context.dialog.back.style.display="none",this.context.dialog.modalArea.style.display="none",this.context.dialog.updateModal=!1,"function"==typeof this.plugins[e].init&&this.plugins[e].init.call(this),this.context.dialog.kind="",this.modalForm=null,this.focus()}};return void 0===t&&(e.SUNEDITOR_MODULES||Object.defineProperty(e,"SUNEDITOR_MODULES",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_MODULES,"dialog",{enumerable:!0,writable:!1,configurable:!1,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_MODULES a window with a document");return l(e)}:l(i)},"3FqI":function(e,t,n){},JhlZ:function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={name:"fileBrowser",_xmlHttp:null,_loading:null,add:function(e){const t=e.context;t.fileBrowser={_closeSignal:!1,area:null,header:null,tagArea:null,body:null,list:null,tagElements:null,items:[],selectedTags:[],selectorHandler:null,contextPlugin:"",columnSize:4};let n=e.util.createElement("DIV");n.className="se-file-browser sun-editor-common";let i=e.util.createElement("DIV");i.className="se-file-browser-back";let l=e.util.createElement("DIV");l.className="se-file-browser-inner",l.innerHTML=this.set_browser(e),n.appendChild(i),n.appendChild(l),this._loading=n.querySelector(".se-loading-box"),t.fileBrowser.area=n,t.fileBrowser.header=l.querySelector(".se-file-browser-header"),t.fileBrowser.titleArea=l.querySelector(".se-file-browser-title"),t.fileBrowser.tagArea=l.querySelector(".se-file-browser-tags"),t.fileBrowser.body=l.querySelector(".se-file-browser-body"),t.fileBrowser.list=l.querySelector(".se-file-browser-list"),t.fileBrowser.tagArea.addEventListener("click",this.onClickTag.bind(e)),t.fileBrowser.list.addEventListener("click",this.onClickFile.bind(e)),l.addEventListener("mousedown",this._onMouseDown_browser.bind(e)),l.addEventListener("click",this._onClick_browser.bind(e)),t.element.relative.appendChild(n),n=null,i=null,l=null},set_browser:function(e){return'<div class="se-file-browser-content"><div class="se-file-browser-header"><button type="button" data-command="close" class="se-btn se-file-browser-close" class="close" aria-label="Close" title="'+e.lang.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-file-browser-title"></span><div class="se-file-browser-tags"></div></div><div class="se-file-browser-body"><div class="se-loading-box sun-editor-common"><div class="se-loading-effect"></div></div><div class="se-file-browser-list"></div></div></div>'},_onMouseDown_browser:function(e){/se-file-browser-inner/.test(e.target.className)?this.context.fileBrowser._closeSignal=!0:this.context.fileBrowser._closeSignal=!1},_onClick_browser:function(e){e.stopPropagation(),(/close/.test(e.target.getAttribute("data-command"))||this.context.fileBrowser._closeSignal)&&this.plugins.fileBrowser.close.call(this)},open:function(e,t){this.plugins.fileBrowser._bindClose&&(this._d.removeEventListener("keydown",this.plugins.fileBrowser._bindClose),this.plugins.fileBrowser._bindClose=null),this.plugins.fileBrowser._bindClose=function(e){/27/.test(e.keyCode)&&this.plugins.fileBrowser.close.call(this)}.bind(this),this._d.addEventListener("keydown",this.plugins.fileBrowser._bindClose);const n=this.context.fileBrowser;n.contextPlugin=e,n.selectorHandler=t;const i=this.context[e],l=i.listClass;this.util.hasClass(n.list,l)||(n.list.className="se-file-browser-list "+l),"full"===this.options.popupDisplay?n.area.style.position="fixed":n.area.style.position="absolute",n.titleArea.textContent=i.title,n.area.style.display="block",this.plugins.fileBrowser._drawFileList.call(this,this.context[e].url)},_bindClose:null,close:function(){const e=this.plugins.fileBrowser;e._xmlHttp&&e._xmlHttp.abort(),e._bindClose&&(this._d.removeEventListener("keydown",e._bindClose),e._bindClose=null);const t=this.context.fileBrowser;t.area.style.display="none",t.selectorHandler=null,t.selectedTags=[],t.items=[],t.list.innerHTML=t.tagArea.innerHTML=t.titleArea.textContent="","function"==typeof this.plugins[t.contextPlugin].init&&this.plugins[t.contextPlugin].init.call(this),t.contextPlugin=""},showBrowserLoading:function(){this._loading.style.display="block"},closeBrowserLoading:function(){this._loading.style.display="none"},_drawFileList:function(e){const t=this.plugins.fileBrowser,n=t._xmlHttp=this.util.getXMLHttpRequest();n.onreadystatechange=t._callBackGet.bind(this,n),n.open("get",e,!0),n.send(null),this.plugins.fileBrowser.showBrowserLoading()},_callBackGet:function(e){if(4===e.readyState)if(this.plugins.fileBrowser._xmlHttp=null,200===e.status)try{this.plugins.fileBrowser._drawListItem.call(this,JSON.parse(e.responseText).result,!0)}catch(e){throw Error('[SUNEDITOR.fileBrowser.drawList.fail] cause : "'+e.message+'"')}finally{this.plugins.fileBrowser.closeBrowserLoading(),this.context.fileBrowser.body.style.maxHeight=this._w.innerHeight-this.context.fileBrowser.header.offsetHeight-50+"px"}else if(this.plugins.fileBrowser.closeBrowserLoading(),0!==e.status){const t=e.responseText?JSON.parse(e.responseText):e,n="[SUNEDITOR.fileBrowser.get.serverException] status: "+e.status+", response: "+(t.errorMessage||e.responseText);throw Error(n)}},_drawListItem:function(e,t){const n=this.context.fileBrowser,i=this.context[n.contextPlugin],l=[],o=e.length,s=i.columnSize||n.columnSize,a=s<=1?1:Math.round(o/s)||1,r=i.itemTemplateHandler;let c="",d='<div class="se-file-item-column">',u=1;for(let n,i,h=0;h<o;h++)if(n=e[h],i=n.tag?"string"==typeof n.tag?n.tag.split(","):n.tag:[],i=n.tag=i.map((function(e){return e.trim()})),d+=r(n),(h+1)%a==0&&u<s&&h+1<o&&(u++,d+='</div><div class="se-file-item-column">'),t&&i.length>0)for(let e,t=0,n=i.length;t<n;t++)e=i[t],e&&-1===l.indexOf(e)&&(l.push(e),c+='<a title="'+e+'">'+e+"</a>");d+="</div>",n.list.innerHTML=d,t&&(n.items=e,n.tagArea.innerHTML=c,n.tagElements=n.tagArea.querySelectorAll("A"))},onClickTag:function(e){const t=e.target;if(!this.util.isAnchor(t))return;const n=t.textContent,i=this.plugins.fileBrowser,l=this.context.fileBrowser,o=l.tagArea.querySelector('a[title="'+n+'"]'),s=l.selectedTags,a=s.indexOf(n);a>-1?(s.splice(a,1),this.util.removeClass(o,"on")):(s.push(n),this.util.addClass(o,"on")),i._drawListItem.call(this,0===s.length?l.items:l.items.filter((function(e){return e.tag.some((function(e){return s.indexOf(e)>-1}))})),!1)},onClickFile:function(e){e.preventDefault(),e.stopPropagation();const t=this.context.fileBrowser,n=t.list;let i=e.target,l=null;if(i===n)return;for(;n!==i.parentNode&&(l=i.getAttribute("data-command"),!l);)i=i.parentNode;if(!l)return;const o=t.selectorHandler||this.context[t.contextPlugin].selectorHandler;this.plugins.fileBrowser.close.call(this),o(i)}};return void 0===t&&(e.SUNEDITOR_MODULES||Object.defineProperty(e,"SUNEDITOR_MODULES",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_MODULES,"fileBrowser",{enumerable:!0,writable:!1,configurable:!1,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_MODULES a window with a document");return l(e)}:l(i)},P6u4:function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={code:"en",toolbar:{default:"Default",save:"Save",font:"Font",formats:"Formats",fontSize:"Size",bold:"Bold",underline:"Underline",italic:"Italic",strike:"Strike",subscript:"Subscript",superscript:"Superscript",removeFormat:"Remove Format",fontColor:"Font Color",hiliteColor:"Highlight Color",indent:"Indent",outdent:"Outdent",align:"Align",alignLeft:"Align left",alignRight:"Align right",alignCenter:"Align center",alignJustify:"Align justify",list:"List",orderList:"Ordered list",unorderList:"Unordered list",horizontalRule:"Horizontal line",hr_solid:"Solid",hr_dotted:"Dotted",hr_dashed:"Dashed",table:"Table",link:"Link",math:"Math",image:"Image",video:"Video",audio:"Audio",fullScreen:"Full screen",showBlocks:"Show blocks",codeView:"Code view",undo:"Undo",redo:"Redo",preview:"Preview",print:"print",tag_p:"Paragraph",tag_div:"Normal (DIV)",tag_h:"Header",tag_blockquote:"Quote",tag_pre:"Code",template:"Template",lineHeight:"Line height",paragraphStyle:"Paragraph style",textStyle:"Text style",imageGallery:"Image gallery",mention:"Mention"},dialogBox:{linkBox:{title:"Insert Link",url:"URL to link",text:"Text to display",newWindowCheck:"Open in new window",bookmark:"Bookmark"},mathBox:{title:"Math",inputLabel:"Mathematical Notation",fontSizeLabel:"Font Size",previewLabel:"Preview"},imageBox:{title:"Insert image",file:"Select from files",url:"Image URL",altText:"Alternative text"},videoBox:{title:"Insert Video",file:"Select from files",url:"Media embed URL, YouTube/Vimeo"},audioBox:{title:"Insert Audio",file:"Select from files",url:"Audio URL"},browser:{tags:"Tags",search:"Search"},caption:"Insert description",close:"Close",submitButton:"Submit",revertButton:"Revert",proportion:"Constrain proportions",basic:"Basic",left:"Left",right:"Right",center:"Center",width:"Width",height:"Height",size:"Size",ratio:"Ratio"},controller:{edit:"Edit",unlink:"Unlink",remove:"Remove",insertRowAbove:"Insert row above",insertRowBelow:"Insert row below",deleteRow:"Delete row",insertColumnBefore:"Insert column before",insertColumnAfter:"Insert column after",deleteColumn:"Delete column",fixedColumnWidth:"Fixed column width",resize100:"Resize 100%",resize75:"Resize 75%",resize50:"Resize 50%",resize25:"Resize 25%",autoSize:"Auto size",mirrorHorizontal:"Mirror, Horizontal",mirrorVertical:"Mirror, Vertical",rotateLeft:"Rotate left",rotateRight:"Rotate right",maxSize:"Max size",minSize:"Min size",tableHeader:"Table header",mergeCells:"Merge cells",splitCells:"Split Cells",HorizontalSplit:"Horizontal split",VerticalSplit:"Vertical split"},menu:{spaced:"Spaced",bordered:"Bordered",neon:"Neon",translucent:"Translucent",shadow:"Shadow",code:"Code"}};return void 0===t&&(e.SUNEDITOR_LANG||Object.defineProperty(e,"SUNEDITOR_LANG",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_LANG,"en",{enumerable:!0,writable:!0,configurable:!0,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_LANG a window with a document");return l(e)}:l(i)},WUQj:function(e,t,n){},XJR1:function(e,t,n){"use strict";n.r(t);n("3FqI"),n("WUQj");var i={name:"colorPicker",add:function(e){const t=e.context;t.colorPicker={colorListHTML:"",_colorInput:"",_defaultColor:"#000",_styleProperty:"color",_currentColor:"",_colorList:[]};let n=this.createColorList(e,this._makeColorList);t.colorPicker.colorListHTML=n,n=null},createColorList:function(e,t){const n=e.options,i=e.lang,l=n.colorList&&0!==n.colorList.length?n.colorList:["#ff0000","#ff5e00","#ffe400","#abf200","#00d8ff","#0055ff","#6600ff","#ff00dd","#000000","#ffd8d8","#fae0d4","#faf4c0","#e4f7ba","#d4f4fa","#d9e5ff","#e8d9ff","#ffd9fa","#f1f1f1","#ffa7a7","#ffc19e","#faed7d","#cef279","#b2ebf4","#b2ccff","#d1b2ff","#ffb2f5","#bdbdbd","#f15f5f","#f29661","#e5d85c","#bce55c","#5cd1e5","#6699ff","#a366ff","#f261df","#8c8c8c","#980000","#993800","#998a00","#6b9900","#008299","#003399","#3d0099","#990085","#353535","#670000","#662500","#665c00","#476600","#005766","#002266","#290066","#660058","#222222"];let o=[],s='<div class="se-list-inner">';for(let e,n=0,i=l.length;n<i;n++)e=l[n],e&&("string"==typeof e&&(o.push(e),n<i-1)||(o.length>0&&(s+='<div class="se-selector-color">'+t(o)+"</div>",o=[]),"object"==typeof e&&(s+='<div class="se-selector-color">'+t(e)+"</div>")));return s+='<form class="se-form-group"><input type="text" maxlength="9" class="_se_color_picker_input se-color-input"/><button type="submit" class="se-btn-primary _se_color_picker_submit" title="'+i.dialogBox.submitButton+'">'+e.icons.checked+'</button><button type="button" class="se-btn _se_color_picker_remove" title="'+i.toolbar.removeFormat+'">'+e.icons.erase+"</button></form></div>",s},_makeColorList:function(e){let t="";t+='<ul class="se-color-pallet">';for(let n,i=0,l=e.length;i<l;i++)n=e[i],"string"==typeof n&&(t+='<li><button type="button" data-value="'+n+'" title="'+n+'" style="background-color:'+n+';"></button></li>');return t+="</ul>",t},init:function(e,t){const n=this.plugins.colorPicker;let i=t||(n.getColorInNode.call(this,e)||this.context.colorPicker._defaultColor);i=n.isHexColor(i)?i:n.rgb2hex(i)||i;const l=this.context.colorPicker._colorList;if(l)for(let e=0,t=l.length;e<t;e++)i.toLowerCase()===l[e].getAttribute("data-value").toLowerCase()?this.util.addClass(l[e],"active"):this.util.removeClass(l[e],"active");n.setInputText.call(this,n.colorName2hex.call(this,i))},setCurrentColor:function(e){this.context.colorPicker._currentColor=e,this.context.colorPicker._colorInput.style.borderColor=e},setInputText:function(e){e=/^#/.test(e)?e:"#"+e,this.context.colorPicker._colorInput.value=e,this.plugins.colorPicker.setCurrentColor.call(this,e)},getColorInNode:function(e){let t="";const n=this.context.colorPicker._styleProperty;for(;e&&!this.util.isWysiwygDiv(e)&&0===t.length;)1===e.nodeType&&e.style[n]&&(t=e.style[n]),e=e.parentNode;return t},isHexColor:function(e){return/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(e)},rgb2hex:function(e){const t=e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);return t&&4===t.length?"#"+("0"+parseInt(t[1],10).toString(16)).slice(-2)+("0"+parseInt(t[2],10).toString(16)).slice(-2)+("0"+parseInt(t[3],10).toString(16)).slice(-2):""},colorName2hex:function(e){if(/^#/.test(e))return e;var t=this.util.createElement("div");t.style.display="none",t.style.color=e;var n=this._w.getComputedStyle(this._d.body.appendChild(t)).color.match(/\d+/g).map((function(e){return parseInt(e,10)}));return this.util.removeItem(t),n.length>=3&&"#"+((1<<24)+(n[0]<<16)+(n[1]<<8)+n[2]).toString(16).substr(1)}},l={name:"fontColor",display:"submenu",add:function(e,t){e.addModule([i]);const n=e.context;n.fontColor={previewEl:null,colorInput:null,colorList:null};let l=this.setSubmenu(e);n.fontColor.colorInput=l.querySelector("._se_color_picker_input"),n.fontColor.colorInput.addEventListener("keyup",this.onChangeInput.bind(e)),l.querySelector("._se_color_picker_submit").addEventListener("click",this.submit.bind(e)),l.querySelector("._se_color_picker_remove").addEventListener("click",this.remove.bind(e)),l.addEventListener("click",this.pickup.bind(e)),n.fontColor.colorList=l.querySelectorAll("li button"),e.initMenuTarget(this.name,t,l),l=null},setSubmenu:function(e){const t=e.context.colorPicker.colorListHTML,n=e.util.createElement("DIV");return n.className="se-submenu se-list-layer",n.innerHTML=t,n},on:function(){const e=this.context.colorPicker,t=this.context.fontColor;e._colorInput=t.colorInput,e._defaultColor="#333333",e._styleProperty="color",e._colorList=t.colorList,this.plugins.colorPicker.init.call(this,this.getSelectionNode(),null)},onChangeInput:function(e){this.plugins.colorPicker.setCurrentColor.call(this,e.target.value)},submit:function(){this.plugins.fontColor.applyColor.call(this,this.context.colorPicker._currentColor)},pickup:function(e){e.preventDefault(),e.stopPropagation(),this.plugins.fontColor.applyColor.call(this,e.target.getAttribute("data-value"))},remove:function(){this.nodeChange(null,["color"],["span"],!0),this.submenuOff()},applyColor:function(e){if(!e)return;const t=this.util.createElement("SPAN");t.style.color=e,this.nodeChange(t,["color"],null,null),this.submenuOff()}},o={name:"hiliteColor",display:"submenu",add:function(e,t){e.addModule([i]);const n=e.context;n.hiliteColor={previewEl:null,colorInput:null,colorList:null};let l=this.setSubmenu(e);n.hiliteColor.colorInput=l.querySelector("._se_color_picker_input"),n.hiliteColor.colorInput.addEventListener("keyup",this.onChangeInput.bind(e)),l.querySelector("._se_color_picker_submit").addEventListener("click",this.submit.bind(e)),l.querySelector("._se_color_picker_remove").addEventListener("click",this.remove.bind(e)),l.addEventListener("click",this.pickup.bind(e)),n.hiliteColor.colorList=l.querySelectorAll("li button"),e.initMenuTarget(this.name,t,l),l=null},setSubmenu:function(e){const t=e.context.colorPicker.colorListHTML,n=e.util.createElement("DIV");return n.className="se-submenu se-list-layer",n.innerHTML=t,n},on:function(){const e=this.context.colorPicker,t=this.context.hiliteColor;e._colorInput=t.colorInput,e._defaultColor="#FFFFFF",e._styleProperty="backgroundColor",e._colorList=t.colorList,this.plugins.colorPicker.init.call(this,this.getSelectionNode(),null)},onChangeInput:function(e){this.plugins.colorPicker.setCurrentColor.call(this,e.target.value)},submit:function(){this.plugins.hiliteColor.applyColor.call(this,this.context.colorPicker._currentColor)},pickup:function(e){e.preventDefault(),e.stopPropagation(),this.plugins.hiliteColor.applyColor.call(this,e.target.getAttribute("data-value"))},remove:function(){this.nodeChange(null,["background-color"],["span"],!0),this.submenuOff()},applyColor:function(e){if(!e)return;const t=this.util.createElement("SPAN");t.style.backgroundColor=e,this.nodeChange(t,["background-color"],null,null),this.submenuOff()}},s={name:"template",display:"submenu",add:function(e,t){e.context.template={};let n=this.setSubmenu(e);n.querySelector("ul").addEventListener("click",this.pickup.bind(e)),e.initMenuTarget(this.name,t,n),n=null},setSubmenu:function(e){const t=e.options.templates;if(!t||0===t.length)throw Error('[SUNEDITOR.plugins.template.fail] To use the "template" plugin, please define the "templates" option.');const n=e.util.createElement("DIV");n.className="se-list-layer";let i='<div class="se-submenu se-list-inner"><ul class="se-list-basic">';for(let e,n=0,l=t.length;n<l;n++)e=t[n],i+='<li><button type="button" class="se-btn-list" data-value="'+n+'" title="'+e.name+'">'+e.name+"</button></li>";return i+="</ul></div>",n.innerHTML=i,n},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=this.options.templates[e.target.getAttribute("data-value")];if(!t.html)throw this.submenuOff(),Error('[SUNEDITOR.template.fail] cause : "templates[i].html not found"');this.setContents(t.html),this.submenuOff()}},a=n("1kvd"),r=n.n(a),c={name:"link",display:"dialog",add:function(e){e.addModule([r.a]);const t=e.context;t.link={focusElement:null,linkNewWindowCheck:null,linkAnchorText:null,_linkAnchor:null,_linkValue:""};let n=this.setDialog(e);t.link.modal=n,t.link.focusElement=n.querySelector("._se_link_url"),t.link.linkAnchorText=n.querySelector("._se_link_text"),t.link.linkNewWindowCheck=n.querySelector("._se_link_check"),t.link.preview=n.querySelector(".se-link-preview"),t.link.bookmark=n.querySelector(".se-link-bookmark"),t.link.bookmarkButton=n.querySelector("._se_bookmark_button"),t.link.rel=e.options.linkRel.length>0?n.querySelector(".se-link-rel"):null;let i=this.setController_LinkButton(e);t.link.linkController=i,t.link._linkAnchor=null,n.querySelector("form").addEventListener("submit",this.submit.bind(e)),i.addEventListener("click",this.onClick_linkController.bind(e)),t.link.focusElement.addEventListener("input",this._onLinkPreview.bind(e,t.link.preview,t.link,e.options.linkProtocol)),t.link.bookmarkButton.addEventListener("click",this.onClick_bookmarkButton.bind(e)),t.dialog.modal.appendChild(n),t.element.relative.appendChild(i),n=null,i=null},setDialog:function(e){const t=e.lang,n=e.util.createElement("DIV"),i=e.options.linkRel;n.className="se-dialog-content",n.style.display="none";let l='<form class="editor_link"><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="'+t.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-modal-title">'+t.dialogBox.linkBox.title+'</span></div><div class="se-dialog-body"><div class="se-dialog-form"><label>'+t.dialogBox.linkBox.url+'</label><div class="se-dialog-form-files"><input class="se-input-form se-input-url _se_link_url" type="text" placeholder="'+(e.options.protocol||"")+'" /><button type="button" class="se-btn se-dialog-files-edge-button _se_bookmark_button" title="'+t.dialogBox.linkBox.bookmark+'">'+e.icons.bookmark+'</button></div></div><div style="width: 100%; display: flex;"><span class="se-svg se-link-bookmark" style="flex: unset; display: none;">'+e.icons.bookmark+'</span><pre class="se-link-preview" style="flex: auto;"></pre></div><div class="se-dialog-form"><label>'+t.dialogBox.linkBox.text+'</label><input class="se-input-form _se_link_text" type="text" /></div><div class="se-dialog-form-footer"><label><input type="checkbox" class="se-dialog-btn-check _se_link_check" />&nbsp;'+t.dialogBox.linkBox.newWindowCheck+'</label></div></div><div class="se-dialog-footer">';if(i.length>0){l+='<select class="se-input-select se-link-rel" title="rel">';for(let e=0,t=i.length;e<t;e++)l+='<option value="'+i[e]+'">'+i[e]+"</option>";l+="</select>"}return l+='<button type="submit" class="se-btn-primary" title="'+t.dialogBox.submitButton+'"><span>'+t.dialogBox.submitButton+"</span></button></div></form>",n.innerHTML=l,n},setController_LinkButton:function(e){const t=e.lang,n=e.icons,i=e.util.createElement("DIV");return i.className="se-controller se-controller-link",i.innerHTML='<div class="se-arrow se-arrow-up"></div><div class="link-content"><span><a target="_blank" href=""></a>&nbsp;</span><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">'+n.edit+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.edit+'</span></span></button><button type="button" data-command="unlink" tabindex="-1" class="se-btn se-tooltip">'+n.unlink+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.unlink+'</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">'+n.delete+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.remove+"</span></span></button></div></div>",i},open:function(){this.plugins.dialog.open.call(this,"link","link"===this.currentControllerName)},_onLinkPreview:function(e,t,n,i){const l="string"==typeof i?i:i.target.value.trim(),o=-1===l.indexOf("://")&&0!==l.indexOf("#");t._linkValue=e.textContent=l?n&&o?n+l:o?"/"+l:l:"",0===l.indexOf("#")?(t.bookmark.style.display="block",this.util.addClass(t.bookmarkButton,"active")):(t.bookmark.style.display="none",this.util.removeClass(t.bookmarkButton,"active"))},_updateAnchor:function(e,t,n,i,l){/^\#/.test(t)?e.id=t.substr(1):e.removeAttribute("id"),e.href=t,e.textContent=n,i.checked?e.target="_blank":e.removeAttribute("target"),l?e.rel=l.options[l.selectedIndex].value:e.id?e.rel="bookmark":e.removeAttribute("rel")},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation();const t=function(){const e=this.context.link;if(0===e._linkValue.length)return!1;const t=e._linkValue,n=e.linkAnchorText,i=0===n.value.length?t:n.value;if(this.context.dialog.updateModal){this.plugins.link._updateAnchor(e._linkAnchor,t,i,e.linkNewWindowCheck,e.rel);const n=e._linkAnchor.childNodes[0];this.setRange(n,0,n,n.textContent.length)}else{const n=this.util.createElement("A");this.plugins.link._updateAnchor(n,t,i,e.linkNewWindowCheck,e.rel);const l=this.getSelectedElements();if(l.length>1){const e=this.util.createElement(l[0].nodeName);if(e.appendChild(n),!this.insertNode(e,null,!0))return}else if(!this.insertNode(n,null,!0))return;this.setRange(n.childNodes[0],0,n.childNodes[0],n.textContent.length)}e._linkValue=e.preview.textContent=e.focusElement.value=e.linkAnchorText.value=""}.bind(this);try{t()}finally{this.plugins.dialog.close.call(this),this.closeLoading(),this.history.push(!1)}return!1},active:function(e){if(e){if(this.util.isAnchor(e)&&null===e.getAttribute("data-image-link"))return this.controllerArray.indexOf(this.context.link.linkController)<0&&this.plugins.link.call_controller.call(this,e),!0}else this.controllerArray.indexOf(this.context.link.linkController)>-1&&this.controllersOff();return!1},on:function(e){const t=this.context.link;e?t._linkAnchor&&(this.context.dialog.updateModal=!0,t._linkValue=t.preview.textContent=t.focusElement.value=t._linkAnchor.id?"#"+t._linkAnchor.id:t._linkAnchor.href,t.linkAnchorText.value=t._linkAnchor.textContent,t.linkNewWindowCheck.checked=!!/_blank/i.test(t._linkAnchor.target),t.rel&&(t.rel.value=t._linkAnchor.rel)):(this.plugins.link.init.call(this),t.linkAnchorText.value=this.getSelection().toString()),this.plugins.link._onLinkPreview.call(this,t.preview,t,this.options.linkProtocol,t._linkValue)},call_controller:function(e){this.editLink=this.context.link._linkAnchor=e;const t=this.context.link.linkController,n=t.querySelector("a");n.href=e.href,n.title=e.textContent,n.textContent=e.textContent,this.util.addClass(e,"on"),this.setControllerPosition(t,e,"bottom",{left:0,top:0}),this.controllersOn(t,e,"link",this.util.removeClass.bind(this.util,this.context.link._linkAnchor,"on"))},onClick_bookmarkButton:function(){const e=this.context.link;let t=e.focusElement.value;/^\#/.test(t)?(t=t.substr(1),e.bookmark.style.display="none",this.util.removeClass(e.bookmarkButton,"active")):(t="#"+t,e.bookmark.style.display="block",this.util.addClass(e.bookmarkButton,"active")),e._linkValue=e.preview.textContent=e.focusElement.value=t,e.focusElement.focus()},onClick_linkController:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command")||e.target.parentNode.getAttribute("data-command");if(t){if(e.preventDefault(),/update/.test(t)){const e=this.context.link;e._linkValue=e.preview.textContent=e.focusElement.value=e._linkAnchor.href,e.linkAnchorText.value=e._linkAnchor.textContent,e.linkNewWindowCheck.checked=!!/_blank/i.test(e._linkAnchor.target),e.rel&&(e.rel.value=e._linkAnchor.rel),this.plugins.dialog.open.call(this,"link",!0)}else if(/unlink/.test(t)){const e=this.util.getChildElement(this.context.link._linkAnchor,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!1),t=this.util.getChildElement(this.context.link._linkAnchor,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!0);this.setRange(e,0,t,t.textContent.length),this.nodeChange(null,null,["A"],!1)}else this.util.removeItem(this.context.link._linkAnchor),this.context.link._linkAnchor=null,this.focus(),this.history.push(!1);this.controllersOff()}},init:function(){const e=this.context.link;e.linkController.style.display="none",e._linkAnchor=null,e._linkValue=e.preview.textContent=e.focusElement.value="",e.linkAnchorText.value="",e.linkNewWindowCheck.checked=!1,e.rel&&(e.rel.value=e.rel.options[0].value)}},d=n("ZED3"),u=n.n(d),h=n("ee5k"),g=n.n(h),p=n("gjS+"),m=n.n(p),f={name:"image",display:"dialog",add:function(e){e.addModule([r.a,u.a,g.a,m.a]);const t=e.options,n=e.context,i=n.image={_infoList:[],_infoIndex:0,_uploadFileLength:0,focusElement:null,sizeUnit:t._imageSizeUnit,_altText:"",_linkElement:null,_align:"none",_floatClassRegExp:"__se__float\\-[a-z]+",_v_link:{_linkValue:""},_v_src:{_linkValue:""},svgDefaultSize:"30%",base64RenderIndex:0,_element:null,_cover:null,_container:null,inputX:null,inputY:null,_element_w:1,_element_h:1,_element_l:0,_element_t:0,_defaultSizeX:"auto",_defaultSizeY:"auto",_origin_w:"auto"===t.imageWidth?"":t.imageWidth,_origin_h:"auto"===t.imageHeight?"":t.imageHeight,_proportionChecked:!0,_resizing:t.imageResizing,_resizeDotHide:!t.imageHeightShow,_rotation:t.imageRotation,_onlyPercentage:t.imageSizeOnlyPercentage,_ratio:!1,_ratioX:1,_ratioY:1,_captionShow:!0,_captionChecked:!1,_caption:null,captionCheckEl:null};let l=this.setDialog(e);i.modal=l,i.imgInputFile=l.querySelector("._se_image_file"),i.imgUrlFile=l.querySelector("._se_image_url"),i.focusElement=i.imgInputFile||i.imgUrlFile,i.altText=l.querySelector("._se_image_alt"),i.imgLink=l.querySelector("._se_image_link"),i.imgLinkNewWindowCheck=l.querySelector("._se_image_link_check"),i.captionCheckEl=l.querySelector("._se_image_check_caption"),i.previewLink=l.querySelector("._se_tab_content_url .se-link-preview"),i.previewSrc=l.querySelector("._se_tab_content_image .se-link-preview"),l.querySelector(".se-dialog-tabs").addEventListener("click",this.openTab.bind(e)),l.querySelector("form").addEventListener("submit",this.submit.bind(e)),i.imgInputFile&&l.querySelector(".se-file-remove").addEventListener("click",this._removeSelectedFiles.bind(i.imgInputFile,i.imgUrlFile,i.previewSrc)),i.imgInputFile&&i.imgUrlFile&&i.imgInputFile.addEventListener("change",this._fileInputChange.bind(i)),i.imgLink.addEventListener("input",this._onLinkPreview.bind(i.previewLink,i._v_link,t.linkProtocol)),i.imgUrlFile&&i.imgUrlFile.addEventListener("input",this._onLinkPreview.bind(i.previewSrc,i._v_src,t.linkProtocol));const o=l.querySelector(".__se__gallery");o&&o.addEventListener("click",this._openGallery.bind(e)),i.proportion={},i.inputX={},i.inputY={},t.imageResizing&&(i.proportion=l.querySelector("._se_image_check_proportion"),i.inputX=l.querySelector("._se_image_size_x"),i.inputY=l.querySelector("._se_image_size_y"),i.inputX.value=t.imageWidth,i.inputY.value=t.imageHeight,i.inputX.addEventListener("keyup",this.setInputSize.bind(e,"x")),i.inputY.addEventListener("keyup",this.setInputSize.bind(e,"y")),i.inputX.addEventListener("change",this.setRatio.bind(e)),i.inputY.addEventListener("change",this.setRatio.bind(e)),i.proportion.addEventListener("change",this.setRatio.bind(e)),l.querySelector(".se-dialog-btn-revert").addEventListener("click",this.sizeRevert.bind(e))),n.dialog.modal.appendChild(l),l=null},setDialog:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");i.className="se-dialog-content se-dialog-image",i.style.display="none";let l='<div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" class="close" aria-label="Close" title="'+n.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-modal-title">'+n.dialogBox.imageBox.title+'</span></div><div class="se-dialog-tabs"><button type="button" class="_se_tab_link active" data-tab-link="image">'+n.toolbar.image+'</button><button type="button" class="_se_tab_link" data-tab-link="url">'+n.toolbar.link+'</button></div><form method="post" enctype="multipart/form-data"><div class="_se_tab_content _se_tab_content_image"><div class="se-dialog-body"><div style="border-bottom: 1px dashed #ccc;">';if(t.imageFileInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.imageBox.file+'</label><div class="se-dialog-form-files"><input class="se-input-form _se_image_file" type="file" accept="'+t.imageAccept+'"'+(t.imageMultipleFile?' multiple="multiple"':"")+'/><button type="button" class="se-btn se-dialog-files-edge-button se-file-remove" title="'+n.controller.remove+'">'+e.icons.cancel+"</button></div></div>"),t.imageUrlInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.imageBox.url+'</label><div class="se-dialog-form-files"><input class="se-input-form se-input-url _se_image_url" type="text" />'+(t.imageGalleryUrl&&e.plugins.imageGallery?'<button type="button" class="se-btn se-dialog-files-edge-button __se__gallery" title="'+n.toolbar.imageGallery+'">'+e.icons.image_gallery+"</button>":"")+'</div><pre class="se-link-preview"></pre></div>'),l+='</div><div class="se-dialog-form"><label>'+n.dialogBox.imageBox.altText+'</label><input class="se-input-form _se_image_alt" type="text" /></div>',t.imageResizing){const i=t.imageSizeOnlyPercentage,o=i?' style="display: none !important;"':"",s=t.imageHeightShow?"":' style="display: none !important;"';l+='<div class="se-dialog-form">',i||!t.imageHeightShow?l+='<div class="se-dialog-size-text"><label class="size-w">'+n.dialogBox.size+"</label></div>":l+='<div class="se-dialog-size-text"><label class="size-w">'+n.dialogBox.width+'</label><label class="se-dialog-size-x">&nbsp;</label><label class="size-h">'+n.dialogBox.height+"</label></div>",l+='<input class="se-input-control _se_image_size_x" placeholder="auto"'+(i?' type="number" min="1"':'type="text"')+(i?' max="100"':"")+' /><label class="se-dialog-size-x"'+s+">"+(i?"%":"x")+'</label><input type="text" class="se-input-control _se_image_size_y" placeholder="auto"'+o+(i?' max="100"':"")+s+"/><label"+o+s+'><input type="checkbox" class="se-dialog-btn-check _se_image_check_proportion" checked/>&nbsp;'+n.dialogBox.proportion+'</label><button type="button" title="'+n.dialogBox.revertButton+'" class="se-btn se-dialog-btn-revert" style="float: right;">'+e.icons.revert+"</button></div>"}return l+='<div class="se-dialog-form se-dialog-form-footer"><label><input type="checkbox" class="se-dialog-btn-check _se_image_check_caption" />&nbsp;'+n.dialogBox.caption+'</label></div></div></div><div class="_se_tab_content _se_tab_content_url" style="display: none"><div class="se-dialog-body"><div class="se-dialog-form"><label>'+n.dialogBox.linkBox.url+'</label><input class="se-input-form se-input-url _se_image_link" type="text" /><pre class="se-link-preview"></pre></div><label><input type="checkbox" class="_se_image_link_check"/>&nbsp;'+n.dialogBox.linkBox.newWindowCheck+'</label></div></div><div class="se-dialog-footer"><div><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="none" checked>'+n.dialogBox.basic+'</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="left">'+n.dialogBox.left+'</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="center">'+n.dialogBox.center+'</label><label><input type="radio" name="suneditor_image_radio" class="se-dialog-btn-radio" value="right">'+n.dialogBox.right+'</label></div><button type="submit" class="se-btn-primary" title="'+n.dialogBox.submitButton+'"><span>'+n.dialogBox.submitButton+"</span></button></div></form>",i.innerHTML=l,i},_fileInputChange:function(){this.imgInputFile.value?(this.imgUrlFile.setAttribute("disabled",!0),this.previewSrc.style.textDecoration="line-through"):(this.imgUrlFile.removeAttribute("disabled"),this.previewSrc.style.textDecoration="")},_removeSelectedFiles:function(e,t){this.value="",e&&(e.removeAttribute("disabled"),t.style.textDecoration="")},_openGallery:function(){this.callPlugin("imageGallery",this.plugins.imageGallery.open.bind(this,this.plugins.image._setUrlInput.bind(this.context.image)),null)},_setUrlInput:function(e){this.altText.value=e.alt,this._v_src._linkValue=this.previewSrc.textContent=this.imgUrlFile.value=e.src,this.imgUrlFile.focus()},_onLinkPreview:function(e,t,n){const i=n.target.value.trim();e._linkValue=this.textContent=i?t&&-1===i.indexOf("://")&&0!==i.indexOf("#")?t+i:-1===i.indexOf("://")?"/"+i:i:""},fileTags:["img"],select:function(e){this.plugins.image.onModifyMode.call(this,e,this.plugins.resizing.call_controller_resize.call(this,e,"image"))},destroy:function(e){const t=e||this.context.image._element,n=this.util.getParentElement(t,this.util.isMediaComponent)||t,i=1*t.getAttribute("data-index");let l=n.previousElementSibling||n.nextElementSibling;const o=n.parentNode;this.util.removeItem(n),this.plugins.image.init.call(this),this.controllersOff(),o!==this.context.element.wysiwyg&&this.util.removeItemAllParents(o,(function(e){return 0===e.childNodes.length}),null),this.focusEdge(l),this.plugins.fileManager.deleteInfo.call(this,"image",i,this.functions.onImageUpload),this.history.push(!1)},on:function(e){const t=this.context.image;e?t.imgInputFile&&this.options.imageMultipleFile&&t.imgInputFile.removeAttribute("multiple"):(t.inputX.value=t._origin_w=this.options.imageWidth===t._defaultSizeX?"":this.options.imageWidth,t.inputY.value=t._origin_h=this.options.imageHeight===t._defaultSizeY?"":this.options.imageHeight,t.imgInputFile&&this.options.imageMultipleFile&&t.imgInputFile.setAttribute("multiple","multiple"))},open:function(){this.plugins.dialog.open.call(this,"image","image"===this.currentControllerName)},openTab:function(e){const t=this.context.image.modal,n="init"===e?t.querySelector("._se_tab_link"):e.target;if(!/^BUTTON$/i.test(n.tagName))return!1;const i=n.getAttribute("data-tab-link");let l,o,s;for(o=t.getElementsByClassName("_se_tab_content"),l=0;l<o.length;l++)o[l].style.display="none";for(s=t.getElementsByClassName("_se_tab_link"),l=0;l<s.length;l++)this.util.removeClass(s[l],"active");return t.querySelector("._se_tab_content_"+i).style.display="block",this.util.addClass(n,"active"),"image"===i&&this.context.image.focusElement?this.context.image.focusElement.focus():"url"===i&&this.context.image.imgLink&&this.context.image.imgLink.focus(),!1},submit:function(e){const t=this.context.image,n=this.plugins.image;e.preventDefault(),e.stopPropagation(),t._altText=t.altText.value,t._align=t.modal.querySelector('input[name="suneditor_image_radio"]:checked').value,t._captionChecked=t.captionCheckEl.checked,t._resizing&&(t._proportionChecked=t.proportion.checked);try{this.context.dialog.updateModal&&n.update_image.call(this,!1,!0,!1),t.imgInputFile&&t.imgInputFile.files.length>0?(this.showLoading(),n.submitAction.call(this,this.context.image.imgInputFile.files)):t.imgUrlFile&&t._v_src._linkValue.length>0&&(this.showLoading(),n.onRender_imgUrl.call(this))}catch(e){throw this.closeLoading(),Error('[SUNEDITOR.image.submit.fail] cause : "'+e.message+'"')}finally{this.plugins.dialog.close.call(this)}return!1},submitAction:function(e){if(0===e.length)return;let t=0,n=[];for(let i=0,l=e.length;i<l;i++)/image/i.test(e[i].type)&&(n.push(e[i]),t+=e[i].size);const i=this.options.imageUploadSizeLimit;if(i>0){let e=0;const n=this.context.image._infoList;for(let t=0,i=n.length;t<i;t++)e+=1*n[t].size;if(t+e>i){this.closeLoading();const n="[SUNEDITOR.imageUpload.fail] Size of uploadable total images: "+i/1e3+"KB";return void(("function"!==this.functions.onImageUploadError||this.functions.onImageUploadError(n,{limitSize:i,currentSize:e,uploadSize:t},this))&&this.functions.noticeOpen(n))}}const l=this.context.image;l._uploadFileLength=n.length;const o={linkValue:l._v_link._linkValue,linkNewWindow:l.imgLinkNewWindowCheck.checked,inputWidth:l.inputX.value,inputHeight:l.inputY.value,align:l._align,isUpdate:this.context.dialog.updateModal,element:l._element};if("function"==typeof this.functions.onImageUploadBefore){const e=this.functions.onImageUploadBefore(n,o,this,function(e){e&&this._w.Array.isArray(e.result)?this.plugins.image.register.call(this,o,e):this.plugins.image.upload.call(this,o,e)}.bind(this));if(void 0===e)return;if(!e)return void this.closeLoading();this._w.Array.isArray(e)&&e.length>0&&(n=e)}this.plugins.image.upload.call(this,o,n)},error:function(e,t){if(this.closeLoading(),"function"!=typeof this.functions.onImageUploadError||this.functions.onImageUploadError(e,t,this))throw this.functions.noticeOpen(e),Error("[SUNEDITOR.plugin.image.error] response: "+e)},upload:function(e,t){if(!t)return void this.closeLoading();if("string"==typeof t)return void this.plugins.image.error.call(this,t,null);const n=this.options.imageUploadUrl,i=this.context.dialog.updateModal?1:t.length;if("string"==typeof n&&n.length>0){const l=new FormData;for(let e=0;e<i;e++)l.append("file-"+e,t[e]);this.plugins.fileManager.upload.call(this,n,this.options.imageUploadHeader,l,this.plugins.image.callBack_imgUpload.bind(this,e),this.functions.onImageUploadError)}else this.plugins.image.setup_reader.call(this,t,e.linkValue,e.linkNewWindow,e.inputWidth,e.inputHeight,e.align,i,e.isUpdate)},callBack_imgUpload:function(e,t){if("function"==typeof this.functions.imageUploadHandler)this.functions.imageUploadHandler(t,e,this);else{const n=JSON.parse(t.responseText);n.errorMessage?this.plugins.image.error.call(this,n.errorMessage,n):this.plugins.image.register.call(this,e,n)}},register:function(e,t){const n=t.result;for(let t,i=0,l=n.length;i<l;i++){if(t={name:n[i].name,size:n[i].size},e.isUpdate){this.plugins.image.update_src.call(this,n[i].url,e.element,t);break}this.plugins.image.create_image.call(this,n[i].url,e.linkValue,e.linkNewWindow,e.inputWidth,e.inputHeight,e.align,t)}this.closeLoading()},setup_reader:function(e,t,n,i,l,o,s,a){try{this.context.image.base64RenderIndex=s;const r=this._w.FileReader,c=[s];this.context.image.inputX.value=i,this.context.image.inputY.value=l;for(let d,u,h=0;h<s;h++)d=new r,u=e[h],d.onload=function(e,s,a,r,d){c[d]={result:e.result,file:r},0==--this.context.image.base64RenderIndex&&(this.plugins.image.onRender_imgBase64.call(this,s,c,a,t,n,i,l,o),this.closeLoading())}.bind(this,d,a,this.context.image._element,u,h),d.readAsDataURL(u)}catch(e){throw this.closeLoading(),Error('[SUNEDITOR.image.setup_reader.fail] cause : "'+e.message+'"')}},onRender_imgBase64:function(e,t,n,i,l,o,s,a){const r=this.plugins.image.update_src,c=this.plugins.image.create_image;for(let d=0,u=t.length;d<u;d++)e?(this.context.image._element.setAttribute("data-file-name",t[d].file.name),this.context.image._element.setAttribute("data-file-size",t[d].file.size),r.call(this,t[d].result,n,t[d].file)):c.call(this,t[d].result,i,l,o,s,a,t[d].file)},onRender_imgUrl:function(){const e=this.context.image;if(0===e._v_src._linkValue.length)return!1;try{const t={name:e._v_src._linkValue.split("/").pop(),size:0};this.context.dialog.updateModal?this.plugins.image.update_src.call(this,e._v_src._linkValue,e._element,t):this.plugins.image.create_image.call(this,e._v_src._linkValue,e._v_link._linkValue,e.imgLinkNewWindowCheck.checked,e.inputX.value,e.inputY.value,e._align,t)}catch(e){throw Error('[SUNEDITOR.image.URLRendering.fail] cause : "'+e.message+'"')}finally{this.closeLoading()}},onRender_link:function(e,t,n){if(t.trim().length>0){const i=this.util.createElement("A");return i.href=/^https?:\/\//.test(t)?t:"http://"+t,i.target=n?"_blank":"",i.setAttribute("data-image-link","image"),e.setAttribute("data-image-link",t),i.appendChild(e),i}return e},setInputSize:function(e,t){t&&32===t.keyCode?t.preventDefault():this.plugins.resizing._module_setInputSize.call(this,this.context.image,e)},setRatio:function(){this.plugins.resizing._module_setRatio.call(this,this.context.image)},checkFileInfo:function(){const e=this.plugins.image,t=function(t){e.onModifyMode.call(this,t,null),e.openModify.call(this,!0),e.update_image.call(this,!0,!1,!0)}.bind(this);this.plugins.fileManager.checkInfo.call(this,"image",["img"],this.functions.onImageUpload,t,!0)},resetFileInfo:function(){this.plugins.fileManager.resetInfo.call(this,"image",this.functions.onImageUpload)},create_image:function(e,t,n,i,l,o,s){const a=this.plugins.image,r=this.context.image;this.context.resizing._resize_plugin="image";let c=this.util.createElement("IMG");c.src=e,c.alt=r._altText,c=a.onRender_link.call(this,c,t,n),c.setAttribute("data-rotate","0"),r._resizing&&c.setAttribute("data-proportion",r._proportionChecked);const d=this.plugins.component.set_cover.call(this,c),u=this.plugins.component.set_container.call(this,d,"se-image-container");r._captionChecked&&(r._caption=this.plugins.component.create_caption.call(this),r._caption.setAttribute("contenteditable",!1),d.appendChild(r._caption)),r._element=c,r._cover=d,r._container=u,a.applySize.call(this,i,l),a.setAlign.call(this,o,c,d,u),c.onload=a._image_create_onload.bind(this,c,r.svgDefaultSize),this.insertComponent(u,!0,!0,!0)&&this.plugins.fileManager.setInfo.call(this,"image",c,this.functions.onImageUpload,s,!0),this.context.resizing._resize_plugin=""},_image_create_onload:function(e,t){0===e.offsetWidth&&this.plugins.image.applySize.call(this,t,""),this.selectComponent.call(this,e,"image")},update_image:function(e,t,n){const i=this.context.image,l=i._v_link._linkValue;let o,s=i._element,a=i._cover,r=i._container,c=!1;null===a&&(c=!0,s=i._element.cloneNode(!0),a=this.plugins.component.set_cover.call(this,s)),null===r?(a=a.cloneNode(!0),s=a.querySelector("img"),c=!0,r=this.plugins.component.set_container.call(this,a,"se-image-container")):c&&(r.innerHTML="",r.appendChild(a),i._cover=a,i._element=s,c=!1);const d=this.util.isNumber(i.inputX.value)?i.inputX.value+i.sizeUnit:i.inputX.value,u=this.util.isNumber(i.inputY.value)?i.inputY.value+i.sizeUnit:i.inputY.value;o=/%$/.test(s.style.width)?d!==r.style.width||u!==r.style.height:d!==s.style.width||u!==s.style.height,s.alt=i._altText;let h=!1;if(i._captionChecked?i._caption||(i._caption=this.plugins.component.create_caption.call(this),a.appendChild(i._caption),h=!0):i._caption&&(this.util.removeItem(i._caption),i._caption=null,h=!0),l.trim().length>0)if(null!==i._linkElement&&a.contains(i._linkElement))i._linkElement.href=l,i._linkElement.target=i.imgLinkNewWindowCheck.checked?"_blank":"",s.setAttribute("data-image-link",l);else{let e=this.plugins.image.onRender_link.call(this,s,l,this.context.image.imgLinkNewWindowCheck.checked);a.insertBefore(e,i._caption)}else if(null!==i._linkElement){const e=s;e.setAttribute("data-image-link","");let t=e.cloneNode(!0);a.removeChild(i._linkElement),a.insertBefore(t,i._caption),s=t}if(c){const e=this.util.isRangeFormatElement(i._element.parentNode)||this.util.isWysiwygDiv(i._element.parentNode)?i._element:/^A$/i.test(i._element.parentNode.nodeName)?i._element.parentNode:this.util.getFormatElement(i._element)||i._element;this.util.isFormatElement(e)&&e.textContent.length>0?(e.parentNode.insertBefore(r,e.nextElementSibling),this.util.removeItem(i._element)):e.parentNode.replaceChild(r,e),s=r.querySelector("img"),i._element=s,i._cover=a,i._container=r}(h||!i._onlyPercentage&&o)&&!e&&(/\d+/.test(s.style.height)||this.context.resizing._rotateVertical&&i._captionChecked)&&(/%$/.test(i.inputX.value)||/%$/.test(i.inputY.value)?this.plugins.resizing.resetTransform.call(this,s):this.plugins.resizing.setTransformSize.call(this,s,this.util.getNumber(i.inputX.value,0),this.util.getNumber(i.inputY.value,0)));i._resizing&&(s.setAttribute("data-proportion",i._proportionChecked),o&&this.plugins.image.applySize.call(this)),this.plugins.image.setAlign.call(this,null,s,null,null),e&&this.plugins.fileManager.setInfo.call(this,"image",s,this.functions.onImageUpload,null,!0),t&&this.selectComponent(s,"image"),n||this.history.push(!1)},update_src:function(e,t,n){t.src=e,this._w.setTimeout(this.plugins.fileManager.setInfo.bind(this,"image",t,this.functions.onImageUpload,n,!0)),this.selectComponent(t,"image")},onModifyMode:function(e,t){if(!e)return;const n=this.context.image;n._linkElement=/^A$/i.test(e.parentNode.nodeName)?e.parentNode:null,n._element=e,n._cover=this.util.getParentElement(e,"FIGURE"),n._container=this.util.getParentElement(e,this.util.isMediaComponent),n._caption=this.util.getChildElement(n._cover,"FIGCAPTION"),n._align=e.style.float||e.getAttribute("data-align")||"none",e.style.float="",t&&(n._element_w=t.w,n._element_h=t.h,n._element_t=t.t,n._element_l=t.l);let i=n._element.getAttribute("data-size")||n._element.getAttribute("data-origin");i?(i=i.split(","),n._origin_w=i[0],n._origin_h=i[1]):t&&(n._origin_w=t.w,n._origin_h=t.h)},openModify:function(e){const t=this.context.image;t.imgUrlFile&&(t._v_src._linkValue=t.previewSrc.textContent=t.imgUrlFile.value=t._element.src),t._altText=t.altText.value=t._element.alt,t._v_link._linkValue=t.previewLink.textContent=t.imgLink.value=null===t._linkElement?"":t._linkElement.href,t.imgLinkNewWindowCheck.checked=t._linkElement&&"_blank"===t._linkElement.target,t.modal.querySelector('input[name="suneditor_image_radio"][value="'+t._align+'"]').checked=!0,t._align=t.modal.querySelector('input[name="suneditor_image_radio"]:checked').value,t._captionChecked=t.captionCheckEl.checked=!!t._caption,t._resizing&&this.plugins.resizing._module_setModifyInputSize.call(this,t,this.plugins.image),e||this.plugins.dialog.open.call(this,"image",!0)},applySize:function(e,t){const n=this.context.image;return e||(e=n.inputX.value||this.options.imageWidth),t||(t=n.inputY.value||this.options.imageHeight),n._onlyPercentage&&e||/%$/.test(e)?(this.plugins.image.setPercentSize.call(this,e,t),!0):(e&&"auto"!==e||t&&"auto"!==t?this.plugins.image.setSize.call(this,e,t,!1):this.plugins.image.setAutoSize.call(this),!1)},sizeRevert:function(){this.plugins.resizing._module_sizeRevert.call(this,this.context.image)},setSize:function(e,t,n,i){const l=this.context.image,o=/^(rw|lw)$/.test(i);/^(th|bh)$/.test(i)||(l._element.style.width=this.util.isNumber(e)?e+l.sizeUnit:e,this.plugins.image.cancelPercentAttr.call(this)),o||(l._element.style.height=this.util.isNumber(t)?t+l.sizeUnit:/%$/.test(t)?"":t),"center"===l._align&&this.plugins.image.setAlign.call(this,null,null,null,null),n||l._element.removeAttribute("data-percentage"),this.plugins.resizing._module_saveCurrentSize.call(this,l)},setAutoSize:function(){const e=this.context.image;this.plugins.resizing.resetTransform.call(this,e._element),this.plugins.image.cancelPercentAttr.call(this),e._element.style.maxWidth="",e._element.style.width="",e._element.style.height="",e._cover.style.width="",e._cover.style.height="",this.plugins.image.setAlign.call(this,null,null,null,null),e._element.setAttribute("data-percentage","auto,auto"),this.plugins.resizing._module_saveCurrentSize.call(this,e)},setOriginSize:function(){const e=this.context.image;e._element.removeAttribute("data-percentage"),this.plugins.resizing.resetTransform.call(this,e._element),this.plugins.image.cancelPercentAttr.call(this);const t=(e._element.getAttribute("data-origin")||"").split(","),n=t[0],i=t[1];t&&(e._onlyPercentage||/%$/.test(n)&&(/%$/.test(i)||!/\d/.test(i))?this.plugins.image.setPercentSize.call(this,n,i):this.plugins.image.setSize.call(this,n,i),this.plugins.resizing._module_saveCurrentSize.call(this,e))},setPercentSize:function(e,t){const n=this.context.image;t=!t||/%$/.test(t)||this.util.getNumber(t,0)?this.util.isNumber(t)?t+n.sizeUnit:t||"":this.util.isNumber(t)?t+"%":t;const i=/%$/.test(t);n._container.style.width=this.util.isNumber(e)?e+"%":e,n._container.style.height="",n._cover.style.width="100%",n._cover.style.height=i?t:"",n._element.style.width="100%",n._element.style.height=i?"":t,n._element.style.maxWidth="","center"===n._align&&this.plugins.image.setAlign.call(this,null,null,null,null),n._element.setAttribute("data-percentage",e+","+t),this.plugins.resizing.setCaptionPosition.call(this,n._element),this.plugins.resizing._module_saveCurrentSize.call(this,n)},cancelPercentAttr:function(){const e=this.context.image;e._cover.style.width="",e._cover.style.height="",e._container.style.width="",e._container.style.height="",this.util.removeClass(e._container,this.context.image._floatClassRegExp),this.util.addClass(e._container,"__se__float-"+e._align),"center"===e._align&&this.plugins.image.setAlign.call(this,null,null,null,null)},setAlign:function(e,t,n,i){const l=this.context.image;e||(e=l._align),t||(t=l._element),n||(n=l._cover),i||(i=l._container),n.style.margin=e&&"none"!==e?"auto":"0",/%$/.test(t.style.width)&&"center"===e?(i.style.minWidth="100%",n.style.width=i.style.width):(i.style.minWidth="",n.style.width=this.context.resizing._rotateVertical?t.style.height||t.offsetHeight:t.style.width&&"auto"!==t.style.width?t.style.width||"100%":""),this.util.hasClass(i,"__se__float-"+e)||(this.util.removeClass(i,l._floatClassRegExp),this.util.addClass(i,"__se__float-"+e)),t.setAttribute("data-align",e)},init:function(){const e=this.context.image;e.imgInputFile&&(e.imgInputFile.value=""),e.imgUrlFile&&(e._v_src._linkValue=e.previewSrc.textContent=e.imgUrlFile.value=""),e.imgInputFile&&e.imgUrlFile&&(e.imgUrlFile.removeAttribute("disabled"),e.previewSrc.style.textDecoration=""),e.altText.value="",e._v_link._linkValue=e.previewLink.textContent=e.imgLink.value="",e.imgLinkNewWindowCheck.checked=!1,e.modal.querySelector('input[name="suneditor_image_radio"][value="none"]').checked=!0,e.captionCheckEl.checked=!1,e._element=null,this.plugins.image.openTab.call(this,"init"),e._resizing&&(e.inputX.value=this.options.imageWidth===e._defaultSizeX?"":this.options.imageWidth,e.inputY.value=this.options.imageHeight===e._defaultSizeY?"":this.options.imageHeight,e.proportion.checked=!0,e._ratio=!1,e._ratioX=1,e._ratioY=1)}},_={name:"video",display:"dialog",add:function(e){e.addModule([r.a,u.a,g.a,m.a]);const t=e.options,n=e.context,i=n.video={_infoList:[],_infoIndex:0,_uploadFileLength:0,focusElement:null,sizeUnit:t._videoSizeUnit,_align:"none",_floatClassRegExp:"__se__float\\-[a-z]+",_youtubeQuery:t.youtubeQuery,_videoRatio:100*t.videoRatio+"%",_defaultRatio:100*t.videoRatio+"%",_linkValue:"",_element:null,_cover:null,_container:null,inputX:null,inputY:null,_element_w:1,_element_h:1,_element_l:0,_element_t:0,_defaultSizeX:"100%",_defaultSizeY:100*t.videoRatio+"%",_origin_w:"100%"===t.videoWidth?"":t.videoWidth,_origin_h:"56.25%"===t.videoHeight?"":t.videoHeight,_proportionChecked:!0,_resizing:t.videoResizing,_resizeDotHide:!t.videoHeightShow,_rotation:t.videoRotation,_onlyPercentage:t.videoSizeOnlyPercentage,_ratio:!1,_ratioX:1,_ratioY:1,_captionShow:!1};let l=this.setDialog(e);i.modal=l,i.videoInputFile=l.querySelector("._se_video_file"),i.videoUrlFile=l.querySelector(".se-input-url"),i.focusElement=i.videoUrlFile||i.videoInputFile,i.preview=l.querySelector(".se-link-preview"),l.querySelector("form").addEventListener("submit",this.submit.bind(e)),i.videoInputFile&&l.querySelector(".se-dialog-files-edge-button").addEventListener("click",this._removeSelectedFiles.bind(i.videoInputFile,i.videoUrlFile,i.preview)),i.videoInputFile&&i.videoUrlFile&&i.videoInputFile.addEventListener("change",this._fileInputChange.bind(i)),i.videoUrlFile&&i.videoUrlFile.addEventListener("input",this._onLinkPreview.bind(i.preview,i,t.linkProtocol)),i.proportion={},i.videoRatioOption={},i.inputX={},i.inputY={},t.videoResizing&&(i.proportion=l.querySelector("._se_video_check_proportion"),i.videoRatioOption=l.querySelector(".se-video-ratio"),i.inputX=l.querySelector("._se_video_size_x"),i.inputY=l.querySelector("._se_video_size_y"),i.inputX.value=t.videoWidth,i.inputY.value=t.videoHeight,i.inputX.addEventListener("keyup",this.setInputSize.bind(e,"x")),i.inputY.addEventListener("keyup",this.setInputSize.bind(e,"y")),i.inputX.addEventListener("change",this.setRatio.bind(e)),i.inputY.addEventListener("change",this.setRatio.bind(e)),i.proportion.addEventListener("change",this.setRatio.bind(e)),i.videoRatioOption.addEventListener("change",this.setVideoRatio.bind(e)),l.querySelector(".se-dialog-btn-revert").addEventListener("click",this.sizeRevert.bind(e))),n.dialog.modal.appendChild(l),l=null},setDialog:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");i.className="se-dialog-content",i.style.display="none";let l='<form method="post" enctype="multipart/form-data"><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="'+n.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-modal-title">'+n.dialogBox.videoBox.title+'</span></div><div class="se-dialog-body">';if(t.videoFileInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.videoBox.file+'</label><div class="se-dialog-form-files"><input class="se-input-form _se_video_file" type="file" accept="'+t.videoAccept+'"'+(t.videoMultipleFile?' multiple="multiple"':"")+'/><button type="button" data-command="filesRemove" class="se-btn se-dialog-files-edge-button se-file-remove" title="'+n.controller.remove+'">'+e.icons.cancel+"</button></div></div>"),t.videoUrlInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.videoBox.url+'</label><input class="se-input-form se-input-url" type="text" /><pre class="se-link-preview"></pre></div>'),t.videoResizing){const i=t.videoRatioList||[{name:"16:9",value:.5625},{name:"4:3",value:.75},{name:"21:9",value:.4285}],o=t.videoRatio,s=t.videoSizeOnlyPercentage,a=s?' style="display: none !important;"':"",r=t.videoHeightShow?"":' style="display: none !important;"',c=t.videoRatioShow?"":' style="display: none !important;"',d=s||t.videoHeightShow||t.videoRatioShow?"":' style="display: none !important;"';l+='<div class="se-dialog-form"><div class="se-dialog-size-text"><label class="size-w">'+n.dialogBox.width+'</label><label class="se-dialog-size-x">&nbsp;</label><label class="size-h"'+r+">"+n.dialogBox.height+'</label><label class="size-h"'+c+">("+n.dialogBox.ratio+')</label></div><input class="se-input-control _se_video_size_x" placeholder="100%"'+(s?' type="number" min="1"':'type="text"')+(s?' max="100"':"")+'/><label class="se-dialog-size-x"'+d+">"+(s?"%":"x")+'</label><input class="se-input-control _se_video_size_y" placeholder="'+100*t.videoRatio+'%"'+(s?' type="number" min="1"':'type="text"')+(s?' max="100"':"")+r+'/><select class="se-input-select se-video-ratio" title="'+n.dialogBox.ratio+'"'+c+">",r||(l+='<option value=""> - </option>');for(let e=0,t=i.length;e<t;e++)l+='<option value="'+i[e].value+'"'+(o.toString()===i[e].value.toString()?" selected":"")+">"+i[e].name+"</option>";l+='</select><button type="button" title="'+n.dialogBox.revertButton+'" class="se-btn se-dialog-btn-revert" style="float: right;">'+e.icons.revert+'</button></div><div class="se-dialog-form se-dialog-form-footer"'+a+d+'><label><input type="checkbox" class="se-dialog-btn-check _se_video_check_proportion" checked/>&nbsp;'+n.dialogBox.proportion+"</label></div>"}return l+='</div><div class="se-dialog-footer"><div><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="none" checked>'+n.dialogBox.basic+'</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="left">'+n.dialogBox.left+'</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="center">'+n.dialogBox.center+'</label><label><input type="radio" name="suneditor_video_radio" class="se-dialog-btn-radio" value="right">'+n.dialogBox.right+'</label></div><button type="submit" class="se-btn-primary" title="'+n.dialogBox.submitButton+'"><span>'+n.dialogBox.submitButton+"</span></button></div></form>",i.innerHTML=l,i},_fileInputChange:function(){this.videoInputFile.value?(this.videoUrlFile.setAttribute("disabled",!0),this.preview.style.textDecoration="line-through"):(this.videoUrlFile.removeAttribute("disabled"),this.preview.style.textDecoration="")},_removeSelectedFiles:function(e,t){this.value="",e&&(e.removeAttribute("disabled"),t.style.textDecoration="")},_onLinkPreview:function(e,t,n){const i=n.target.value.trim();/^<iframe.*\/iframe>$/.test(i)?(e._linkValue=i,this.textContent='<IFrame :src=".."></IFrame>'):e._linkValue=this.textContent=i?t&&-1===i.indexOf("://")&&0!==i.indexOf("#")?t+i:-1===i.indexOf("://")?"/"+i:i:""},_setTagAttrs:function(e){e.setAttribute("controls",!0);const t=this.options.videoTagAttrs;if(t)for(let n in t)this.util.hasOwn(t,n)&&e.setAttribute(n,t[n])},createVideoTag:function(){const e=this.util.createElement("VIDEO");return this.plugins.video._setTagAttrs.call(this,e),e},_setIframeAttrs:function(e){e.frameBorder="0",e.allowFullscreen=!0;const t=this.options.videoIframeAttrs;if(t)for(let n in t)this.util.hasOwn(t,n)&&e.setAttribute(n,t[n])},createIframeTag:function(){const e=this.util.createElement("IFRAME");return this.plugins.video._setIframeAttrs.call(this,e),e},fileTags:["iframe","video"],select:function(e){this.plugins.video.onModifyMode.call(this,e,this.plugins.resizing.call_controller_resize.call(this,e,"video"))},destroy:function(e){const t=e||this.context.video._element,n=this.context.video._container,i=1*t.getAttribute("data-index");let l=n.previousElementSibling||n.nextElementSibling;const o=n.parentNode;this.util.removeItem(n),this.plugins.video.init.call(this),this.controllersOff(),o!==this.context.element.wysiwyg&&this.util.removeItemAllParents(o,(function(e){return 0===e.childNodes.length}),null),this.focusEdge(l),this.plugins.fileManager.deleteInfo.call(this,"video",i,this.functions.onVideoUpload),this.history.push(!1)},on:function(e){const t=this.context.video;e?t.videoInputFile&&this.options.videoMultipleFile&&t.videoInputFile.removeAttribute("multiple"):(t.inputX.value=t._origin_w=this.options.videoWidth===t._defaultSizeX?"":this.options.videoWidth,t.inputY.value=t._origin_h=this.options.videoHeight===t._defaultSizeY?"":this.options.videoHeight,t.proportion.disabled=!0,t.videoInputFile&&this.options.videoMultipleFile&&t.videoInputFile.setAttribute("multiple","multiple")),t._resizing&&this.plugins.video.setVideoRatioSelect.call(this,t._origin_h||t._defaultRatio)},open:function(){this.plugins.dialog.open.call(this,"video","video"===this.currentControllerName)},setVideoRatio:function(e){const t=this.context.video,n=e.target.options[e.target.selectedIndex].value;t._defaultSizeY=t._videoRatio=n?100*n+"%":t._defaultSizeY,t.inputY.placeholder=n?100*n+"%":"",t.inputY.value=""},setInputSize:function(e,t){if(t&&32===t.keyCode)return void t.preventDefault();const n=this.context.video;this.plugins.resizing._module_setInputSize.call(this,n,e),"y"===e&&this.plugins.video.setVideoRatioSelect.call(this,t.target.value||n._defaultRatio)},setRatio:function(){this.plugins.resizing._module_setRatio.call(this,this.context.video)},submit:function(e){const t=this.context.video,n=this.plugins.video;e.preventDefault(),e.stopPropagation(),t._align=t.modal.querySelector('input[name="suneditor_video_radio"]:checked').value;try{t.videoInputFile&&t.videoInputFile.files.length>0?(this.showLoading(),n.submitAction.call(this,this.context.video.videoInputFile.files)):t.videoUrlFile&&t._linkValue.length>0&&(this.showLoading(),n.setup_url.call(this))}catch(e){throw this.closeLoading(),Error('[SUNEDITOR.video.submit.fail] cause : "'+e.message+'"')}finally{this.plugins.dialog.close.call(this)}return!1},submitAction:function(e){if(0===e.length)return;let t=0,n=[];for(let i=0,l=e.length;i<l;i++)/video/i.test(e[i].type)&&(n.push(e[i]),t+=e[i].size);const i=this.options.videoUploadSizeLimit;if(i>0){let e=0;const n=this.context.video._infoList;for(let t=0,i=n.length;t<i;t++)e+=1*n[t].size;if(t+e>i){this.closeLoading();const n="[SUNEDITOR.videoUpload.fail] Size of uploadable total videos: "+i/1e3+"KB";return void(("function"!==this.functions.onVideoUploadError||this.functions.onVideoUploadError(n,{limitSize:i,currentSize:e,uploadSize:t},this))&&this.functions.noticeOpen(n))}}const l=this.context.video;l._uploadFileLength=n.length;const o={inputWidth:l.inputX.value,inputHeight:l.inputY.value,align:l._align,isUpdate:this.context.dialog.updateModal,element:l._element};if("function"==typeof this.functions.onVideoUploadBefore){const e=this.functions.onVideoUploadBefore(n,o,this,function(e){e&&this._w.Array.isArray(e.result)?this.plugins.video.register.call(this,o,e):this.plugins.video.upload.call(this,o,e)}.bind(this));if(void 0===e)return;if(!e)return void this.closeLoading();"object"==typeof e&&e.length>0&&(n=e)}this.plugins.video.upload.call(this,o,n)},error:function(e,t){if(this.closeLoading(),"function"!=typeof this.functions.onVideoUploadError||this.functions.onVideoUploadError(e,t,this))throw this.functions.noticeOpen(e),Error("[SUNEDITOR.plugin.video.error] response: "+e)},upload:function(e,t){if(!t)return void this.closeLoading();if("string"==typeof t)return void this.plugins.video.error.call(this,t,null);const n=this.options.videoUploadUrl,i=this.context.dialog.updateModal?1:t.length;if(!("string"==typeof n&&n.length>0))throw Error('[SUNEDITOR.videoUpload.fail] cause : There is no "videoUploadUrl" option.');{const l=new FormData;for(let e=0;e<i;e++)l.append("file-"+e,t[e]);this.plugins.fileManager.upload.call(this,n,this.options.videoUploadHeader,l,this.plugins.video.callBack_videoUpload.bind(this,e),this.functions.onVideoUploadError)}},callBack_videoUpload:function(e,t){if("function"==typeof this.functions.videoUploadHandler)this.functions.videoUploadHandler(t,e,this);else{const n=JSON.parse(t.responseText);n.errorMessage?this.plugins.video.error.call(this,n.errorMessage,n):this.plugins.video.register.call(this,e,n)}},register:function(e,t){const n=t.result,i=this.plugins.video.createVideoTag.call(this);for(let t,l=0,o=n.length;l<o;l++)t={name:n[l].name,size:n[l].size},this.plugins.video.create_video.call(this,e.isUpdate?e.element:i.cloneNode(!1),n[l].url,e.inputWidth,e.inputHeight,e.align,t,e.isUpdate);this.closeLoading()},setup_url:function(){try{const e=this.context.video;let t=e._linkValue;if(0===t.length)return!1;if(/^<iframe.*\/iframe>$/.test(t)){if(t=(new this._w.DOMParser).parseFromString(t,"text/html").querySelector("iframe").src,0===t.length)return!1}if(/youtu\.?be/.test(t)){if(/^http/.test(t)||(t="https://"+t),t=t.replace("watch?v=",""),/^\/\/.+\/embed\//.test(t)||(t=t.replace(t.match(/\/\/.+\//)[0],"//www.youtube.com/embed/").replace("&","?&")),e._youtubeQuery.length>0)if(/\?/.test(t)){const n=t.split("?");t=n[0]+"?"+e._youtubeQuery+"&"+n[1]}else t+="?"+e._youtubeQuery}else/vimeo\.com/.test(t)&&(t.endsWith("/")&&(t=t.slice(0,-1)),t="https://player.vimeo.com/video/"+t.slice(t.lastIndexOf("/")+1));this.plugins.video.create_video.call(this,this.plugins.video.createIframeTag.call(this),t,e.inputX.value,e.inputY.value,e._align,null,this.context.dialog.updateModal)}catch(e){throw Error('[SUNEDITOR.video.upload.fail] cause : "'+e.message+'"')}finally{this.closeLoading()}},create_video:function(e,t,n,i,l,o,s){this.context.resizing._resize_plugin="video";const a=this.context.video;let r=null,c=null,d=!1;if(s){if((e=a._element).src!==t){d=!0;const n=/youtu\.?be/.test(t),i=/vimeo\.com/.test(t);if(!n&&!i||/^iframe$/i.test(e.nodeName))if(n||i||/^videoo$/i.test(e.nodeName))e.src=t;else{const n=this.plugins.video.createVideoTag.call(this);n.src=t,e.parentNode.replaceChild(n,e),a._element=e=n}else{const n=this.plugins.video.createIframeTag.call(this);n.src=t,e.parentNode.replaceChild(n,e),a._element=e=n}}c=a._container,r=this.util.getParentElement(e,"FIGURE")}else d=!0,e.src=t,a._element=e,r=this.plugins.component.set_cover.call(this,e),c=this.plugins.component.set_container.call(this,r,"se-video-container");a._cover=r,a._container=c;const u=this.plugins.resizing._module_getSizeX.call(this,a)!==(n||a._defaultSizeX)||this.plugins.resizing._module_getSizeY.call(this,a)!==(i||a._videoRatio),h=!s||u;a._resizing&&(this.context.video._proportionChecked=a.proportion.checked,e.setAttribute("data-proportion",a._proportionChecked));let g=!1;h&&(g=this.plugins.video.applySize.call(this)),g&&"center"===l||this.plugins.video.setAlign.call(this,null,e,r,c);let p=!0;s?a._resizing&&this.context.resizing._rotateVertical&&h&&this.plugins.resizing.setTransformSize.call(this,e,null,null):p=this.insertComponent(c,!1,!0,!1),p&&(d&&this.plugins.fileManager.setInfo.call(this,"video",e,this.functions.onVideoUpload,o,!0),s&&(this.selectComponent(e,"video"),this.history.push(!1))),this.context.resizing._resize_plugin=""},_update_videoCover:function(e){if(!e)return;const t=this.context.video;/^video$/i.test(e.nodeName)?this.plugins.video._setTagAttrs.call(this,e):this.plugins.video._setIframeAttrs.call(this,e);const n=this.util.getParentElement(e,this.util.isMediaComponent)||this.util.getParentElement(e,function(e){return this.isWysiwygDiv(e.parentNode)}.bind(this.util));e=e.cloneNode(!0);const i=t._cover=this.plugins.component.set_cover.call(this,e),l=t._container=this.plugins.component.set_container.call(this,i,"se-video-container"),o=n.querySelector("figcaption");let s=null;o&&(s=this.util.createElement("DIV"),s.innerHTML=o.innerHTML,this.util.removeItem(o));const a=(e.getAttribute("data-size")||e.getAttribute("data-origin")||"").split(",");this.plugins.video.applySize.call(this,a[0],a[1]),this.util.isFormatElement(n)&&n.textContent.length>0?(n.parentNode.insertBefore(l,n.nextElementSibling),this.util.removeItem(t._element),t._element=e):n.parentNode.replaceChild(l,n),s&&n.parentNode.insertBefore(s,l.nextElementSibling),this.plugins.fileManager.setInfo.call(this,"video",e,this.functions.onVideoUpload,null,!0)},onModifyMode:function(e,t){const n=this.context.video;n._element=e,n._cover=this.util.getParentElement(e,"FIGURE"),n._container=this.util.getParentElement(e,this.util.isMediaComponent),n._align=e.style.float||e.getAttribute("data-align")||"none",e.style.float="",t&&(n._element_w=t.w,n._element_h=t.h,n._element_t=t.t,n._element_l=t.l);let i=n._element.getAttribute("data-size")||n._element.getAttribute("data-origin");i?(i=i.split(","),n._origin_w=i[0],n._origin_h=i[1]):t&&(n._origin_w=t.w,n._origin_h=t.h)},openModify:function(e){const t=this.context.video;if(t.videoUrlFile&&(t._linkValue=t.preview.textContent=t.videoUrlFile.value=t._element.src||(t._element.querySelector("source")||"").src||""),t.modal.querySelector('input[name="suneditor_video_radio"][value="'+t._align+'"]').checked=!0,t._resizing){this.plugins.resizing._module_setModifyInputSize.call(this,t,this.plugins.video);const e=t._videoRatio=this.plugins.resizing._module_getSizeY.call(this,t);this.plugins.video.setVideoRatioSelect.call(this,e)||(t.inputY.value=t._onlyPercentage?this.util.getNumber(e,2):e)}e||this.plugins.dialog.open.call(this,"video",!0)},setVideoRatioSelect:function(e){let t=!1;const n=this.context.video,i=n.videoRatioOption.options;/%$/.test(e)||n._onlyPercentage?e=this.util.getNumber(e,2)/100+"":(!this.util.isNumber(e)||1*e>=1)&&(e=""),n.inputY.placeholder="";for(let l=0,o=i.length;l<o;l++)i[l].value===e?(t=i[l].selected=!0,n.inputY.placeholder=e?100*e+"%":""):i[l].selected=!1;return t},checkFileInfo:function(){this.plugins.fileManager.checkInfo.call(this,"video",["iframe","video"],this.functions.onVideoUpload,this.plugins.video._update_videoCover.bind(this),!0)},resetFileInfo:function(){this.plugins.fileManager.resetInfo.call(this,"video",this.functions.onVideoUpload)},applySize:function(e,t){const n=this.context.video;return e||(e=n.inputX.value||this.options.videoWidth),t||(t=n.inputY.value||this.options.videoHeight),n._onlyPercentage||/%$/.test(e)||!e?(this.plugins.video.setPercentSize.call(this,e||"100%",t||(/%$/.test(n._videoRatio)?n._videoRatio:n._defaultRatio)),!0):(e&&"auto"!==e||t&&"auto"!==t?this.plugins.video.setSize.call(this,e,t||n._videoRatio||n._defaultRatio,!1):this.plugins.video.setAutoSize.call(this),!1)},sizeRevert:function(){this.plugins.resizing._module_sizeRevert.call(this,this.context.video)},setSize:function(e,t,n,i){const l=this.context.video,o=/^(rw|lw)$/.test(i),s=/^(th|bh)$/.test(i);s||(e=this.util.getNumber(e,0)),o||(t=this.util.isNumber(t)?t+l.sizeUnit:t||""),s||(l._element.style.width=e?e+l.sizeUnit:""),o||(l._cover.style.paddingBottom=l._cover.style.height=t),s||/%$/.test(e)||(l._cover.style.width="",l._container.style.width=""),o||/%$/.test(t)?l._element.style.height="":l._element.style.height=t,n||l._element.removeAttribute("data-percentage"),this.plugins.resizing._module_saveCurrentSize.call(this,l)},setAutoSize:function(){this.plugins.video.setPercentSize.call(this,100,this.context.video._defaultRatio)},setOriginSize:function(e){const t=this.context.video;t._element.removeAttribute("data-percentage"),this.plugins.resizing.resetTransform.call(this,t._element),this.plugins.video.cancelPercentAttr.call(this);const n=((e?t._element.getAttribute("data-size"):"")||t._element.getAttribute("data-origin")||"").split(",");if(n){const e=n[0],i=n[1];t._onlyPercentage||/%$/.test(e)&&(/%$/.test(i)||!/\d/.test(i))?this.plugins.video.setPercentSize.call(this,e,i):this.plugins.video.setSize.call(this,e,i),this.plugins.resizing._module_saveCurrentSize.call(this,t)}},setPercentSize:function(e,t){const n=this.context.video;t=!t||/%$/.test(t)||this.util.getNumber(t,0)?this.util.isNumber(t)?t+n.sizeUnit:t||n._defaultRatio:this.util.isNumber(t)?t+"%":t,n._container.style.width=this.util.isNumber(e)?e+"%":e,n._container.style.height="",n._cover.style.width="100%",n._cover.style.height=t,n._cover.style.paddingBottom=t,n._element.style.width="100%",n._element.style.height="100%",n._element.style.maxWidth="","center"===n._align&&this.plugins.video.setAlign.call(this,null,null,null,null),n._element.setAttribute("data-percentage",e+","+t),this.plugins.resizing._module_saveCurrentSize.call(this,n)},cancelPercentAttr:function(){const e=this.context.video;e._cover.style.width="",e._cover.style.height="",e._cover.style.paddingBottom="",e._container.style.width="",e._container.style.height="",this.util.removeClass(e._container,this.context.video._floatClassRegExp),this.util.addClass(e._container,"__se__float-"+e._align),"center"===e._align&&this.plugins.video.setAlign.call(this,null,null,null,null)},setAlign:function(e,t,n,i){const l=this.context.video;e||(e=l._align),t||(t=l._element),n||(n=l._cover),i||(i=l._container),n.style.margin=e&&"none"!==e?"auto":"0",/%$/.test(t.style.width)&&"center"===e?(i.style.minWidth="100%",n.style.width=i.style.width,n.style.height=n.style.height,n.style.paddingBottom=/%$/.test(n.style.height)?this.util.getNumber(this.util.getNumber(n.style.height,2)/100*this.util.getNumber(n.style.width,2),2)+"%":n.style.height):(i.style.minWidth="",n.style.width=this.context.resizing._rotateVertical?t.style.height||t.offsetHeight:t.style.width||"100%",n.style.paddingBottom=n.style.height),this.util.hasClass(i,"__se__float-"+e)||(this.util.removeClass(i,l._floatClassRegExp),this.util.addClass(i,"__se__float-"+e)),t.setAttribute("data-align",e)},init:function(){const e=this.context.video;e.videoInputFile&&(e.videoInputFile.value=""),e.videoUrlFile&&(e._linkValue=e.preview.textContent=e.videoUrlFile.value=""),e.videoInputFile&&e.videoUrlFile&&(e.videoUrlFile.removeAttribute("disabled"),e.preview.style.textDecoration=""),e._origin_w=this.options.videoWidth,e._origin_h=this.options.videoHeight,e.modal.querySelector('input[name="suneditor_video_radio"][value="none"]').checked=!0,e._resizing&&(e.inputX.value=this.options.videoWidth===e._defaultSizeX?"":this.options.videoWidth,e.inputY.value=this.options.videoHeight===e._defaultSizeY?"":this.options.videoHeight,e.proportion.checked=!0,e.proportion.disabled=!0,this.plugins.video.setVideoRatioSelect.call(this,e._defaultRatio))}},b={name:"audio",display:"dialog",add:function(e){e.addModule([r.a,u.a,m.a]);const t=e.context,n=t.audio={_infoList:[],_infoIndex:0,_uploadFileLength:0,focusElement:null,targetSelect:null,_origin_w:e.options.audioWidth,_origin_h:e.options.audioHeight,_linkValue:"",_element:null,_cover:null,_container:null};let i=this.setDialog(e);n.modal=i,n.audioInputFile=i.querySelector("._se_audio_files"),n.audioUrlFile=i.querySelector(".se-input-url"),n.focusElement=n.audioInputFile||n.audioUrlFile,n.preview=i.querySelector(".se-link-preview");let l=this.setController(e);n.controller=l,i.querySelector("form").addEventListener("submit",this.submit.bind(e)),n.audioInputFile&&i.querySelector(".se-dialog-files-edge-button").addEventListener("click",this._removeSelectedFiles.bind(n.audioInputFile,n.audioUrlFile,n.preview)),n.audioInputFile&&n.audioUrlFile&&n.audioInputFile.addEventListener("change",this._fileInputChange.bind(n)),l.addEventListener("click",this.onClick_controller.bind(e)),n.audioUrlFile&&n.audioUrlFile.addEventListener("input",this._onLinkPreview.bind(n.preview,n,e.options.linkProtocol)),t.dialog.modal.appendChild(i),t.element.relative.appendChild(l),i=null,l=null},setDialog:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");i.className="se-dialog-content",i.style.display="none";let l='<form method="post" enctype="multipart/form-data"><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="'+n.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-modal-title">'+n.dialogBox.audioBox.title+'</span></div><div class="se-dialog-body">';return t.audioFileInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.audioBox.file+'</label><div class="se-dialog-form-files"><input class="se-input-form _se_audio_files" type="file" accept="'+t.audioAccept+'"'+(t.audioMultipleFile?' multiple="multiple"':"")+'/><button type="button" data-command="filesRemove" class="se-btn se-dialog-files-edge-button se-file-remove" title="'+n.controller.remove+'">'+e.icons.cancel+"</button></div></div>"),t.audioUrlInput&&(l+='<div class="se-dialog-form"><label>'+n.dialogBox.audioBox.url+'</label><input class="se-input-form se-input-url" type="text" /><pre class="se-link-preview"></pre></div>'),l+='</div><div class="se-dialog-footer"><button type="submit" class="se-btn-primary" title="'+n.dialogBox.submitButton+'"><span>'+n.dialogBox.submitButton+"</span></button></div></form>",i.innerHTML=l,i},setController:function(e){const t=e.lang,n=e.icons,i=e.util.createElement("DIV");return i.className="se-controller se-controller-link",i.innerHTML='<div class="se-arrow se-arrow-up"></div><div class="link-content"><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-tooltip">'+n.edit+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.edit+'</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-tooltip">'+n.delete+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.remove+"</span></span></button></div></div>",i},_fileInputChange:function(){this.audioInputFile.value?(this.audioUrlFile.setAttribute("disabled",!0),this.preview.style.textDecoration="line-through"):(this.audioUrlFile.removeAttribute("disabled"),this.preview.style.textDecoration="")},_removeSelectedFiles:function(e,t){this.value="",e&&(e.removeAttribute("disabled"),t.style.textDecoration="")},_createAudioTag:function(){const e=this.util.createElement("AUDIO");this.plugins.audio._setTagAttrs.call(this,e);const t=this.context.audio._origin_w,n=this.context.audio._origin_h;return e.setAttribute("origin-size",t+","+n),e.style.cssText=(t?"width:"+t+"; ":"")+(n?"height:"+n+";":""),e},_setTagAttrs:function(e){e.setAttribute("controls",!0);const t=this.options.audioTagAttrs;if(t)for(let n in t)this.util.hasOwn(t,n)&&e.setAttribute(n,t[n])},_onLinkPreview:function(e,t,n){const i=n.target.value.trim();e._linkValue=this.textContent=i?t&&-1===i.indexOf("://")&&0!==i.indexOf("#")?t+i:-1===i.indexOf("://")?"/"+i:i:""},fileTags:["audio"],select:function(e){this.plugins.audio.onModifyMode.call(this,e)},destroy:function(e){e=e||this.context.audio._element;const t=this.util.getParentElement(e,this.util.isComponent)||e,n=1*e.getAttribute("data-index"),i=t.previousElementSibling||t.nextElementSibling,l=t.parentNode;this.util.removeItem(t),this.plugins.audio.init.call(this),this.controllersOff(),l!==this.context.element.wysiwyg&&this.util.removeItemAllParents(l,(function(e){return 0===e.childNodes.length}),null),this.focusEdge(i),this.plugins.fileManager.deleteInfo.call(this,"audio",n,this.functions.onAudioUpload),this.history.push(!1)},checkFileInfo:function(){this.plugins.fileManager.checkInfo.call(this,"audio",["audio"],this.functions.onAudioUpload,this.plugins.audio.updateCover.bind(this),!1)},resetFileInfo:function(){this.plugins.fileManager.resetInfo.call(this,"audio",this.functions.onAudioUpload)},on:function(e){const t=this.context.audio;e?t._element?(this.context.dialog.updateModal=!0,t._linkValue=t.preview.textContent=t.audioUrlFile.value=t._element.src,t.audioInputFile&&this.options.audioMultipleFile&&t.audioInputFile.removeAttribute("multiple")):t.audioInputFile&&this.options.audioMultipleFile&&t.audioInputFile.removeAttribute("multiple"):(this.plugins.audio.init.call(this),t.audioInputFile&&this.options.audioMultipleFile&&t.audioInputFile.setAttribute("multiple","multiple"))},open:function(){this.plugins.dialog.open.call(this,"audio","audio"===this.currentControllerName)},submit:function(e){const t=this.context.audio;e.preventDefault(),e.stopPropagation();try{t.audioInputFile&&t.audioInputFile.files.length>0?(this.showLoading(),this.plugins.audio.submitAction.call(this,t.audioInputFile.files)):t.audioUrlFile&&t._linkValue.length>0&&(this.showLoading(),this.plugins.audio.setupUrl.call(this,t._linkValue))}catch(e){throw this.closeLoading(),Error('[SUNEDITOR.audio.submit.fail] cause : "'+e.message+'"')}finally{this.plugins.dialog.close.call(this)}return!1},submitAction:function(e){if(0===e.length)return;let t=0,n=[];for(let i=0,l=e.length;i<l;i++)/audio/i.test(e[i].type)&&(n.push(e[i]),t+=e[i].size);const i=this.options.audioUploadSizeLimit;if(i>0){let e=0;const n=this.context.audio._infoList;for(let t=0,i=n.length;t<i;t++)e+=1*n[t].size;if(t+e>i){this.closeLoading();const n="[SUNEDITOR.audioUpload.fail] Size of uploadable total audios: "+i/1e3+"KB";return void(("function"!==this.functions.onAudioUploadError||this.functions.onAudioUploadError(n,{limitSize:i,currentSize:e,uploadSize:t},this))&&this.functions.noticeOpen(n))}}const l=this.context.audio;l._uploadFileLength=n.length;const o={isUpdate:this.context.dialog.updateModal,element:l._element};if("function"==typeof this.functions.onAudioUploadBefore){const e=this.functions.onAudioUploadBefore(n,o,this,function(e){e&&this._w.Array.isArray(e.result)?this.plugins.audio.register.call(this,o,e):this.plugins.audio.upload.call(this,o,e)}.bind(this));if(void 0===e)return;if(!e)return void this.closeLoading();"object"==typeof e&&e.length>0&&(n=e)}this.plugins.audio.upload.call(this,o,n)},error:function(e,t){if(this.closeLoading(),"function"!=typeof this.functions.onAudioUploadError||this.functions.onAudioUploadError(e,t,this))throw this.functions.noticeOpen(e),Error("[SUNEDITOR.plugin.audio.exception] response: "+e)},upload:function(e,t){if(!t)return void this.closeLoading();if("string"==typeof t)return void this.plugins.audio.error.call(this,t,null);const n=this.options.audioUploadUrl,i=this.context.dialog.updateModal?1:t.length,l=new FormData;for(let e=0;e<i;e++)l.append("file-"+e,t[e]);this.plugins.fileManager.upload.call(this,n,this.options.audioUploadHeader,l,this.plugins.audio.callBack_upload.bind(this,e),this.functions.onAudioUploadError)},callBack_upload:function(e,t){if("function"==typeof this.functions.audioUploadHandler)this.functions.audioUploadHandler(t,e,this);else{const n=JSON.parse(t.responseText);n.errorMessage?this.plugins.audio.error.call(this,n.errorMessage,n):this.plugins.audio.register.call(this,e,n)}},register:function(e,t){const n=t.result;for(let t,i,l=0,o=n.length;l<o;l++)i=e.isUpdate?e.element:this.plugins.audio._createAudioTag.call(this),t={name:n[l].name,size:n[l].size},this.plugins.audio.create_audio.call(this,i,n[l].url,t,e.isUpdate);this.closeLoading()},setupUrl:function(e){try{if(0===e.length)return!1;this.plugins.audio.create_audio.call(this,this.plugins.audio._createAudioTag.call(this),e,null,this.context.dialog.updateModal)}catch(e){throw Error('[SUNEDITOR.audio.audio.fail] cause : "'+e.message+'"')}finally{this.closeLoading()}},create_audio:function(e,t,n,i){const l=this.context.audio;if(i){if(l._element&&(e=l._element),!e||e.src===t)return void this.selectComponent(e,"audio");e.src=t}else{e.src=t;const n=this.plugins.component.set_cover.call(this,e),i=this.plugins.component.set_container.call(this,n,"");if(!this.insertComponent(i,!1,!0,!1))return void this.focus()}this.plugins.fileManager.setInfo.call(this,"audio",e,this.functions.onAudioUpload,n,!1),this.selectComponent(e,"audio"),i&&this.history.push(!1)},updateCover:function(e){const t=this.context.audio;this.plugins.audio._setTagAttrs.call(this,e);const n=this.util.getParentElement(e,this.util.isMediaComponent)||this.util.getParentElement(e,function(e){return this.isWysiwygDiv(e.parentNode)}.bind(this.util));t._element=e=e.cloneNode(!1);const i=this.plugins.component.set_cover.call(this,e),l=this.plugins.component.set_container.call(this,i,"se-audio-container");n.parentNode.replaceChild(l,n),this.plugins.fileManager.setInfo.call(this,"audio",e,this.functions.onAudioUpload,null,!1)},onModifyMode:function(e){const t=this.context.audio;this.setControllerPosition(t.controller,e,"bottom",{left:0,top:0}),this.controllersOn(t.controller,e,this.plugins.audio.onControllerOff.bind(this,e),"audio"),this.util.addClass(e,"active"),t._element=e,t._cover=this.util.getParentElement(e,"FIGURE"),t._container=this.util.getParentElement(e,this.util.isComponent)},openModify:function(e){if(this.context.audio.audioUrlFile){const e=this.context.audio;e._linkValue=e.preview.textContent=e.audioUrlFile.value=e._element.src}e||this.plugins.dialog.open.call(this,"audio",!0)},onClick_controller:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command");t&&(e.preventDefault(),/update/.test(t)?this.plugins.audio.openModify.call(this,!1):this.plugins.audio.destroy.call(this,this.context.audio._element),this.controllersOff())},onControllerOff:function(e){this.util.removeClass(e,"active"),this.context.audio.controller.style.display="none"},init:function(){if(this.context.dialog.updateModal)return;const e=this.context.audio;e.audioInputFile&&(e.audioInputFile.value=""),e.audioUrlFile&&(e._linkValue=e.preview.textContent=e.audioUrlFile.value=""),e.audioInputFile&&e.audioUrlFile&&(e.audioUrlFile.removeAttribute("disabled"),e.preview.style.textDecoration=""),e._element=null}},v={name:"math",display:"dialog",add:function(e){e.addModule([r.a]);const t=e.context;t.math={focusElement:null,previewElement:null,fontSizeElement:null,_mathExp:null};let n=this.setDialog(e);t.math.modal=n,t.math.focusElement=n.querySelector(".se-math-exp"),t.math.previewElement=n.querySelector(".se-math-preview"),t.math.fontSizeElement=n.querySelector(".se-math-size"),t.math.focusElement.addEventListener("keyup",this._renderMathExp.bind(e,t.math),!1),t.math.focusElement.addEventListener("change",this._renderMathExp.bind(e,t.math),!1),t.math.fontSizeElement.addEventListener("change",function(e){this.fontSize=e.target.value}.bind(t.math.previewElement.style),!1);let i=this.setController_MathButton(e);t.math.mathController=i,t.math._mathExp=null,n.querySelector("form").addEventListener("submit",this.submit.bind(e),!1),i.addEventListener("click",this.onClick_mathController.bind(e)),t.dialog.modal.appendChild(n),t.element.relative.appendChild(i),n=null,i=null},setDialog:function(e){const t=e.lang,n=e.util.createElement("DIV");return n.className="se-dialog-content",n.style.display="none",n.innerHTML='<form><div class="se-dialog-header"><button type="button" data-command="close" class="se-btn se-dialog-close" aria-label="Close" title="'+t.dialogBox.close+'">'+e.icons.cancel+'</button><span class="se-modal-title">'+t.dialogBox.mathBox.title+'</span></div><div class="se-dialog-body"><div class="se-dialog-form"><label>'+t.dialogBox.mathBox.inputLabel+' (<a href="https://katex.org/docs/supported.html" target="_blank">KaTeX</a>)</label><textarea class="se-input-form se-math-exp" type="text"></textarea></div><div class="se-dialog-form"><label>'+t.dialogBox.mathBox.fontSizeLabel+'</label><select class="se-input-select se-math-size"><option value="1em">1</option><option value="1.5em">1.5</option><option value="2em">2</option><option value="2.5em">2.5</option></select></div><div class="se-dialog-form"><label>'+t.dialogBox.mathBox.previewLabel+'</label><p class="se-math-preview"></p></div></div><div class="se-dialog-footer"><button type="submit" class="se-btn-primary" title="'+t.dialogBox.submitButton+'"><span>'+t.dialogBox.submitButton+"</span></button></div></form>",n},setController_MathButton:function(e){const t=e.lang,n=e.util.createElement("DIV");return n.className="se-controller se-controller-link",n.innerHTML='<div class="se-arrow se-arrow-up"></div><div class="link-content"><div class="se-btn-group"><button type="button" data-command="update" tabindex="-1" class="se-btn se-tooltip">'+e.icons.edit+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.edit+'</span></span></button><button type="button" data-command="delete" tabindex="-1" class="se-btn se-tooltip">'+e.icons.delete+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.remove+"</span></span></button></div></div>",n},open:function(){this.plugins.dialog.open.call(this,"math","math"===this.currentControllerName)},managedTags:function(){return{className:"katex",method:function(e){if(!e.getAttribute("data-exp"))return;const t=this._d.createRange().createContextualFragment(this.plugins.math._renderer.call(this,this.util.HTMLDecoder(e.getAttribute("data-exp"))));e.innerHTML=t.querySelector(".katex").innerHTML}}},_renderer:function(e){const t=this.options.katex;return t.src.renderToString(e,t.options)},_renderMathExp:function(e,t){e.previewElement.innerHTML=this.plugins.math._renderer.call(this,t.target.value)},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation();const t=function(){if(0===this.context.math.focusElement.value.trim().length)return!1;const e=this.context.math,t=e.focusElement.value,n=e.previewElement.querySelector(".katex");if(!n)return!1;if(n.className="__se__katex "+n.className,n.setAttribute("contenteditable",!1),n.setAttribute("data-exp",this.util.HTMLEncoder(t)),n.setAttribute("data-font-size",e.fontSizeElement.value),n.style.fontSize=e.fontSizeElement.value,this.context.dialog.updateModal){const t=this.util.getParentElement(e._mathExp,".katex");t.parentNode.replaceChild(n,t),this.setRange(n,0,n,1)}else{const e=this.getSelectedElements();if(e.length>1){const t=this.util.createElement(e[0].nodeName);if(t.appendChild(n),!this.insertNode(t,null,!0))return!1}else if(!this.insertNode(n,null,!0))return!1;const t=this.util.createTextNode(this.util.zeroWidthSpace);n.parentNode.insertBefore(t,n.nextSibling),this.setRange(n,0,n,1)}return e.focusElement.value="",e.fontSizeElement.value="1em",e.previewElement.style.fontSize="1em",e.previewElement.innerHTML="",!0}.bind(this);try{t()&&(this.plugins.dialog.close.call(this),this.history.push(!1))}catch(e){this.plugins.dialog.close.call(this)}finally{this.closeLoading()}return!1},active:function(e){if(e){if(e.getAttribute("data-exp"))return this.controllerArray.indexOf(this.context.math.mathController)<0&&(this.setRange(e,0,e,1),this.plugins.math.call_controller.call(this,e)),!0}else this.controllerArray.indexOf(this.context.math.mathController)>-1&&this.controllersOff();return!1},on:function(e){if(e){const e=this.context.math;if(e._mathExp){const t=this.util.HTMLDecoder(e._mathExp.getAttribute("data-exp")),n=e._mathExp.getAttribute("data-font-size")||"1em";this.context.dialog.updateModal=!0,e.focusElement.value=t,e.fontSizeElement.value=n,e.previewElement.innerHTML=this.plugins.math._renderer.call(this,t),e.previewElement.style.fontSize=n}}else this.plugins.math.init.call(this)},call_controller:function(e){this.context.math._mathExp=e;const t=this.context.math.mathController;this.setControllerPosition(t,e,"bottom",{left:0,top:0}),this.controllersOn(t,e,"math")},onClick_mathController:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command")||e.target.parentNode.getAttribute("data-command");t&&(e.preventDefault(),/update/.test(t)?(this.context.math.focusElement.value=this.util.HTMLDecoder(this.context.math._mathExp.getAttribute("data-exp")),this.plugins.dialog.open.call(this,"math",!0)):(this.util.removeItem(this.context.math._mathExp),this.context.math._mathExp=null,this.focus(),this.history.push(!1)),this.controllersOff())},init:function(){const e=this.context.math;e.mathController.style.display="none",e._mathExp=null,e.focusElement.value="",e.previewElement.innerHTML=""}},y=n("JhlZ"),C=n.n(y),w={blockquote:{name:"blockquote",display:"command",add:function(e,t){e.context.blockquote={targetButton:t,tag:e.util.createElement("BLOCKQUOTE")}},active:function(e){if(e){if(/blockquote/i.test(e.nodeName))return this.util.addClass(this.context.blockquote.targetButton,"active"),!0}else this.util.removeClass(this.context.blockquote.targetButton,"active");return!1},action:function(){const e=this.util.getParentElement(this.getSelectionNode(),"blockquote");e?this.detachRangeFormatElement(e,null,null,!1,!1):this.applyRangeFormatElement(this.context.blockquote.tag.cloneNode(!1))}},align:{name:"align",display:"submenu",add:function(e,t){const n=e.icons,i=e.context;i.align={targetButton:t,_alignList:null,currentAlign:"",defaultDir:e.options.rtl?"right":"left",icons:{justify:n.align_justify,left:n.align_left,right:n.align_right,center:n.align_center}};let l=this.setSubmenu(e),o=l.querySelector("ul");o.addEventListener("click",this.pickup.bind(e)),i.align._alignList=o.querySelectorAll("li button"),e.initMenuTarget(this.name,t,l),l=null,o=null},setSubmenu:function(e){const t=e.lang,n=e.icons,i=e.util.createElement("DIV"),l="left"===e.context.align.defaultDir,o='<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyleft" data-value="left" title="'+t.toolbar.alignLeft+'"><span class="se-list-icon">'+n.align_left+"</span>"+t.toolbar.alignLeft+"</button></li>",s='<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyright" data-value="right" title="'+t.toolbar.alignRight+'"><span class="se-list-icon">'+n.align_right+"</span>"+t.toolbar.alignRight+"</button></li>";return i.className="se-submenu se-list-layer se-list-align",i.innerHTML='<div class="se-list-inner"><ul class="se-list-basic">'+(l?o:s)+'<li><button type="button" class="se-btn-list se-btn-align" data-command="justifycenter" data-value="center" title="'+t.toolbar.alignCenter+'"><span class="se-list-icon">'+n.align_center+"</span>"+t.toolbar.alignCenter+"</button></li>"+(l?s:o)+'<li><button type="button" class="se-btn-list se-btn-align" data-command="justifyfull" data-value="justify" title="'+t.toolbar.alignJustify+'"><span class="se-list-icon">'+n.align_justify+"</span>"+t.toolbar.alignJustify+"</button></li></ul></div>",i},active:function(e){const t=this.context.align,n=t.targetButton,i=n.firstElementChild;if(e){if(this.util.isFormatElement(e)){const l=e.style.textAlign;if(l)return this.util.changeElement(i,t.icons[l]||t.icons[t.defaultDir]),n.setAttribute("data-focus",l),!0}}else this.util.changeElement(i,t.icons[t.defaultDir]),n.removeAttribute("data-focus");return!1},on:function(){const e=this.context.align,t=e._alignList,n=e.targetButton.getAttribute("data-focus")||e.defaultDir;if(n!==e.currentAlign){for(let e=0,i=t.length;e<i;e++)n===t[e].getAttribute("data-value")?this.util.addClass(t[e],"active"):this.util.removeClass(t[e],"active");e.currentAlign=n}},pickup:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n=null;for(;!n&&!/UL/i.test(t.tagName);)n=t.getAttribute("data-value"),t=t.parentNode;if(!n)return;const i=this.context.align.defaultDir,l=this.getSelectedElements();for(let e=0,t=l.length;e<t;e++)this.util.setStyle(l[e],"textAlign",n===i?"":n);this.effectNode=null,this.submenuOff(),this.focus(),this.history.push(!1)}},font:{name:"font",display:"submenu",add:function(e,t){const n=e.context;n.font={targetText:t.querySelector(".txt"),targetTooltip:t.parentNode.querySelector(".se-tooltip-text"),_fontList:null,currentFont:""};let i=this.setSubmenu(e);i.querySelector(".se-list-inner").addEventListener("click",this.pickup.bind(e)),n.font._fontList=i.querySelectorAll("ul li button"),e.initMenuTarget(this.name,t,i),i=null},setSubmenu:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");let l,o,s,a;i.className="se-submenu se-list-layer se-list-font-family";let r=t.font?t.font:["Arial","Comic Sans MS","Courier New","Impact","Georgia","tahoma","Trebuchet MS","Verdana"],c='<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="'+n.toolbar.default+'">('+n.toolbar.default+")</button></li>";for(s=0,a=r.length;s<a;s++)l=r[s],o=l.split(",")[0],c+='<li><button type="button" class="se-btn-list" data-value="'+l+'" data-txt="'+o+'" title="'+o+'" style="font-family:'+l+';">'+o+"</button></li>";return c+="</ul></div>",i.innerHTML=c,i},active:function(e){const t=this.context.font.targetText,n=this.context.font.targetTooltip;if(e){if(e.style&&e.style.fontFamily.length>0){const i=e.style.fontFamily.replace(/["']/g,"");return this.util.changeTxt(t,i),this.util.changeTxt(n,i),!0}}else{const e=this.lang.toolbar.font;this.util.changeTxt(t,e),this.util.changeTxt(n,e)}return!1},on:function(){const e=this.context.font,t=e._fontList,n=e.targetText.textContent;if(n!==e.currentFont){for(let e=0,i=t.length;e<i;e++)n===t[e].getAttribute("data-value")?this.util.addClass(t[e],"active"):this.util.removeClass(t[e],"active");e.currentFont=n}},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=e.target.getAttribute("data-value");if(t){const e=this.util.createElement("SPAN");e.style.fontFamily=t,this.nodeChange(e,["font-family"],null,null)}else this.nodeChange(null,["font-family"],["span"],!0);this.submenuOff()}},fontSize:{name:"fontSize",display:"submenu",add:function(e,t){const n=e.context;n.fontSize={targetText:t.querySelector(".txt"),_sizeList:null,currentSize:""};let i=this.setSubmenu(e),l=i.querySelector("ul");l.addEventListener("click",this.pickup.bind(e)),n.fontSize._sizeList=l.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null,l=null},setSubmenu:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");i.className="se-submenu se-list-layer se-list-font-size";const l=t.fontSize?t.fontSize:[8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];let o='<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="'+n.toolbar.default+'">('+n.toolbar.default+")</button></li>";for(let e,n=0,i=t.fontSizeUnit,s=l.length;n<s;n++)e=l[n],o+='<li><button type="button" class="se-btn-list" data-value="'+e+i+'" title="'+e+i+'" style="font-size:'+e+i+';">'+e+"</button></li>";return o+="</ul></div>",i.innerHTML=o,i},active:function(e){if(e){if(e.style&&e.style.fontSize.length>0)return this.util.changeTxt(this.context.fontSize.targetText,e.style.fontSize),!0}else this.util.changeTxt(this.context.fontSize.targetText,this.lang.toolbar.fontSize);return!1},on:function(){const e=this.context.fontSize,t=e._sizeList,n=e.targetText.textContent;if(n!==e.currentSize){for(let e=0,i=t.length;e<i;e++)n===t[e].getAttribute("data-value")?this.util.addClass(t[e],"active"):this.util.removeClass(t[e],"active");e.currentSize=n}},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=e.target.getAttribute("data-value");if(t){const e=this.util.createElement("SPAN");e.style.fontSize=t,this.nodeChange(e,["font-size"],null,null)}else this.nodeChange(null,["font-size"],["span"],!0);this.submenuOff()}},fontColor:l,hiliteColor:o,horizontalRule:{name:"horizontalRule",display:"submenu",add:function(e,t){let n=this.setSubmenu(e);n.querySelector("ul").addEventListener("click",this.horizontalRulePick.bind(e)),e.initMenuTarget(this.name,t,n),n=null},setSubmenu:function(e){const t=e.lang,n=e.util.createElement("DIV");return n.className="se-submenu se-list-layer se-list-line",n.innerHTML='<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="solid" title="'+t.toolbar.hr_solid+'"><hr style="border-width: 1px 0 0; border-style: solid none none; border-color: black; border-image: initial; height: 1px;" /></button></li><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="dotted" title="'+t.toolbar.hr_dotted+'"><hr style="border-width: 1px 0 0; border-style: dotted none none; border-color: black; border-image: initial; height: 1px;" /></button></li><li><button type="button" class="se-btn-list btn_line" data-command="horizontalRule" data-value="dashed" title="'+t.toolbar.hr_dashed+'"><hr style="border-width: 1px 0 0; border-style: dashed none none; border-color: black; border-image: initial; height: 1px;" /></button></li></ul></div>',n},appendHr:function(e){const t=this.util.createElement("HR");return t.className=e,this.focus(),this.insertComponent(t,!1,!0,!1)},horizontalRulePick:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n=null;for(;!n&&!/UL/i.test(t.tagName);)n=t.getAttribute("data-value"),t=t.parentNode;if(!n)return;const i=this.plugins.horizontalRule.appendHr.call(this,"__se__"+n);i&&(this.setRange(i,0,i,0),this.submenuOff())}},list:{name:"list",display:"submenu",add:function(e,t){const n=e.context;n.list={targetButton:t,_list:null,currentList:"",icons:{bullets:e.icons.list_bullets,number:e.icons.list_number}};let i=this.setSubmenu(e),l=i.querySelector("ul");l.addEventListener("click",this.pickup.bind(e)),n.list._list=l.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null,l=null},setSubmenu:function(e){const t=e.lang,n=e.util.createElement("DIV");return n.className="se-submenu se-list-layer",n.innerHTML='<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list se-tooltip" data-command="OL" title="'+t.toolbar.orderList+'">'+e.icons.list_number+'</button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="UL" title="'+t.toolbar.unorderList+'">'+e.icons.list_bullets+"</button></li></ul></div>",n},active:function(e){const t=this.context.list.targetButton,n=t.firstElementChild,i=this.util;if(e){if(i.isList(e)){const l=e.nodeName;return t.setAttribute("data-focus",l),i.addClass(t,"active"),/UL/i.test(l)?i.changeElement(n,this.context.list.icons.bullets):i.changeElement(n,this.context.list.icons.number),!0}}else t.removeAttribute("data-focus"),i.changeElement(n,this.context.list.icons.number),i.removeClass(t,"active");return!1},on:function(){const e=this.context.list,t=e._list,n=e.targetButton.getAttribute("data-focus")||"";if(n!==e.currentList){for(let e=0,i=t.length;e<i;e++)n===t[e].getAttribute("data-command")?this.util.addClass(t[e],"active"):this.util.removeClass(t[e],"active");e.currentList=n}},editList:function(e,t,n){let i=this.getRange(),l=t||this.getSelectedElementsAndComponents(!1);if(0===l.length){if(t)return;if(i=this.getRange_addLine(i,null),l=this.getSelectedElementsAndComponents(!1),0===l.length)return}const o=this.util;o.sortByDepth(l,!0);let s=l[0],a=l[l.length-1],r=!o.isListCell(s)&&!o.isComponent(s)||s.previousElementSibling?s.previousElementSibling:s.parentNode.previousElementSibling,c=!o.isListCell(a)&&!o.isComponent(a)||a.nextElementSibling?a.nextElementSibling:a.parentNode.nextElementSibling;const d={sc:i.startContainer,so:i.startOffset,ec:i.endContainer,eo:i.endOffset};let u=!0;for(let e=0,t=l.length;e<t;e++)if(!o.isList(o.getRangeFormatElement(l[e],function(t){return this.getRangeFormatElement(t)&&t!==l[e]}.bind(o)))){u=!1;break}if(!u||r&&s.tagName===r.tagName&&e===r.tagName.toUpperCase()||c&&a.tagName===c.tagName&&e===c.tagName.toUpperCase()){const t=r?r.parentNode:r,n=c?c.parentNode:c;r=t&&!o.isWysiwygDiv(t)&&t.nodeName===e?t:r,c=n&&!o.isWysiwygDiv(n)&&n.nodeName===e?n:c;const i=r&&r.tagName===e,s=c&&c.tagName===e;let a=i?r:o.createElement(e),d=null,u=null,h=null,g=null;const p=function(e){return!this.isComponent(e)&&!this.isList(e)}.bind(o);for(let t,n,s,r,c,g,m,f,_,b=0,v=l.length;b<v;b++)if(n=l[b],0!==n.childNodes.length||o._isIgnoreNodeChange(n)){if(r=l[b+1],c=n.parentNode,g=r?r.parentNode:null,s=o.isListCell(n),_=o.isRangeFormatElement(c)?c:null,m=s&&!o.isWysiwygDiv(c)?c.parentNode:c,f=s&&!o.isWysiwygDiv(c)?!r||o.isListCell(m)?c:c.nextSibling:n.nextSibling,t=o.createElement("LI"),o.copyFormatAttributes(t,n),o.isComponent(n)){const e=/^HR$/i.test(n.nodeName);e||(t.innerHTML="<br>"),t.innerHTML+=n.outerHTML,e&&(t.innerHTML+="<br>")}else{const e=n.childNodes;for(;e[0];)t.appendChild(e[0])}a.appendChild(t),r||(u=a),r&&m===g&&!o.isRangeFormatElement(f)||(d||(d=a),i&&r&&m===g||r&&o.isList(g)&&g===c||a.parentNode!==m&&m.insertBefore(a,f)),o.removeItem(n),i&&null===h&&(h=a.children.length-1),r&&(o.getRangeFormatElement(g,p)!==o.getRangeFormatElement(c,p)||o.isList(g)&&o.isList(c)&&o.getElementDepth(g)!==o.getElementDepth(c))&&(a=o.createElement(e)),_&&0===_.children.length&&o.removeItem(_)}else o.removeItem(n);h&&(d=d.children[h]),s&&(g=a.children.length-1,a.innerHTML+=c.innerHTML,u=a.children[g],o.removeItem(c))}else{if(n)for(let e=0,t=l.length;e<t;e++)for(let n=e-1;n>=0;n--)if(l[n].contains(l[e])){l.splice(e,1),e--,t--;break}const t=o.getRangeFormatElement(s),i=t&&t.tagName===e;let a,r;const c=function(e){return!this.isComponent(e)}.bind(o);i||(r=o.createElement(e));for(let t,s,d=0,u=l.length;d<u;d++)s=o.getRangeFormatElement(l[d],c),s&&o.isList(s)&&(t?t!==s?(n&&o.isListCell(s.parentNode)?this.plugins.list._detachNested.call(this,a.f):this.detachRangeFormatElement(a.f[0].parentNode,a.f,r,!1,!0),s=l[d].parentNode,i||(r=o.createElement(e)),t=s,a={r:t,f:[o.getParentElement(l[d],"LI")]}):a.f.push(o.getParentElement(l[d],"LI")):(t=s,a={r:t,f:[o.getParentElement(l[d],"LI")]}),d===u-1&&(n&&o.isListCell(s.parentNode)?this.plugins.list._detachNested.call(this,a.f):this.detachRangeFormatElement(a.f[0].parentNode,a.f,r,!1,!0)))}return this.effectNode=null,d},_detachNested:function(e){const t=e[0],n=e[e.length-1],i=n.nextElementSibling,l=t.parentNode,o=l.parentNode.nextElementSibling,s=l.parentNode.parentNode;for(let t=0,n=e.length;t<n;t++)s.insertBefore(e[t],o);if(i&&l.children.length>0){const e=l.cloneNode(!1),t=l.childNodes,o=this.util.getPositionIndex(i);for(;t[o];)e.appendChild(t[o]);n.appendChild(e)}0===l.children.length&&this.util.removeItem(l),this.util.mergeSameTags(s);const a=this.util.getEdgeChildNodes(t,n);return{cc:t.parentNode,sc:a.sc,ec:a.ec}},editInsideList:function(e,t){const n=(t=t||this.getSelectedElements().filter(function(e){return this.isListCell(e)}.bind(this.util))).length;if(0===n||!e&&!this.util.isListCell(t[0].previousElementSibling)&&!this.util.isListCell(t[n-1].nextElementSibling))return{sc:t[0],so:0,ec:t[n-1],eo:1};let i=t[0].parentNode,l=t[n-1],o=null;if(e){if(i!==l.parentNode&&this.util.isList(l.parentNode.parentNode)&&l.nextElementSibling)for(l=l.nextElementSibling;l;)t.push(l),l=l.nextElementSibling;o=this.plugins.list.editList.call(this,i.nodeName.toUpperCase(),t,!0)}else{let e=this.util.createElement(i.nodeName),s=t[0].previousElementSibling,a=l.nextElementSibling;const r={s:null,e:null,sl:i,el:i};for(let l,o=0,c=n;o<c;o++)l=t[o],l.parentNode!==i&&(this.plugins.list._insiedList.call(this,i,e,s,a,r),i=l.parentNode,e=this.util.createElement(i.nodeName)),s=l.previousElementSibling,a=l.nextElementSibling,e.appendChild(l);this.plugins.list._insiedList.call(this,i,e,s,a,r);const c=this.util.getNodeFromPath(r.s,r.sl),d=this.util.getNodeFromPath(r.e,r.el);o={sc:c,so:0,ec:d,eo:d.textContent.length}}return o},_insiedList:function(e,t,n,i,l){let o=!1;if(n&&t.tagName===n.tagName){const e=t.children;for(;e[0];)n.appendChild(e[0]);t=n,o=!0}if(i&&t.tagName===i.tagName){const e=i.children;for(;e[0];)t.appendChild(e[0]);const n=i.nextElementSibling;i.parentNode.removeChild(i),i=n}if(!o){this.util.isListCell(n)&&(e=n,i=null),e.insertBefore(t,i),l.s||(l.s=this.util.getNodePath(t.firstElementChild.firstChild,e,null),l.sl=e);const o=e.contains(l.sl)?this.util.getNodePath(l.sl,e):null;l.e=this.util.getNodePath(t.lastElementChild.firstChild,e,null),l.el=e,this.util.mergeSameTags(e,[l.s,l.e,o],!1),this.util.mergeNestedTags(e),o&&(l.sl=this.util.getNodeFromPath(o,e))}return t},pickup:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n="";for(;!n&&!/^UL$/i.test(t.tagName);)n=t.getAttribute("data-command"),t=t.parentNode;if(!n)return;const i=this.plugins.list.editList.call(this,n,null,!1);i&&this.setRange(i.sc,i.so,i.ec,i.eo),this.submenuOff(),this.history.push(!1)}},table:{name:"table",display:"submenu",add:function(e,t){const n=e.context;let i=n.table={_element:null,_tdElement:null,_trElement:null,_trElements:null,_tableXY:[],_maxWidth:!0,_fixedColumn:!1,_rtl:e.options.rtl,cellControllerTop:"top"===e.options.tableCellControllerPosition,resizeText:null,headerButton:null,mergeButton:null,splitButton:null,splitMenu:null,maxText:e.lang.controller.maxSize,minText:e.lang.controller.minSize,_physical_cellCnt:0,_logical_cellCnt:0,_rowCnt:0,_rowIndex:0,_physical_cellIndex:0,_logical_cellIndex:0,_current_colSpan:0,_current_rowSpan:0,icons:{expansion:e.icons.expansion,reduction:e.icons.reduction}},l=this.setSubmenu(e),o=l.querySelector(".se-controller-table-picker");i.tableHighlight=l.querySelector(".se-table-size-highlighted"),i.tableUnHighlight=l.querySelector(".se-table-size-unhighlighted"),i.tableDisplay=l.querySelector(".se-table-size-display"),e.options.rtl&&(i.tableHighlight.style.left="167px");let s=this.setController_table(e);i.tableController=s,i.resizeButton=s.querySelector("._se_table_resize"),i.resizeText=s.querySelector("._se_table_resize > span > span"),i.columnFixedButton=s.querySelector("._se_table_fixed_column"),i.headerButton=s.querySelector("._se_table_header");let a=this.setController_tableEditor(e,i.cellControllerTop);i.resizeDiv=a,i.splitMenu=a.querySelector(".se-btn-group-sub"),i.mergeButton=a.querySelector("._se_table_merge_button"),i.splitButton=a.querySelector("._se_table_split_button"),i.insertRowAboveButton=a.querySelector("._se_table_insert_row_a"),i.insertRowBelowButton=a.querySelector("._se_table_insert_row_b"),o.addEventListener("mousemove",this.onMouseMove_tablePicker.bind(e,i)),o.addEventListener("click",this.appendTable.bind(e)),a.addEventListener("click",this.onClick_tableController.bind(e)),s.addEventListener("click",this.onClick_tableController.bind(e)),e.initMenuTarget(this.name,t,l),n.element.relative.appendChild(a),n.element.relative.appendChild(s),l=null,o=null,a=null,s=null,i=null},setSubmenu:function(e){const t=e.util.createElement("DIV");return t.className="se-submenu se-selector-table",t.innerHTML='<div class="se-table-size"><div class="se-table-size-picker se-controller-table-picker"></div><div class="se-table-size-highlighted"></div><div class="se-table-size-unhighlighted"></div></div><div class="se-table-size-display">1 x 1</div>',t},setController_table:function(e){const t=e.lang,n=e.icons,i=e.util.createElement("DIV");return i.className="se-controller se-controller-table",i.innerHTML='<div><div class="se-btn-group"><button type="button" data-command="resize" class="se-btn se-tooltip _se_table_resize">'+n.expansion+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.maxSize+'</span></span></button><button type="button" data-command="layout" class="se-btn se-tooltip _se_table_fixed_column">'+n.fixed_column_width+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.fixedColumnWidth+'</span></span></button><button type="button" data-command="header" class="se-btn se-tooltip _se_table_header">'+n.table_header+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.tableHeader+'</span></span></button><button type="button" data-command="remove" class="se-btn se-tooltip">'+n.delete+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.remove+"</span></span></button></div></div>",i},setController_tableEditor:function(e,t){const n=e.lang,i=e.icons,l=e.util.createElement("DIV");return l.className="se-controller se-controller-table-cell",l.innerHTML=(t?"":'<div class="se-arrow se-arrow-up"></div>')+'<div class="se-btn-group"><button type="button" data-command="insert" data-value="row" data-option="up" class="se-btn se-tooltip _se_table_insert_row_a">'+i.insert_row_above+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.insertRowAbove+'</span></span></button><button type="button" data-command="insert" data-value="row" data-option="down" class="se-btn se-tooltip _se_table_insert_row_b">'+i.insert_row_below+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.insertRowBelow+'</span></span></button><button type="button" data-command="delete" data-value="row" class="se-btn se-tooltip">'+i.delete_row+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.deleteRow+'</span></span></button><button type="button" data-command="merge" class="_se_table_merge_button se-btn se-tooltip" disabled>'+i.merge_cell+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.mergeCells+'</span></span></button></div><div class="se-btn-group" style="padding-top: 0;"><button type="button" data-command="insert" data-value="cell" data-option="left" class="se-btn se-tooltip">'+i.insert_column_left+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.insertColumnBefore+'</span></span></button><button type="button" data-command="insert" data-value="cell" data-option="right" class="se-btn se-tooltip">'+i.insert_column_right+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.insertColumnAfter+'</span></span></button><button type="button" data-command="delete" data-value="cell" class="se-btn se-tooltip">'+i.delete_column+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.deleteColumn+'</span></span></button><button type="button" data-command="onsplit" class="_se_table_split_button se-btn se-tooltip">'+i.split_cell+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+n.controller.splitCells+'</span></span></button><div class="se-btn-group-sub sun-editor-common se-list-layer se-table-split"><div class="se-list-inner"><ul class="se-list-basic"><li class="se-btn-list" data-command="split" data-value="vertical" style="line-height:32px;" title="'+n.controller.VerticalSplit+'">'+n.controller.VerticalSplit+'</li><li class="se-btn-list" data-command="split" data-value="horizontal" style="line-height:32px;" title="'+n.controller.HorizontalSplit+'">'+n.controller.HorizontalSplit+"</li></ul></div></div></div>",l},appendTable:function(){const e=this.util.createElement("TABLE"),t=this.plugins.table.createCells,n=this.context.table._tableXY[0];let i=this.context.table._tableXY[1],l="<tbody>";for(;i>0;)l+="<tr>"+t.call(this,"td",n)+"</tr>",--i;l+="</tbody>",e.innerHTML=l;if(this.insertComponent(e,!1,!0,!1)){const t=e.querySelector("td div");this.setRange(t,0,t,0),this.plugins.table.reset_table_picker.call(this)}},createCells:function(e,t,n){if(e=e.toLowerCase(),n){const t=this.util.createElement(e);return t.innerHTML="<div><br></div>",t}{let n="";for(;t>0;)n+="<"+e+"><div><br></div></"+e+">",t--;return n}},onMouseMove_tablePicker:function(e,t){t.stopPropagation();let n=this._w.Math.ceil(t.offsetX/18),i=this._w.Math.ceil(t.offsetY/18);n=n<1?1:n,i=i<1?1:i,e._rtl&&(e.tableHighlight.style.left=18*n-13+"px",n=11-n),e.tableHighlight.style.width=n+"em",e.tableHighlight.style.height=i+"em",this.util.changeTxt(e.tableDisplay,n+" x "+i),e._tableXY=[n,i]},reset_table_picker:function(){if(!this.context.table.tableHighlight)return;const e=this.context.table.tableHighlight.style,t=this.context.table.tableUnHighlight.style;e.width="1em",e.height="1em",t.width="10em",t.height="10em",this.util.changeTxt(this.context.table.tableDisplay,"1 x 1"),this.submenuOff()},init:function(){const e=this.context.table,t=this.plugins.table;if(t._removeEvents.call(this),t._selectedTable){const e=t._selectedTable.querySelectorAll(".se-table-selected-cell");for(let t=0,n=e.length;t<n;t++)this.util.removeClass(e[t],"se-table-selected-cell")}t._toggleEditor.call(this,!0),e._element=null,e._tdElement=null,e._trElement=null,e._trElements=null,e._tableXY=[],e._maxWidth=!0,e._fixedColumn=!1,e._physical_cellCnt=0,e._logical_cellCnt=0,e._rowCnt=0,e._rowIndex=0,e._physical_cellIndex=0,e._logical_cellIndex=0,e._current_colSpan=0,e._current_rowSpan=0,t._shift=!1,t._selectedCells=null,t._selectedTable=null,t._ref=null,t._fixedCell=null,t._selectedCell=null,t._fixedCellName=null},call_controller_tableEdit:function(e){const t=this.plugins.table,n=this.context.table;if(!this.getSelection().isCollapsed&&!t._selectedCell)return this.controllersOff(),void this.util.removeClass(e,"se-table-selected-cell");const i=n._element||this.plugins.table._selectedTable||this.util.getParentElement(e,"TABLE");n._maxWidth=this.util.hasClass(i,"se-table-size-100")||"100%"===i.style.width||!i.style.width&&!this.util.hasClass(i,"se-table-size-auto"),n._fixedColumn=this.util.hasClass(i,"se-table-layout-fixed")||"fixed"===i.style.tableLayout,t.setTableStyle.call(this,n._maxWidth?"width|column":"width"),t.setPositionControllerTop.call(this,i),t.setPositionControllerDiv.call(this,e,t._shift),t._shift||this.controllersOn(n.resizeDiv,n.tableController,t.init.bind(this),e,"table")},setPositionControllerTop:function(e){this.setControllerPosition(this.context.table.tableController,e,"top",{left:0,top:0})},setPositionControllerDiv:function(e,t){const n=this.context.table,i=n.resizeDiv;this.plugins.table.setCellInfo.call(this,e,t),n.cellControllerTop?this.setControllerPosition(i,n._element,"top",{left:n.tableController.offsetWidth,top:0}):this.setControllerPosition(i,e,"bottom",{left:0,top:0})},setCellInfo:function(e,t){const n=this.context.table,i=n._element=this.plugins.table._selectedTable||this.util.getParentElement(e,"TABLE");if(/THEAD/i.test(i.firstElementChild.nodeName)?this.util.addClass(n.headerButton,"active"):this.util.removeClass(n.headerButton,"active"),t||0===n._physical_cellCnt){n._tdElement!==e&&(n._tdElement=e,n._trElement=e.parentNode);const t=n._trElements=i.rows,l=e.cellIndex;let o=0;for(let e=0,n=t[0].cells,i=t[0].cells.length;e<i;e++)o+=n[e].colSpan;const s=n._rowIndex=n._trElement.rowIndex;n._rowCnt=t.length,n._physical_cellCnt=n._trElement.cells.length,n._logical_cellCnt=o,n._physical_cellIndex=l,n._current_colSpan=n._tdElement.colSpan-1,n._current_rowSpan,n._trElement.cells[l].rowSpan;let a=[],r=[];for(let e,i,o=0;o<=s;o++){e=t[o].cells,i=0;for(let t,c,d,u,h=0,g=e.length;h<g;h++){if(t=e[h],c=t.colSpan-1,d=t.rowSpan-1,u=h+i,r.length>0)for(let e,t=0;t<r.length;t++)e=r[t],e.row>o||(u>=e.index?(i+=e.cs,u+=e.cs,e.rs-=1,e.row=o+1,e.rs<1&&(r.splice(t,1),t--)):h===g-1&&(e.rs-=1,e.row=o+1,e.rs<1&&(r.splice(t,1),t--)));if(o===s&&h===l){n._logical_cellIndex=u;break}d>0&&a.push({index:u,cs:c+1,rs:d,row:-1}),i+=c}r=r.concat(a).sort((function(e,t){return e.index-t.index})),a=[]}a=null,r=null}},editTable:function(e,t){const n=this.plugins.table,i=this.context.table,l=i._element,o="row"===e;if(o){const e=i._trElement.parentNode;if(/^THEAD$/i.test(e.nodeName)){if("up"===t)return;if(!e.nextElementSibling||!/^TBODY$/i.test(e.nextElementSibling.nodeName))return void(l.innerHTML+="<tbody><tr>"+n.createCells.call(this,"td",i._logical_cellCnt,!1)+"</tr></tbody>")}}if(n._ref){const e=i._tdElement,l=n._selectedCells;if(o)if(t)n.setCellInfo.call(this,"up"===t?l[0]:l[l.length-1],!0),n.editRow.call(this,t,e);else{let e=l[0].parentNode;const i=[l[0]];for(let t,n=1,o=l.length;n<o;n++)t=l[n],e!==t.parentNode&&(i.push(t),e=t.parentNode);for(let e=0,l=i.length;e<l;e++)n.setCellInfo.call(this,i[e],!0),n.editRow.call(this,t)}else{const i=l[0].parentNode;if(t){let o=null;for(let e=0,t=l.length-1;e<t;e++)if(i!==l[e+1].parentNode){o=l[e];break}n.setCellInfo.call(this,"left"===t?l[0]:o||l[0],!0),n.editCell.call(this,t,e)}else{const e=[l[0]];for(let t,n=1,o=l.length;n<o&&(t=l[n],i===t.parentNode);n++)e.push(t);for(let i=0,l=e.length;i<l;i++)n.setCellInfo.call(this,e[i],!0),n.editCell.call(this,t)}}t||n.init.call(this)}else n[o?"editRow":"editCell"].call(this,t);if(!t){const e=l.children;for(let t=0;t<e.length;t++)0===e[t].children.length&&(this.util.removeItem(e[t]),t--);0===l.children.length&&this.util.removeItem(l)}},editRow:function(e,t){const n=this.context.table,i=!e,l="up"===e,o=n._rowIndex,s=i||l?o:o+n._current_rowSpan+1,a=i?-1:1,r=n._trElements;let c=n._logical_cellCnt;for(let e,t=0,n=o+(i?-1:0);t<=n;t++){if(e=r[t].cells,0===e.length)return;for(let n,i,l=0,o=e.length;l<o;l++)n=e[l].rowSpan,i=e[l].colSpan,n<2&&i<2||n+t>s&&s>t&&(e[l].rowSpan=n+a,c-=i)}if(i){const e=r[o+1];if(e){const t=[];let n=r[o].cells,i=0;for(let e,l,o=0,s=n.length;o<s;o++)e=n[o],l=o+i,i+=e.colSpan-1,e.rowSpan>1&&(e.rowSpan-=1,t.push({cell:e.cloneNode(!1),index:l}));if(t.length>0){let l=t.shift();n=e.cells,i=0;for(let o,s,a=0,r=n.length;a<r&&(o=n[a],s=a+i,i+=o.colSpan-1,!(s>=l.index)||(a--,i--,i+=l.cell.colSpan-1,e.insertBefore(l.cell,o),l=t.shift(),l));a++);if(l){e.appendChild(l.cell);for(let n=0,i=t.length;n<i;n++)e.appendChild(t[n].cell)}}}n._element.deleteRow(s)}else{n._element.insertRow(s).innerHTML=this.plugins.table.createCells.call(this,"td",c,!1)}i?this.controllersOff():this.plugins.table.setPositionControllerDiv.call(this,t||n._tdElement,!0)},editCell:function(e,t){const n=this.context.table,i=this.util,l=!e,o="left"===e,s=n._current_colSpan,a=l||o?n._logical_cellIndex:n._logical_cellIndex+s+1,r=n._trElements;let c=[],d=[],u=0;const h=[],g=[];for(let e,t,o,p,m,f,_=0,b=n._rowCnt;_<b;_++){e=r[_],t=a,m=!1,o=e.cells,f=0;for(let e,n,r,p,b=0,v=o.length;b<v&&(e=o[b],e);b++)if(n=e.rowSpan-1,r=e.colSpan-1,l){if(p=b+f,d.length>0){const e=!o[b+1];for(let t,n=0;n<d.length;n++)t=d[n],t.row>_||(p>=t.index?(f+=t.cs,p=b+f,t.rs-=1,t.row=_+1,t.rs<1&&(d.splice(n,1),n--)):e&&(t.rs-=1,t.row=_+1,t.rs<1&&(d.splice(n,1),n--)))}n>0&&c.push({rs:n,cs:r+1,index:p,row:-1}),p>=t&&p+r<=t+s?h.push(e):p<=t+s&&p+r>=t?e.colSpan-=i.getOverlapRangeAtIndex(a,a+s,p,p+r):n>0&&(p<t||p+r>t+s)&&g.push({cell:e,i:_,rs:_+n}),f+=r}else{if(b>=t)break;if(r>0){if(u<1&&r+b>=t){e.colSpan+=1,t=null,u=n+1;break}t-=r}if(!m){for(let e,n=0;n<d.length;n++)e=d[n],t-=e.cs,e.rs-=1,e.rs<1&&(d.splice(n,1),n--);m=!0}}if(d=d.concat(c).sort((function(e,t){return e.index-t.index})),c=[],!l){if(u>0){u-=1;continue}null!==t&&o.length>0&&(p=this.plugins.table.createCells.call(this,o[0].nodeName,0,!0),p=e.insertBefore(p,o[t]))}}if(l){let e,t;for(let n,l=0,o=h.length;l<o;l++)n=h[l].parentNode,i.removeItem(h[l]),0===n.cells.length&&(e||(e=i.getArrayIndex(r,n)),t=i.getArrayIndex(r,n),i.removeItem(n));for(let n,l=0,o=g.length;l<o;l++)n=g[l],n.cell.rowSpan=i.getOverlapRangeAtIndex(e,t,n.i,n.rs);this.controllersOff()}else this.plugins.table.setPositionControllerDiv.call(this,t||n._tdElement,!0)},_closeSplitMenu:null,openSplitMenu:function(){this.util.addClass(this.context.table.splitButton,"on"),this.context.table.splitMenu.style.display="inline-table",this.plugins.table._closeSplitMenu=function(){this.util.removeClass(this.context.table.splitButton,"on"),this.context.table.splitMenu.style.display="none",this.removeDocEvent("click",this.plugins.table._closeSplitMenu),this.plugins.table._closeSplitMenu=null}.bind(this),this.addDocEvent("click",this.plugins.table._closeSplitMenu)},splitCells:function(e){const t=this.util,n="vertical"===e,i=this.context.table,l=i._tdElement,o=i._trElements,s=i._trElement,a=i._logical_cellIndex,r=i._rowIndex,c=this.plugins.table.createCells.call(this,l.nodeName,0,!0);if(n){const e=l.colSpan;if(c.rowSpan=l.rowSpan,e>1)c.colSpan=this._w.Math.floor(e/2),l.colSpan=e-c.colSpan,s.insertBefore(c,l.nextElementSibling);else{let t=[],n=[];for(let s,r,c=0,d=i._rowCnt;c<d;c++){s=o[c].cells,r=0;for(let i,o,d,u,h=0,g=s.length;h<g;h++){if(i=s[h],o=i.colSpan-1,d=i.rowSpan-1,u=h+r,n.length>0)for(let e,t=0;t<n.length;t++)e=n[t],e.row>c||(u>=e.index?(r+=e.cs,u+=e.cs,e.rs-=1,e.row=c+1,e.rs<1&&(n.splice(t,1),t--)):h===g-1&&(e.rs-=1,e.row=c+1,e.rs<1&&(n.splice(t,1),t--)));if(u<=a&&d>0&&t.push({index:u,cs:o+1,rs:d,row:-1}),i!==l&&u<=a&&u+o>=a+e-1){i.colSpan+=1;break}if(u>a)break;r+=o}n=n.concat(t).sort((function(e,t){return e.index-t.index})),t=[]}s.insertBefore(c,l.nextElementSibling)}}else{const e=l.rowSpan;if(c.colSpan=l.colSpan,e>1){c.rowSpan=this._w.Math.floor(e/2);const n=e-c.rowSpan,i=[],r=t.getArrayIndex(o,s)+n;for(let e,t,n=0;n<r;n++){e=o[n].cells,t=0;for(let l,o,s,c=0,d=e.length;c<d&&(s=c+t,!(s>=a));c++)l=e[c],o=l.rowSpan-1,o>0&&o+n>=r&&s<a&&i.push({index:s,cs:l.colSpan}),t+=l.colSpan-1}const d=o[r],u=d.cells;let h=i.shift();for(let e,t,n,l,o=0,s=u.length,r=0;o<s;o++){if(n=o+r,e=u[o],t=e.colSpan-1,l=n+t+1,h&&l>=h.index&&(r+=h.cs,l+=h.cs,h=i.shift()),l>=a||o===s-1){d.insertBefore(c,e.nextElementSibling);break}r+=t}l.rowSpan=n}else{c.rowSpan=l.rowSpan;const e=t.createElement("TR");e.appendChild(c);for(let e,t=0;t<r;t++){if(e=o[t].cells,0===e.length)return;for(let n=0,i=e.length;n<i;n++)t+e[n].rowSpan-1>=r&&(e[n].rowSpan+=1)}const n=i._physical_cellIndex,a=s.cells;for(let e=0,t=a.length;e<t;e++)e!==n&&(a[e].rowSpan+=1);s.parentNode.insertBefore(e,s.nextElementSibling)}}this.focusEdge(l),this.plugins.table.setPositionControllerDiv.call(this,l,!0)},mergeCells:function(){const e=this.plugins.table,t=this.context.table,n=this.util,i=e._ref,l=e._selectedCells,o=l[0];let s=null,a=null,r=i.ce-i.cs+1,c=i.re-i.rs+1,d="",u=null;for(let e,t,i=1,o=l.length;i<o;i++){e=l[i],u!==e.parentNode&&(u=e.parentNode),t=e.children;for(let e=0,i=t.length;e<i;e++)n.isFormatElement(t[e])&&n.onlyZeroWidthSpace(t[e].textContent)&&n.removeItem(t[e]);d+=e.innerHTML,n.removeItem(e),0===u.cells.length&&(s?a=u:s=u,c-=1)}if(s){const e=t._trElements,i=n.getArrayIndex(e,s),l=n.getArrayIndex(e,a||s),o=[];for(let t,s=0;s<=l;s++)if(t=e[s].cells,0!==t.length)for(let e,o,a=0,r=t.length;a<r;a++)e=t[a],o=e.rowSpan-1,o>0&&s+o>=i&&(e.rowSpan-=n.getOverlapRangeAtIndex(i,l,s,s+o));else o.push(e[s]);for(let e=0,t=o.length;e<t;e++)n.removeItem(o[e])}o.innerHTML+=d,o.colSpan=r,o.rowSpan=c,this.controllersOff(),e.setActiveButton.call(this,!0,!1),e.call_controller_tableEdit.call(this,o),n.addClass(o,"se-table-selected-cell"),this.focusEdge(o)},toggleHeader:function(){const e=this.util,t=this.context.table.headerButton,n=e.hasClass(t,"active"),i=this.context.table._element;if(n)e.removeItem(i.querySelector("thead"));else{const t=e.createElement("THEAD");t.innerHTML="<tr>"+this.plugins.table.createCells.call(this,"th",this.context.table._logical_cellCnt,!1)+"</tr>",i.insertBefore(t,i.firstElementChild)}e.toggleClass(t,"active"),/TH/i.test(this.context.table._tdElement.nodeName)?this.controllersOff():this.plugins.table.setPositionControllerDiv.call(this,this.context.table._tdElement,!1)},setTableStyle:function(e){const t=this.context.table,n=t._element;let i,l,o,s;e.indexOf("width")>-1&&(i=t.resizeButton.firstElementChild,l=t.resizeText,t._maxWidth?(o=t.icons.reduction,s=t.minText,t.columnFixedButton.style.display="block",this.util.removeClass(n,"se-table-size-auto"),this.util.addClass(n,"se-table-size-100")):(o=t.icons.expansion,s=t.maxText,t.columnFixedButton.style.display="none",this.util.removeClass(n,"se-table-size-100"),this.util.addClass(n,"se-table-size-auto")),this.util.changeElement(i,o),this.util.changeTxt(l,s)),e.indexOf("column")>-1&&(t._fixedColumn?(this.util.removeClass(n,"se-table-layout-auto"),this.util.addClass(n,"se-table-layout-fixed"),this.util.addClass(t.columnFixedButton,"active")):(this.util.removeClass(n,"se-table-layout-fixed"),this.util.addClass(n,"se-table-layout-auto"),this.util.removeClass(t.columnFixedButton,"active")))},setActiveButton:function(e,t){const n=this.context.table;/^TH$/i.test(e.nodeName)?(n.insertRowAboveButton.setAttribute("disabled",!0),n.insertRowBelowButton.setAttribute("disabled",!0)):(n.insertRowAboveButton.removeAttribute("disabled"),n.insertRowBelowButton.removeAttribute("disabled")),t&&e!==t?(n.splitButton.setAttribute("disabled",!0),n.mergeButton.removeAttribute("disabled")):(n.splitButton.removeAttribute("disabled"),n.mergeButton.setAttribute("disabled",!0))},_bindOnSelect:null,_bindOffSelect:null,_bindOffShift:null,_selectedCells:null,_shift:!1,_fixedCell:null,_fixedCellName:null,_selectedCell:null,_selectedTable:null,_ref:null,_toggleEditor:function(e){this.context.element.wysiwyg.setAttribute("contenteditable",e),e?this.util.removeClass(this.context.element.wysiwyg,"se-disabled"):this.util.addClass(this.context.element.wysiwyg,"se-disabled")},_offCellMultiSelect:function(e){e.stopPropagation();const t=this.plugins.table;t._shift?t._initBind&&(this._wd.removeEventListener("touchmove",t._initBind),t._initBind=null):(t._removeEvents.call(this),t._toggleEditor.call(this,!0)),t._fixedCell&&t._selectedTable&&(t.setActiveButton.call(this,t._fixedCell,t._selectedCell),t.call_controller_tableEdit.call(this,t._selectedCell||t._fixedCell),t._selectedCells=t._selectedTable.querySelectorAll(".se-table-selected-cell"),t._selectedCell&&t._fixedCell&&this.focusEdge(t._selectedCell),t._shift||(t._fixedCell=null,t._selectedCell=null,t._fixedCellName=null))},_onCellMultiSelect:function(e){this._antiBlur=!0;const t=this.plugins.table,n=this.util.getParentElement(e.target,this.util.isCell);if(t._shift)n===t._fixedCell?t._toggleEditor.call(this,!0):t._toggleEditor.call(this,!1);else if(!t._ref){if(n===t._fixedCell)return;t._toggleEditor.call(this,!1)}n&&n!==t._selectedCell&&t._fixedCellName===n.nodeName&&t._selectedTable===this.util.getParentElement(n,"TABLE")&&(t._selectedCell=n,t._setMultiCells.call(this,t._fixedCell,n))},_setMultiCells:function(e,t){const n=this.plugins.table,i=n._selectedTable.rows,l=this.util,o=n._selectedTable.querySelectorAll(".se-table-selected-cell");for(let e=0,t=o.length;e<t;e++)l.removeClass(o[e],"se-table-selected-cell");if(e===t&&(l.addClass(e,"se-table-selected-cell"),!n._shift))return;let s=!0,a=[],r=[];const c=n._ref={_i:0,cs:null,ce:null,rs:null,re:null};for(let n,o,d=0,u=i.length;d<u;d++){n=i[d].cells,o=0;for(let i,u,h,g,p=0,m=n.length;p<m;p++){if(i=n[p],h=i.colSpan-1,g=i.rowSpan-1,u=p+o,a.length>0)for(let e,t=0;t<a.length;t++)e=a[t],e.row>d||(u>=e.index?(o+=e.cs,u+=e.cs,e.rs-=1,e.row=d+1,e.rs<1&&(a.splice(t,1),t--)):p===m-1&&(e.rs-=1,e.row=d+1,e.rs<1&&(a.splice(t,1),t--)));if(s){if(i!==e&&i!==t||(c.cs=null!==c.cs&&c.cs<u?c.cs:u,c.ce=null!==c.ce&&c.ce>u+h?c.ce:u+h,c.rs=null!==c.rs&&c.rs<d?c.rs:d,c.re=null!==c.re&&c.re>d+g?c.re:d+g,c._i+=1),2===c._i){s=!1,a=[],r=[],d=-1;break}}else if(l.getOverlapRangeAtIndex(c.cs,c.ce,u,u+h)&&l.getOverlapRangeAtIndex(c.rs,c.re,d,d+g)){const e=c.cs<u?c.cs:u,t=c.ce>u+h?c.ce:u+h,n=c.rs<d?c.rs:d,o=c.re>d+g?c.re:d+g;if(c.cs!==e||c.ce!==t||c.rs!==n||c.re!==o){c.cs=e,c.ce=t,c.rs=n,c.re=o,d=-1,a=[],r=[];break}l.addClass(i,"se-table-selected-cell")}g>0&&r.push({index:u,cs:h+1,rs:g,row:-1}),o+=i.colSpan-1}a=a.concat(r).sort((function(e,t){return e.index-t.index})),r=[]}},_removeEvents:function(){const e=this.plugins.table;e._initBind&&(this._wd.removeEventListener("touchmove",e._initBind),e._initBind=null),e._bindOnSelect&&(this._wd.removeEventListener("mousedown",e._bindOnSelect),this._wd.removeEventListener("mousemove",e._bindOnSelect),e._bindOnSelect=null),e._bindOffSelect&&(this._wd.removeEventListener("mouseup",e._bindOffSelect),e._bindOffSelect=null),e._bindOffShift&&(this._wd.removeEventListener("keyup",e._bindOffShift),e._bindOffShift=null)},_initBind:null,onTableCellMultiSelect:function(e,t){const n=this.plugins.table;n._removeEvents.call(this),this.controllersOff(),n._shift=t,n._fixedCell=e,n._fixedCellName=e.nodeName,n._selectedTable=this.util.getParentElement(e,"TABLE");const i=n._selectedTable.querySelectorAll(".se-table-selected-cell");for(let e=0,t=i.length;e<t;e++)this.util.removeClass(i[e],"se-table-selected-cell");this.util.addClass(e,"se-table-selected-cell"),n._bindOnSelect=n._onCellMultiSelect.bind(this),n._bindOffSelect=n._offCellMultiSelect.bind(this),t?(n._bindOffShift=function(){this.controllersOn(this.context.table.resizeDiv,this.context.table.tableController,this.plugins.table.init.bind(this),e,"table"),n._ref||this.controllersOff()}.bind(this),this._wd.addEventListener("keyup",n._bindOffShift,!1),this._wd.addEventListener("mousedown",n._bindOnSelect,!1)):this._wd.addEventListener("mousemove",n._bindOnSelect,!1),this._wd.addEventListener("mouseup",n._bindOffSelect,!1),n._initBind=n.init.bind(this),this._wd.addEventListener("touchmove",n._initBind,!1)},onClick_tableController:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command")?e.target:e.target.parentNode;if(t.getAttribute("disabled"))return;const n=t.getAttribute("data-command"),i=t.getAttribute("data-value"),l=t.getAttribute("data-option"),o=this.plugins.table;if("function"==typeof o._closeSplitMenu&&(o._closeSplitMenu(),"onsplit"===n))return;if(!n)return;e.preventDefault();const s=this.context.table;switch(n){case"insert":case"delete":o.editTable.call(this,i,l);break;case"header":o.toggleHeader.call(this);break;case"onsplit":o.openSplitMenu.call(this);break;case"split":o.splitCells.call(this,i);break;case"merge":o.mergeCells.call(this);break;case"resize":s._maxWidth=!s._maxWidth,o.setTableStyle.call(this,"width"),o.setPositionControllerTop.call(this,s._element),o.setPositionControllerDiv.call(this,s._tdElement,o._shift);break;case"layout":s._fixedColumn=!s._fixedColumn,o.setTableStyle.call(this,"column"),o.setPositionControllerTop.call(this,s._element),o.setPositionControllerDiv.call(this,s._tdElement,o._shift);break;case"remove":const e=s._element.parentNode;this.util.removeItem(s._element),this.controllersOff(),e!==this.context.element.wysiwyg&&this.util.removeItemAllParents(e,(function(e){return 0===e.childNodes.length}),null),this.focus()}this.history.push(!1)}},formatBlock:{name:"formatBlock",display:"submenu",add:function(e,t){const n=e.context;n.formatBlock={targetText:t.querySelector(".txt"),targetTooltip:t.parentNode.querySelector(".se-tooltip-text"),_formatList:null,currentFormat:""};let i=this.setSubmenu(e);i.querySelector("ul").addEventListener("click",this.pickUp.bind(e)),n.formatBlock._formatList=i.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null},setSubmenu:function(e){const t=e.options,n=e.lang.toolbar,i=e.util.createElement("DIV");i.className="se-submenu se-list-layer se-list-format";const l=["p","div","blockquote","pre","h1","h2","h3","h4","h5","h6"],o=t.formats&&0!==t.formats.length?t.formats:l;let s='<div class="se-list-inner"><ul class="se-list-basic">';for(let e,t,i,a,r,c,d,u=0,h=o.length;u<h;u++)e=o[u],"string"==typeof e&&l.indexOf(e)>-1?(t=e.toLowerCase(),i="blockquote"===t?"range":"pre"===t?"free":"replace",r=/^h/.test(t)?t.match(/\d+/)[0]:"",a=n["tag_"+(r?"h":t)]+r,d="",c=""):(t=e.tag.toLowerCase(),i=e.command,a=e.name||t,d=e.class,c=d?' class="'+d+'"':""),s+='<li><button type="button" class="se-btn-list" data-command="'+i+'" data-value="'+t+'" data-class="'+d+'" title="'+a+'"><'+t+c+">"+a+"</"+t+"></button></li>";return s+="</ul></div>",i.innerHTML=s,i},active:function(e){let t=this.lang.toolbar.formats;const n=this.context.formatBlock.targetText,i=this.context.formatBlock.targetTooltip;if(e){if(this.util.isFormatElement(e)){const l=this.context.formatBlock._formatList,o=e.nodeName.toLowerCase(),s=(e.className.match(/(\s|^)__se__format__[^\s]+/)||[""])[0].trim();for(let e,n=0,i=l.length;n<i;n++)if(e=l[n],o===e.getAttribute("data-value")&&s===e.getAttribute("data-class")){t=e.title;break}return this.util.changeTxt(n,t),this.util.changeTxt(i,t),n.setAttribute("data-value",o),n.setAttribute("data-class",s),!0}}else this.util.changeTxt(n,t),this.util.changeTxt(i,t);return!1},on:function(){const e=this.context.formatBlock,t=e._formatList,n=e.targetText,i=(n.getAttribute("data-value")||"")+(n.getAttribute("data-class")||"");if(i!==e.currentFormat){for(let e,n=0,l=t.length;n<l;n++)e=t[n],i===e.getAttribute("data-value")+e.getAttribute("data-class")?this.util.addClass(e,"active"):this.util.removeClass(e,"active");e.currentFormat=i}},pickUp:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n=null,i=null,l=null,o="";for(;!n&&!/UL/i.test(t.tagName);){if(n=t.getAttribute("data-command"),i=t.getAttribute("data-value"),o=t.getAttribute("data-class"),n){l=t.firstChild;break}t=t.parentNode}if(n){if("range"===n){const e=l.cloneNode(!1);this.applyRangeFormatElement(e)}else{let e=this.getRange(),t=this.getSelectedElementsAndComponents(!1);if(0===t.length&&(e=this.getRange_addLine(e,null),t=this.getSelectedElementsAndComponents(!1),0===t.length))return;const s=e.startOffset,a=e.endOffset,r=this.util;let c=t[0],d=t[t.length-1];const u=r.getNodePath(e.startContainer,c,null,null),h=r.getNodePath(e.endContainer,d,null,null),g=this.detachList(t,!1);g.sc&&(c=g.sc),g.ec&&(d=g.ec),this.setRange(r.getNodeFromPath(u,c),s,r.getNodeFromPath(h,d),a);const p=this.getSelectedElementsAndComponents(!1);if("free"===n){const e=p.length-1;let t=p[e].parentNode,n=l.cloneNode(!1);const i=n;for(let i,o,s,a,c,d,u=e,h=!0;u>=0;u--)if(i=p[u],i!==(p[u+1]?p[u+1].parentNode:null)){if(d=r.isComponent(i),o=d?"":i.innerHTML.replace(/(?!>)\s+(?=<)|\n/g," "),s=r.getParentElement(i,(function(e){return e.parentNode===t})),(t!==i.parentNode||d)&&(r.isFormatElement(t)?(t.parentNode.insertBefore(n,t.nextSibling),t=t.parentNode):(t.insertBefore(n,s?s.nextSibling:null),t=i.parentNode),a=n.nextSibling,a&&n.nodeName===a.nodeName&&r.isSameAttributes(n,a)&&(n.innerHTML+="<BR>"+a.innerHTML,r.removeItem(a)),n=l.cloneNode(!1),h=!0),c=n.innerHTML,n.innerHTML=(h||!o||!c||/<br>$/i.test(o)?o:o+"<BR>")+c,0===u){t.insertBefore(n,i),a=i.nextSibling,a&&n.nodeName===a.nodeName&&r.isSameAttributes(n,a)&&(n.innerHTML+="<BR>"+a.innerHTML,r.removeItem(a));const e=n.previousSibling;e&&n.nodeName===e.nodeName&&r.isSameAttributes(n,e)&&(e.innerHTML+="<BR>"+n.innerHTML,r.removeItem(n))}d||r.removeItem(i),o&&(h=!1)}this.setRange(i,0,i,0)}else{for(let e,t,n=0,s=p.length;n<s;n++)e=p[n],e.nodeName.toLowerCase()===i.toLowerCase()&&(e.className.match(/(\s|^)__se__format__[^\s]+/)||[""])[0].trim()===o||r.isComponent(e)||(t=l.cloneNode(!1),r.copyFormatAttributes(t,e),t.innerHTML=e.innerHTML,e.parentNode.replaceChild(t,e)),0===n&&(c=t||e),n===s-1&&(d=t||e),t=null;this.setRange(r.getNodeFromPath(u,c),s,r.getNodeFromPath(h,d),a)}this.history.push(!1)}this.submenuOff()}}},lineHeight:{name:"lineHeight",display:"submenu",add:function(e,t){const n=e.context;n.lineHeight={_sizeList:null,currentSize:-1};let i=this.setSubmenu(e),l=i.querySelector("ul");l.addEventListener("click",this.pickup.bind(e)),n.lineHeight._sizeList=l.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null,l=null},setSubmenu:function(e){const t=e.options,n=e.lang,i=e.util.createElement("DIV");i.className="se-submenu se-list-layer";const l=t.lineHeights?t.lineHeights:[{text:"1",value:1},{text:"1.15",value:1.15},{text:"1.5",value:1.5},{text:"2",value:2}];let o='<div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="default_value se-btn-list" title="'+n.toolbar.default+'">('+n.toolbar.default+")</button></li>";for(let e,t=0,n=l.length;t<n;t++)e=l[t],o+='<li><button type="button" class="se-btn-list" data-value="'+e.value+'" title="'+e.text+'">'+e.text+"</button></li>";return o+="</ul></div>",i.innerHTML=o,i},on:function(){const e=this.context.lineHeight,t=e._sizeList,n=this.util.getFormatElement(this.getSelectionNode()),i=n?n.style.lineHeight+"":"";if(i!==e.currentSize){for(let e=0,n=t.length;e<n;e++)i===t[e].getAttribute("data-value")?this.util.addClass(t[e],"active"):this.util.removeClass(t[e],"active");e.currentSize=i}},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=e.target.getAttribute("data-value")||"",n=this.getSelectedElements();for(let e=0,i=n.length;e<i;e++)n[e].style.lineHeight=t;this.submenuOff(),this.history.push(!1)}},template:s,paragraphStyle:{name:"paragraphStyle",display:"submenu",add:function(e,t){const n=e.context;n.paragraphStyle={_classList:null};let i=this.setSubmenu(e);i.querySelector("ul").addEventListener("click",this.pickUp.bind(e)),n.paragraphStyle._classList=i.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null},setSubmenu:function(e){const t=e.options,n=e.util.createElement("DIV");n.className="se-submenu se-list-layer se-list-format";const i=e.lang.menu,l={spaced:{name:i.spaced,class:"__se__p-spaced",_class:""},bordered:{name:i.bordered,class:"__se__p-bordered",_class:""},neon:{name:i.neon,class:"__se__p-neon",_class:""}},o=t.paragraphStyles&&0!==t.paragraphStyles.length?t.paragraphStyles:["spaced","bordered","neon"];let s='<div class="se-list-inner"><ul class="se-list-basic">';for(let e,t,n,i,a=0,r=o.length;a<r;a++){if(e=o[a],"string"==typeof e){const t=l[e.toLowerCase()];if(!t)continue;e=t}t=e.name,n=e.class?' class="'+e.class+'"':"",i=e._class,s+='<li><button type="button" class="se-btn-list'+(i?" "+i:"")+'" data-value="'+e.class+'" title="'+t+'"><div'+n+">"+t+"</div></button></li>"}return s+="</ul></div>",n.innerHTML=s,n},on:function(){const e=this.context.paragraphStyle._classList,t=this.util.getFormatElement(this.getSelectionNode());for(let n=0,i=e.length;n<i;n++)this.util.hasClass(t,e[n].getAttribute("data-value"))?this.util.addClass(e[n],"active"):this.util.removeClass(e[n],"active")},pickUp:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n=null;for(;!/^UL$/i.test(t.tagName)&&(n=t.getAttribute("data-value"),!n);)t=t.parentNode;if(!n)return;let i=this.getSelectedElements();if(0===i.length&&(this.getRange_addLine(this.getRange(),null),i=this.getSelectedElements(),0===i.length))return;const l=this.util.hasClass(t,"active")?this.util.removeClass.bind(this.util):this.util.addClass.bind(this.util);for(let e=0,t=i.length;e<t;e++)l(i[e],n);this.submenuOff(),this.history.push(!1)}},textStyle:{name:"textStyle",display:"submenu",add:function(e,t){const n=e.context;n.textStyle={_styleList:null};let i=this.setSubmenu(e),l=i.querySelector("ul");l.addEventListener("click",this.pickup.bind(e)),n.textStyle._styleList=i.querySelectorAll("li button"),e.initMenuTarget(this.name,t,i),i=null,l=null},setSubmenu:function(e){const t=e.options,n=e.util.createElement("DIV");n.className="se-submenu se-list-layer se-list-format";const i={code:{name:e.lang.menu.code,class:"__se__t-code",tag:"code"},translucent:{name:e.lang.menu.translucent,style:"opacity: 0.5;",tag:"span"},shadow:{name:e.lang.menu.shadow,class:"__se__t-shadow",tag:"span"}},l=t.textStyles?t.textStyles:e._w.Object.keys(i);let o='<div class="se-list-inner"><ul class="se-list-basic">';for(let e,t,n,s,a,r,c,d=0,u=l.length;d<u;d++){if(e=l[d],s="",r="",a=[],"string"==typeof e){const t=i[e.toLowerCase()];if(!t)continue;e=t}n=e.name,t=e.tag||"span",c=e._class,e.style&&(s+=' style="'+e.style+'"',r+=e.style.replace(/:[^;]+(;|$)\s*/g,","),a.push("style")),e.class&&(s+=' class="'+e.class+'"',r+="."+e.class.trim().replace(/\s+/g,",."),a.push("class")),r=r.replace(/,$/,""),o+='<li><button type="button" class="se-btn-list'+(c?" "+c:"")+'" data-command="'+t+'" data-value="'+r+'" title="'+n+'"><'+t+s+">"+n+"</"+t+"></button></li>"}return o+="</ul></div>",n.innerHTML=o,n},on:function(){const e=this.util,t=this.context.textStyle._styleList,n=this.getSelectionNode();for(let i,l,o,s=0,a=t.length;s<a;s++){i=t[s],l=i.getAttribute("data-value").split(",");for(let t,s,a=0;a<l.length;a++){for(t=n,o=!1;t&&!e.isFormatElement(t)&&!e.isComponent(t);){if(t.nodeName.toLowerCase()===i.getAttribute("data-command").toLowerCase()&&(s=l[a],/^\./.test(s)?e.hasClass(t,s.replace(/^\./,"")):t.style[s])){o=!0;break}t=t.parentNode}if(!o)break}o?e.addClass(i,"active"):e.removeClass(i,"active")}},pickup:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,n=null,i=null;for(;!n&&!/UL/i.test(t.tagName);){if(n=t.getAttribute("data-command"),n){i=t.firstChild;break}t=t.parentNode}if(!n)return;const l=i.style.cssText.replace(/:.+(;|$)/g,",").split(",");l.pop();const o=i.classList;for(let e=0,t=o.length;e<t;e++)l.push("."+o[e]);const s=this.util.hasClass(t,"active")?null:i.cloneNode(!1),a=s?null:[i.nodeName];this.nodeChange(s,l,a,!0),this.submenuOff()}},link:c,image:f,video:_,audio:b,math:v,imageGallery:{name:"imageGallery",add:function(e){e.addModule([C.a]);e.context.imageGallery={title:e.lang.toolbar.imageGallery,url:e.options.imageGalleryUrl,listClass:"se-image-list",itemTemplateHandler:this.drawItems,selectorHandler:this.setImage.bind(e),columnSize:4}},open:function(e){this.plugins.fileBrowser.open.call(this,"imageGallery",e)},drawItems:function(e){const t=e.src.split("/").pop();return'<div class="se-file-item-img"><img src="'+e.src+'" alt="'+(e.alt||t)+'" data-command="pick"><div class="se-file-img-name se-file-name-back"></div><div class="se-file-img-name __se__img_name">'+(e.name||t)+"</div></div>"},setImage:function(e){this.callPlugin("image",function(){const t={name:e.parentNode.querySelector(".__se__img_name").textContent,size:0};this.context.image._altText=e.alt,this.plugins.image.create_image.call(this,e.src,"",!1,this.context.image._origin_w,this.context.image._origin_h,"none",t)}.bind(this),null)}}},x={rtl:{italic:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.5 15.8" xml:space="preserve"><g><path d="M0.3,0.1c0.3,0,0.5,0,0.7,0c1,0.1,1.7,0.1,2.2,0.1H4L7.2,0l0.2,1.1H7c-0.5,0-1,0.1-1.5,0.3v0.4l0.3,1.9L6,4.4L6.3,6 l0.1,0.4l0.1,0.5c0.1,0.2,0.1,0.4,0.2,0.7s0.1,0.6,0.2,0.9L7,9.1l0.6,2.8l0.3,1.4c0.1,0.4,0.2,0.7,0.4,1c0.4,0.2,0.8,0.3,1.2,0.4 l0.8,0.2l0.2,0.9l-1.1,0c-0.9-0.1-1.5-0.1-1.8-0.1h-2c-0.9,0.1-1.4,0.2-1.5,0.2c-0.1,0-0.2,0-0.3,0H3.4c-0.1,0-0.2,0-0.2,0 l-0.1-0.4c0-0.2-0.1-0.4-0.1-0.6l0.7-0.1c0.4,0,0.8-0.1,1.2-0.2c0-0.1,0-0.2,0-0.3l-0.1-0.5l-0.4-2.4L4,9.6L3.4,6.4 C3.2,5.7,3,4.7,2.7,3.3c0-0.3-0.1-0.5-0.1-0.8C2.5,2.1,2.4,1.9,2.3,1.6C2,1.4,1.6,1.3,1.3,1.2C0.9,1.2,0.5,1.1,0.2,0.9L0,0.4L0,0 L0.3,0.1L0.3,0.1z"/></g></svg>',indent:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><g><path d="M15.5,10.1L15.5,10.1c0.1,0,0.3,0.1,0.3,0.3v1.7c0,0.1,0,0.1-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1l-15.2,0 c-0.1,0-0.1,0-0.2-0.1C0,12.2,0,12.2,0,12.1l0-1.7c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C0.3,10.1,15.5,10.1,15.5,10.1z M9.8,6.7c0.1,0,0.1,0,0.2,0.1C10.1,6.9,10.1,7,10.1,7v1.7c0,0.1,0,0.2-0.1,0.2C10,9,9.9,9,9.8,9L0.3,9C0.2,9,0.1,9,0.1,8.9 C0,8.9,0,8.8,0,8.7V7C0,7,0,6.9,0.1,6.8c0.1-0.1,0.1-0.1,0.2-0.1C0.3,6.7,9.8,6.7,9.8,6.7z M0.3,3.4h9.6h0c0.1,0,0.3,0.1,0.3,0.3 v1.7v0c0,0.1-0.1,0.3-0.3,0.3H0.3c-0.1,0-0.1,0-0.2-0.1C0,5.5,0,5.4,0,5.3V3.6c0-0.1,0-0.1,0.1-0.2C0.1,3.4,0.2,3.4,0.3,3.4 L0.3,3.4z M0.3,0l15.2,0c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2V2c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H0.3 c-0.1,0-0.1,0-0.2-0.1C0,2.1,0,2,0,2l0-1.7c0-0.1,0-0.1,0.1-0.2C0.1,0,0.2,0,0.3,0z"/></g><path d="M13.1,3.5L15.7,6c0.1,0.1,0.1,0.3,0,0.4l-2.5,2.5C13.1,9,13,9,12.9,9c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2V3.7 c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C13,3.4,13.1,3.4,13.1,3.5z"/></g></svg>',outdent:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><g><path d="M15.5,10.1L15.5,10.1c0.1,0,0.3,0.1,0.3,0.3v1.7c0,0.1,0,0.1-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1l-15.2,0 c-0.1,0-0.1,0-0.2-0.1C0,12.2,0,12.2,0,12.1l0-1.7c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.1-0.1,0.2-0.1C0.3,10.1,15.5,10.1,15.5,10.1z M9.8,6.7c0.1,0,0.1,0,0.2,0.1C10.1,6.9,10.1,7,10.1,7v1.7c0,0.1,0,0.2-0.1,0.2C10,9,9.9,9,9.8,9L0.3,9C0.2,9,0.1,9,0.1,8.9 C0,8.9,0,8.8,0,8.7V7C0,7,0,6.9,0.1,6.8c0.1-0.1,0.1-0.1,0.2-0.1C0.3,6.7,9.8,6.7,9.8,6.7z M0.3,3.4h9.6h0c0.1,0,0.3,0.1,0.3,0.3 v1.7v0c0,0.1-0.1,0.3-0.3,0.3H0.3c-0.1,0-0.1,0-0.2-0.1C0,5.5,0,5.4,0,5.3V3.6c0-0.1,0-0.1,0.1-0.2C0.1,3.4,0.2,3.4,0.3,3.4 L0.3,3.4z M0.3,0l15.2,0c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2V2c0,0.1,0,0.2-0.1,0.2c-0.1,0.1-0.1,0.1-0.2,0.1H0.3 c-0.1,0-0.1,0-0.2-0.1C0,2.1,0,2,0,2l0-1.7c0-0.1,0-0.1,0.1-0.2C0.1,0,0.2,0,0.3,0z"/></g><path d="M15.5,3.4c0.1,0,0.1,0,0.2,0.1c0.1,0.1,0.1,0.1,0.1,0.2v5.1c0,0.1,0,0.1-0.1,0.2C15.6,9,15.5,9,15.5,9 c-0.1,0-0.1,0-0.2-0.1l-2.5-2.5c-0.1-0.1-0.1-0.3,0-0.4l2.5-2.5C15.3,3.4,15.4,3.4,15.5,3.4z"/></g></svg>',list_bullets:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 12.4" xml:space="preserve"><g><path d="M12.4,10.7c0,0.9,0.8,1.7,1.7,1.7c0.9,0,1.7-0.8,1.7-1.7C15.7,9.8,15,9,14.1,9c-0.4,0-0.9,0.2-1.2,0.5 C12.5,9.8,12.4,10.2,12.4,10.7C12.4,10.7,12.4,10.7,12.4,10.7z M12.4,6.2c0,0.9,0.8,1.7,1.7,1.7c0.4,0,0.9-0.2,1.2-0.5 c0.3-0.3,0.4-0.7,0.4-1.1c0-0.9-0.7-1.7-1.6-1.7C13.1,4.6,12.4,5.3,12.4,6.2C12.4,6.2,12.4,6.2,12.4,6.2z M0,9.8v1.7 c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1l10.7,0c0,0,0,0,0,0c0.1,0,0.3-0.1,0.3-0.3V9.8c0-0.1,0-0.1-0.1-0.2 C11.1,9.6,11,9.6,11,9.6l-10.7,0c-0.1,0-0.1,0-0.2,0.1C0,9.7,0,9.8,0,9.8L0,9.8z M12.9,2.9c0.3,0.3,0.7,0.5,1.2,0.5 c0.4,0,0.9-0.2,1.2-0.5c0.7-0.7,0.7-1.7,0-2.4C14.9,0.2,14.5,0,14.1,0c-0.4,0-0.9,0.2-1.2,0.5c-0.3,0.3-0.5,0.7-0.5,1.2 C12.4,2.1,12.5,2.6,12.9,2.9z M0,5.3V7c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1H11c0.1,0,0.1,0,0.2-0.1 c0.1-0.1,0.1-0.1,0.1-0.2V5.3c0,0,0,0,0,0c0-0.1-0.1-0.3-0.3-0.3H0.3c-0.1,0-0.1,0-0.2,0.1C0,5.2,0,5.3,0,5.3L0,5.3z M0,0.8v1.7 c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1h10.7c0.1,0,0.1,0,0.2-0.1c0,0,0.1-0.1,0.1-0.2V0.8c0-0.1,0-0.1-0.1-0.2 c0-0.1-0.1-0.1-0.2-0.1H0.3c-0.1,0-0.1,0-0.2,0.1C0,0.7,0,0.8,0,0.8L0,0.8z"/></g></svg>',list_number:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M0,11.5l0,1.7c0,0.1,0,0.1,0.1,0.2c0.1,0.1,0.1,0.1,0.2,0.1H11c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2v-1.7 c0-0.1,0-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1H0.3c-0.1,0-0.2,0-0.2,0.1C0,11.4,0,11.4,0,11.5L0,11.5z M0,8.7c0,0.1,0,0.1,0.1,0.2 C0.1,8.9,0.2,9,0.3,9H11c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2V7c0-0.1,0-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1l-10.7,0 c-0.1,0-0.2,0-0.2,0.1C0,6.8,0,6.9,0,7C0,7,0,8.7,0,8.7z M0,2.5v1.7c0,0.1,0,0.1,0.1,0.2c0,0,0.1,0.1,0.2,0.1l10.7,0 c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0.1-0.1,0.1-0.2V2.4c0-0.1,0-0.1-0.1-0.2c-0.1,0-0.1,0-0.2,0H0.3c-0.1,0-0.1,0-0.2,0 C0,2.3,0,2.4,0,2.5L0,2.5z"/></g><path d="M15.6,14.2c0-0.3-0.1-0.6-0.3-0.8c-0.2-0.2-0.4-0.4-0.7-0.4l0.9-1v-0.8h-2.9v1.3h0.9v-0.5h0.9l0,0c-0.1,0.1-0.2,0.2-0.3,0.3 s-0.2,0.3-0.4,0.5l-0.3,0.3l0.2,0.5c0.6,0,0.9,0.1,0.9,0.5c0,0.1-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.1-0.4,0.1c-0.3,0-0.7-0.1-0.9-0.3 l-0.5,0.8c0.4,0.4,0.9,0.6,1.5,0.6c0.4,0,0.9-0.1,1.2-0.4C15.5,15.1,15.6,14.7,15.6,14.2z"/><path d="M15.6,8.7h-0.9v0.5h-1.1c0-0.2,0.2-0.4,0.4-0.5c0.2-0.2,0.4-0.3,0.7-0.4c0.3-0.2,0.5-0.3,0.7-0.6c0.2-0.2,0.3-0.5,0.3-0.8 c0-0.4-0.2-0.8-0.5-1c-0.6-0.4-1.4-0.5-2-0.1c-0.3,0.2-0.5,0.4-0.6,0.7L13.3,7c0.1-0.3,0.4-0.5,0.7-0.5c0.1,0,0.3,0,0.3,0.1 c0.1,0.1,0.1,0.2,0.1,0.3c0,0.2-0.1,0.3-0.2,0.4c-0.2,0.1-0.3,0.3-0.5,0.4c-0.2,0.1-0.4,0.3-0.6,0.4c-0.2,0.2-0.4,0.4-0.5,0.6 c-0.1,0.2-0.2,0.5-0.2,0.8c0,0.2,0,0.3,0,0.5h3.2L15.6,8.7L15.6,8.7z"/><path d="M15.6,3.6h-1V0h-0.9l-1.2,1.1l0.6,0.7c0.2-0.1,0.3-0.3,0.4-0.5l0,0v2.2h-0.9v0.9h3L15.6,3.6L15.6,3.6z"/></svg>',link:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M7.4,9.9l3.1,3.1c0.3,0.3,0.8,0.5,1.3,0.5c0.5,0,0.9-0.2,1.3-0.5c0,0,0,0,0,0c0.7-0.7,0.7-1.9,0-2.6L9.9,7.3 c0-0.1,0-0.2,0-0.3C9.9,7,10,7,10.1,7l2.2-0.2c0.1,0,0.1,0,0.2,0.1l2.1,2.1c0.4,0.4,0.7,0.8,0.9,1.3c0.2,0.5,0.3,1,0.3,1.5 c0,0.5-0.1,1-0.3,1.5c-0.8,2-3.2,3-5.2,2.2c-0.5-0.2-0.9-0.5-1.3-0.9l-2.1-2.1c-0.1,0-0.1-0.1-0.1-0.2L7,10.1C7,10,7,9.9,7.1,9.9 C7.2,9.8,7.3,9.9,7.4,9.9z M1.2,1.1C1.6,0.7,2,0.4,2.5,0.3c1-0.4,2.1-0.4,3.1,0C6,0.4,6.5,0.7,6.8,1.1L9,3.2C9,3.3,9.1,3.3,9,3.4 L8.8,5.6c0,0.1-0.1,0.2-0.2,0.2c-0.1,0.1-0.2,0.1-0.3,0L5.3,2.7C5,2.3,4.5,2.1,4,2.1c-0.5,0-0.9,0.2-1.3,0.5c0,0,0,0,0,0 C2,3.4,2,4.5,2.7,5.2l3.1,3.2c0.1,0.1,0.1,0.2,0,0.3c0,0.1-0.1,0.1-0.2,0.1L3.5,9C3.4,9,3.4,9,3.3,8.9L1.2,6.8c0,0,0,0,0,0 C-0.4,5.2-0.4,2.7,1.2,1.1L1.2,1.1z M14.3,6h-2.6c0,0,0,0,0,0c-0.1,0-0.2-0.1-0.2-0.2c0-0.1,0-0.2,0.1-0.3l2.5-0.7 c0.1,0,0.1,0,0.2,0c0.1,0,0.1,0.1,0.1,0.2l0.1,0.8c0,0.1,0,0.1-0.1,0.2C14.5,6,14.4,6,14.3,6L14.3,6z M10.2,4.1 c0,0.1-0.1,0.2-0.2,0.2l0,0c0,0,0,0,0,0C9.8,4.2,9.7,4.1,9.8,4L9.7,1.4c0-0.1,0-0.1,0.1-0.2c0.1,0,0.1,0,0.2,0h0.8 c0.1,0,0.1,0,0.2,0.1c0,0.1,0,0.1,0,0.2L10.2,4.1L10.2,4.1z M1.5,9.7h1.3h1.3c0.1,0,0.2,0.1,0.2,0.2c0,0.1,0,0.2-0.1,0.3l-2.5,0.6 H1.6c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.1-0.2L1.2,9.9c0-0.1,0-0.1,0.1-0.2c0-0.1,0.1-0.1,0.2-0.1L1.5,9.7z M5.6,11.6 C5.6,11.6,5.6,11.6,5.6,11.6c0-0.1,0.1-0.2,0.3-0.1c0,0,0,0,0,0c0.1,0,0.2,0.1,0.2,0.2v2.6c0,0.1,0,0.1-0.1,0.2 c0,0-0.1,0.1-0.2,0.1L5,14.5c-0.1,0-0.1,0-0.2-0.1c0-0.1,0-0.1,0-0.2L5.6,11.6L5.6,11.6z"/></g></svg>',unlink:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.7" xml:space="preserve"><g><path d="M14.6,14.6c1.6-1.6,1.6-4.1,0-5.7l0,0l-3.1-3.1l-1.2,1.6l2.9,2.9c0.4,0.4,0.6,0.9,0.6,1.5c0,1.1-0.9,2.1-2.1,2.1l0,0 c-0.6,0-1.1-0.2-1.5-0.6l-0.4-0.4l-1.7,1l0.8,0.8C10.4,16.2,13,16.2,14.6,14.6L14.6,14.6L14.6,14.6z M3.6,6C3,5.9,2.6,5.5,2.3,5 S1.9,4,2.1,3.4C2.3,2.9,2.6,2.5,3,2.2C3.5,2,4.1,1.9,4.6,2l3.3,1.4l0.5-2L5.1,0.1C4-0.1,2.9,0,2,0.5C1.1,1.1,0.4,1.9,0.2,3 C-0.1,4,0,5.1,0.6,6C1.1,6.9,1.9,7.6,3,7.8l5.4,2l0.5-2L6.2,6.9L3.6,6z"/></g></svg>'},redo:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.59 14.18"><g><path d="M11.58,18.48a6.84,6.84,0,1,1,6.85-6.85s0,.26,0,.67a8,8,0,0,1-.22,1.44l.91-.55a.51.51,0,0,1,.36,0,.45.45,0,0,1,.29.22.47.47,0,0,1,.06.36.45.45,0,0,1-.22.29L17.42,15.3l-.12,0h-.25l-.12-.06-.09-.09-.06-.07,0-.06-.87-2.12a.43.43,0,0,1,0-.37.49.49,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26l.44,1.09a6.51,6.51,0,0,0,.24-1.36,4.58,4.58,0,0,0,0-.64,5.83,5.83,0,0,0-1.73-4.17,5.88,5.88,0,0,0-8.34,0,5.9,5.9,0,0,0,4.17,10.06.51.51,0,0,1,.33.15.48.48,0,0,1,0,.68.53.53,0,0,1-.33.12Z" transform="translate(-4.48 -4.54)"/></g></svg>',undo:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.59 14.18"><g><path d="M5,14a.43.43,0,0,1-.22-.29.46.46,0,0,1,.06-.36.43.43,0,0,1,.29-.22.56.56,0,0,1,.36,0l.91.55a8.27,8.27,0,0,1-.22-1.45,5.07,5.07,0,0,1,0-.67A6.85,6.85,0,1,1,13,18.47a.44.44,0,0,1-.33-.13.48.48,0,0,1,0-.68.51.51,0,0,1,.33-.15A5.89,5.89,0,0,0,17.15,7.45a5.88,5.88,0,0,0-8.33,0,5.84,5.84,0,0,0-1.73,4.17s0,.25,0,.65a6.49,6.49,0,0,0,.24,1.37l.44-1.09a.57.57,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26.43.43,0,0,1,0,.37L7.82,15l0,.09-.09.09-.1.07-.06,0H7.28l-.13,0-1.09-.63c-.65-.36-1-.57-1.1-.63Z" transform="translate(-4.49 -4.53)"/></g></svg>',bold:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.76 15.75"><g><path d="M6.4,3.76V19.5h6.76a5.55,5.55,0,0,0,2-.32,4.93,4.93,0,0,0,1.52-1,4.27,4.27,0,0,0,1.48-3.34,3.87,3.87,0,0,0-.69-2.37,5.74,5.74,0,0,0-.71-.83,3.44,3.44,0,0,0-1.1-.65,3.6,3.6,0,0,0,1.58-1.36,3.66,3.66,0,0,0,.53-1.93,3.7,3.7,0,0,0-1.21-2.87,4.65,4.65,0,0,0-3.25-1.1H6.4Zm2.46,6.65V5.57h3.52a4.91,4.91,0,0,1,1.36.15,2.3,2.3,0,0,1,.85.45,2.06,2.06,0,0,1,.74,1.71,2.3,2.3,0,0,1-.78,1.92,2.54,2.54,0,0,1-.86.46,4.7,4.7,0,0,1-1.32.15H8.86Zm0,7.27V12.15H12.7a4.56,4.56,0,0,1,1.38.17,3.43,3.43,0,0,1,.95.49,2.29,2.29,0,0,1,.92,2,2.73,2.73,0,0,1-.83,2.1,2.66,2.66,0,0,1-.83.58,3.25,3.25,0,0,1-1.26.2H8.86Z" transform="translate(-6.4 -3.75)"/></g></svg>',underline:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 9.78 15.74"><g><path d="M14.64,3.76h2.52v7.72a4.51,4.51,0,0,1-.59,2.31,3.76,3.76,0,0,1-1.71,1.53,6.12,6.12,0,0,1-2.64.53,5,5,0,0,1-3.57-1.18,4.17,4.17,0,0,1-1.27-3.24V3.76H9.9v7.3a3,3,0,0,0,.55,2,2.3,2.3,0,0,0,1.83.65,2.26,2.26,0,0,0,1.8-.65,3.09,3.09,0,0,0,.55-2V3.76Zm2.52,13.31V19.5H7.39V17.08h9.77Z" transform="translate(-7.38 -3.76)"/></g></svg>',italic:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.49 15.76"><g><path d="M17.16,3.79l.37,0-.06.38-.14.52A10,10,0,0,1,16.21,5a9.37,9.37,0,0,0-1,.32,6.68,6.68,0,0,0-.25.89c-.06.31-.11.59-.14.85-.3,1.36-.52,2.41-.68,3.14l-.61,3.18L13.1,15l-.43,2.4-.12.46a.62.62,0,0,0,0,.28c.44.1.85.17,1.23.22l.68.11a4.51,4.51,0,0,1-.08.6l-.09.42a.92.92,0,0,0-.23,0l-.43,0a1.37,1.37,0,0,1-.29,0c-.13,0-.63-.08-1.49-.16l-2,0c-.28,0-.87,0-1.78.12L7,19.5l.17-.88.8-.2A6.61,6.61,0,0,0,9.19,18,2.62,2.62,0,0,0,9.61,17l.28-1.41.58-2.75.12-.66c.05-.3.11-.58.17-.86s.12-.51.17-.69l.12-.48.12-.43.31-1.6.15-.65.31-1.91V5.14a3.86,3.86,0,0,0-1.48-.29l-.38,0,.2-1.06,3.24.14.75,0c.45,0,1.18,0,2.18-.09.23,0,.46,0,.71,0Z" transform="translate(-7.04 -3.76)"/></g></svg>',strike:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.9"><g><path d="M12.94,13a4.27,4.27,0,0,1,1.32.58,1.46,1.46,0,0,1,.55,1.2,1.87,1.87,0,0,1-.88,1.64,4.17,4.17,0,0,1-2.35.59,4.44,4.44,0,0,1-2.74-.71,2.72,2.72,0,0,1-1-2.17H5.57a4.56,4.56,0,0,0,1.55,3.7,7,7,0,0,0,4.47,1.23,6,6,0,0,0,4.07-1.3,4.24,4.24,0,0,0,1.52-3.37,4,4,0,0,0-.26-1.4h-4ZM6.37,10.24A3.27,3.27,0,0,1,6,8.68a4,4,0,0,1,1.48-3.3,5.92,5.92,0,0,1,3.88-1.21,5.58,5.58,0,0,1,3.91,1.24,4.36,4.36,0,0,1,1.45,3.17H14.44a2.12,2.12,0,0,0-.91-1.81,4.45,4.45,0,0,0-2.44-.55,3.69,3.69,0,0,0-2,.51A1.64,1.64,0,0,0,8.3,8.22a1.3,1.3,0,0,0,.48,1.11,7,7,0,0,0,2.1.78l.28.06.28.08H6.37Zm13.09.68a.73.73,0,0,1,.49.21.66.66,0,0,1,.2.48.64.64,0,0,1-.2.48.71.71,0,0,1-.49.19H5.1a.67.67,0,0,1-.49-.19.66.66,0,0,1-.2-.48.64.64,0,0,1,.2-.48.73.73,0,0,1,.49-.21H19.46Z" transform="translate(-4.41 -4.17)"/></g></svg>',subscript:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 14.61"><g><path d="M15.38,4.33H12.74L11.19,7c-.28.46-.51.87-.69,1.21L10.07,9h0l-.44-.8c-.22-.4-.45-.81-.71-1.23L7.34,4.33H4.68L8.26,10,4.4,16.08H7.1l1.69-2.83c.38-.63.72-1.22,1-1.78l.25-.46h0l.49.92c.24.45.48.89.74,1.32L13,16.08h2.61L11.84,10l1.77-2.84,1.77-2.85Zm4.77,13.75H17v-.15c0-.4.05-.64.16-.72a4.42,4.42,0,0,1,1.16-.31,3.3,3.3,0,0,0,1.54-.56A1.84,1.84,0,0,0,20.15,15a1.78,1.78,0,0,0-.44-1.41A2.8,2.8,0,0,0,18,13.25a2.71,2.71,0,0,0-1.69.37,1.83,1.83,0,0,0-.44,1.43v.23H17v-.23q0-.63.18-.78a1.62,1.62,0,0,1,.88-.15,1.59,1.59,0,0,1,.88.15q.18.15.18.75t-.18.75a3.58,3.58,0,0,1-1.18.33,3.33,3.33,0,0,0-1.52.51,1.57,1.57,0,0,0-.32,1.18v1.15h4.27v-.86Z" transform="translate(-4.4 -4.33)"/></g></svg>',superscript:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.42"><g><path d="M12,13.14l3.61-5.81H12.94L11.33,10c-.28.46-.51.88-.69,1.25l-.45.83h0l-.45-.85c-.22-.41-.45-.82-.71-1.24L7.4,7.33H4.68l3.66,5.81L4.4,19.33H7.14l1.74-2.87q.58-1,1-1.83l.25-.48h0l.51.94.75,1.37,1.72,2.87h2.67l-1.92-3.09c-1.12-1.8-1.76-2.83-1.92-3.1Zm4.84-4.41h0l0,.15h3.27v.86H15.77V8.58a1.66,1.66,0,0,1,.33-1.22,3.51,3.51,0,0,1,1.56-.51,3.68,3.68,0,0,0,1.21-.34c.13-.1.19-.36.19-.77S19,5.07,18.87,5A1.63,1.63,0,0,0,18,4.8a1.58,1.58,0,0,0-.91.17c-.13.11-.19.38-.19.8V6H15.78V5.76a1.87,1.87,0,0,1,.45-1.47A2.84,2.84,0,0,1,18,3.91a2.8,2.8,0,0,1,1.72.38,1.84,1.84,0,0,1,.45,1.44,1.91,1.91,0,0,1-.34,1.35,3.24,3.24,0,0,1-1.58.57A3.69,3.69,0,0,0,17,8c-.12.1-.17.35-.17.76Z" transform="translate(-4.4 -3.91)"/></g></svg>',erase:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.76"><g><path d="M13.69,17.2h6.46v1.31H8.56L4.41,14.37,14,4.75l6.06,6.06L16.89,14l-3.2,3.19Zm-4.61,0h2.77L14.09,15,9.88,10.75,6.25,14.38l1.41,1.41c.84.82,1.31,1.29,1.42,1.41Z" transform="translate(-4.41 -4.75)"/></g></svg>',indent:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.36"><g><path d="M19.87,15.57a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87ZM7.5,14.45a.25.25,0,0,1-.2-.09L4.76,11.84a.29.29,0,0,1,0-.4L7.3,8.9a.29.29,0,0,1,.4,0,.31.31,0,0,1,.07.2v5.06a.32.32,0,0,1-.08.21.26.26,0,0,1-.19.08ZM19.87,8.82a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm0,3.37a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm.2-6.66a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z" transform="translate(-4.41 -5.44)"/></g></svg>',outdent:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.36"><g><path d="M4.68,14.45a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V9.1a.27.27,0,0,1,.08-.19.28.28,0,0,1,.2-.08.25.25,0,0,1,.19.07l2.54,2.54a.29.29,0,0,1,0,.4L4.88,14.36a.24.24,0,0,1-.2.09Zm15.19,1.12a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87Zm0-3.38a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm0-3.37a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm.2-3.29a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z" transform="translate(-4.41 -5.44)"/></g></svg>',expansion:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M11.8,13.06l-5.1,5.1H9.51V19.5H4.41V14.4H5.75v2.81L8.3,14.66q2.25-2.23,2.55-2.55Zm8.35-9.3v5.1H18.81V6.05l-5.1,5.1-1-1,5.1-5.1H15.05V3.76Z" transform="translate(-4.41 -3.76)"/></g></svg>',reduction:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M14.91,10h2.87v1.38H12.55V6.12h1.38V9l5.24-5.24.48.49.49.48ZM6.77,11.92H12v5.23H10.62V14.26L5.37,19.5l-1-1L9.63,13.3H6.77Z" transform="translate(-4.4 -3.76)"/></g></svg>',code_view:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 11.8"><g><path d="M8.09,7.94a.76.76,0,0,1,.53.22.72.72,0,0,1,.21.52.76.76,0,0,1-.22.54L6.18,11.63l2.43,2.44a.69.69,0,0,1,.2.51.66.66,0,0,1-.21.51.75.75,0,0,1-.51.22.63.63,0,0,1-.51-.21h0L4.63,12.15a.7.7,0,0,1-.22-.53.67.67,0,0,1,.25-.55L7.57,8.16a.82.82,0,0,1,.52-.22Zm12.05,3.69a.7.7,0,0,1-.23.52L17,15.1h0a.66.66,0,0,1-.51.21.73.73,0,0,1-.51-.22.75.75,0,0,1-.22-.51.63.63,0,0,1,.21-.51l2.43-2.44L15.92,9.22a.73.73,0,0,1-.22-.53A.74.74,0,0,1,17,8.18h0l2.91,2.91a.67.67,0,0,1,.27.54Zm-5.9-5.9a.73.73,0,0,1,.61.32.71.71,0,0,1,.07.68L11,17a1,1,0,0,1-.22.32.6.6,0,0,1-.35.16.75.75,0,0,1-.69-.26.69.69,0,0,1-.12-.72L13.56,6.23a.75.75,0,0,1,.26-.35.74.74,0,0,1,.42-.15Z" transform="translate(-4.41 -5.73)"/></g></svg>',preview:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.65 15.66"><g><path d="M16.19,14.43l2.49,2.49a.73.73,0,0,1,.21.52.67.67,0,0,1-.22.51.7.7,0,0,1-.52.22.69.69,0,0,1-.51-.21l-2.49-2.48a5.17,5.17,0,0,1-1.34.69,4.64,4.64,0,0,1-1.48.24,4.78,4.78,0,1,1,0-9.56,4.79,4.79,0,0,1,1.84.36,4.9,4.9,0,0,1,1.56,1,4.77,4.77,0,0,1,.46,6.18ZM10,14a3.3,3.3,0,0,0,2.34.93A3.37,3.37,0,0,0,14.7,14a3.3,3.3,0,0,0-1.08-5.41,3.47,3.47,0,0,0-2.56,0A3,3,0,0,0,10,9.28,3.31,3.31,0,0,0,10,14ZM16,4a3.86,3.86,0,0,1,2.77,1.14A3.9,3.9,0,0,1,20,7.85v4a.77.77,0,0,1-.22.53.7.7,0,0,1-.52.21.72.72,0,0,1-.74-.74v-4a2.46,2.46,0,0,0-.72-1.73A2.37,2.37,0,0,0,16,5.45H8.53A2.42,2.42,0,0,0,6.08,7.89v7.52a2.41,2.41,0,0,0,.71,1.73,2.46,2.46,0,0,0,1.74.72h4.08a.73.73,0,0,1,0,1.46H8.53a3.85,3.85,0,0,1-2.78-1.14A3.93,3.93,0,0,1,4.6,15.4V7.87A3.94,3.94,0,0,1,5.76,5.09,3.88,3.88,0,0,1,8.54,4H16Z" transform="translate(-4.45 -3.8)"/></g></svg>',print:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16.05 16.04"><g><path d="M19.76,15.84a1.29,1.29,0,0,0,.39-.92V8.35A2.05,2.05,0,0,0,19.57,7a1.93,1.93,0,0,0-1.38-.57H6.37a1.95,1.95,0,0,0-2,2v6.56a1.23,1.23,0,0,0,.38.92,1.35,1.35,0,0,0,.93.38h2V14.9l-2,0V8.35a.67.67,0,0,1,.18-.47.62.62,0,0,1,.48-.19H18.18a.6.6,0,0,1,.46.19.66.66,0,0,1,.18.47V14.9h-2v1.32h2A1.35,1.35,0,0,0,19.76,15.84ZM17.52,7.69V5.06a1.31,1.31,0,0,0-.38-.92,1.34,1.34,0,0,0-.94-.38H8.34A1.3,1.3,0,0,0,7,5.06V7.69H8.34V5.06h7.87V7.69h1.31ZM8.34,12.93h7.87l0,5.26H8.34V12.93Zm7.87,5.26v0Zm.65,1.31a.6.6,0,0,0,.46-.19.72.72,0,0,0,.2-.47V12.29a.74.74,0,0,0-.2-.47.6.6,0,0,0-.46-.19H7.68a.6.6,0,0,0-.46.19.72.72,0,0,0-.2.47v6.55a.74.74,0,0,0,.2.47.6.6,0,0,0,.46.19h9.18ZM16.67,9.28a.7.7,0,0,0-.94,0,.63.63,0,0,0-.18.46.67.67,0,0,0,.18.47.68.68,0,0,0,.94,0,.66.66,0,0,0,.18-.47A.58.58,0,0,0,16.67,9.28Z" transform="translate(-4.25 -3.61)"/></g></svg>',template:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.27 15.64"><g><path d="M18.18,19.16a1,1,0,0,0,1-1V5.73a1,1,0,0,0-1-1h-2v1h2V18.19H6.37V5.73h2v-1h-2A.94.94,0,0,0,5.68,5a1,1,0,0,0-.29.7V18.18a.94.94,0,0,0,.29.69,1,1,0,0,0,.69.29H18.18ZM9.82,10.31h4.92a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.49.49,0,0,0-.15-.35.47.47,0,0,0-.35-.15H9.82a.49.49,0,0,0-.35.15.47.47,0,0,0-.15.35.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15Zm5.9,4.92H8.83a.49.49,0,0,0-.35.15.47.47,0,0,0-.15.35.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15h6.89a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.51.51,0,0,0-.5-.5ZM7.36,12.77a.49.49,0,0,0,.15.35.47.47,0,0,0,.35.15h8.85a.49.49,0,0,0,.35-.15.47.47,0,0,0,.15-.35.49.49,0,0,0-.15-.35.47.47,0,0,0-.35-.15H7.85a.49.49,0,0,0-.35.15.52.52,0,0,0-.14.35Z" transform="translate(-5.14 -3.77)"/><path d="M14.24,6.71a1,1,0,0,0,1-1,1,1,0,0,0-1-1,1,1,0,0,0-1-1h-2a.94.94,0,0,0-.69.28,1,1,0,0,0-.29.7A.94.94,0,0,0,9.62,5a.91.91,0,0,0-.29.69,1,1,0,0,0,.29.7,1,1,0,0,0,.69.29h3.93Z" transform="translate(-5.14 -3.77)"/></g></svg>',line_height:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 13.56"><g><path d="M4.4,4.88V8.26a2,2,0,0,0,.5.39s.1,0,.18-.12a.62.62,0,0,0,.17-.28c.06-.19.13-.44.21-.74s.14-.52.19-.66a.58.58,0,0,1,.21-.3,2.41,2.41,0,0,1,.63-.21,3.83,3.83,0,0,1,.88-.12,9.15,9.15,0,0,1,1.31.06.16.16,0,0,1,.11,0,.26.26,0,0,1,.06.14,4,4,0,0,1,0,.49v2l.05,3.77c0,1.41,0,2.68-.05,3.81a1.79,1.79,0,0,1-.11.49,10.68,10.68,0,0,1-1.4.45,1.12,1.12,0,0,0-.69.43v.31l0,.22.61,0c.85-.08,1.54-.12,2.06-.12a19.76,19.76,0,0,1,2.09.08,15.08,15.08,0,0,0,1.64.08,1.4,1.4,0,0,0,.29,0,1.58,1.58,0,0,0,0-.26l-.05-.43a2.26,2.26,0,0,0-.43-.17l-.77-.22-.15,0a2.55,2.55,0,0,1-.78-.28,2.56,2.56,0,0,1-.11-.75l0-1.29,0-3.15V7.53a10.51,10.51,0,0,1,.06-1.2,3.83,3.83,0,0,1,.6,0l1.88,0a2.18,2.18,0,0,1,.38,0,.45.45,0,0,1,.23.17.9.9,0,0,1,.05.25c0,.16.06.35.1.58a3.33,3.33,0,0,0,.14.55A6.39,6.39,0,0,0,15,9a2.91,2.91,0,0,0,.6-.15,2.77,2.77,0,0,0,0-.46l0-.51,0-2.95-.25,0-.38,0L15,4.94a.71.71,0,0,1-.18.15.45.45,0,0,1-.25.07l-.29,0H8.75l-.15,0H7.45a17,17,0,0,1-1.86,0L5.36,5l-.25-.13ZM19.75,16.14h-.69v-9h.69A.4.4,0,0,0,20.13,7c.06-.11,0-.24-.1-.39L18.92,5.15a.52.52,0,0,0-.86,0L17,6.58c-.12.15-.16.28-.1.39s.18.16.38.16h.69v9h-.69a.4.4,0,0,0-.38.16c-.06.11,0,.24.1.39l1.11,1.43a.52.52,0,0,0,.86,0L20,16.69c.12-.15.16-.28.1-.39a.4.4,0,0,0-.38-.16Z" transform="translate(-4.4 -4.86)"/></g></svg>',paragraph_style:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.81 15.74"><g><path d="M18.18,3.76v2h-2V19.5h-2V5.73h-2V19.5h-2V11.63a3.94,3.94,0,0,1,0-7.87h7.87Z" transform="translate(-6.37 -3.76)"/></g></svg>',text_style:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.76 15.74"><g><path d="M17.68,6.71a2.22,2.22,0,0,0,1.06-.22.74.74,0,0,0,.42-.7.73.73,0,0,0-.08-.33.67.67,0,0,0-.17-.22,1,1,0,0,0-.31-.15L18.26,5l-.45-.09A15.27,15.27,0,0,0,13.26,5V4.74c0-.66-.63-1-1.92-1-.24,0-.43.15-.59.46a4,4,0,0,0-.36,1.14h0v0a26.45,26.45,0,0,1-3.5.35A2,2,0,0,0,5.77,6a.84.84,0,0,0-.37.79,2.14,2.14,0,0,0,.41,1.29,1.23,1.23,0,0,0,1.05.63,16.62,16.62,0,0,0,3.29-.45l-.34,3.35c-.16,1.61-.29,2.9-.37,3.86s-.12,1.66-.12,2.09l0,.65a5.15,5.15,0,0,0,.05.6,1.28,1.28,0,0,0,.16.54.34.34,0,0,0,.28.18,1.16,1.16,0,0,0,.79-.46,3.66,3.66,0,0,0,.68-1,22.08,22.08,0,0,0,1-4.33q.49-3.1.78-6.15a24.69,24.69,0,0,1,4.62-.84Z" transform="translate(-5.4 -3.76)"/></g></svg>',save:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M18.53,19.5l.2-.05A1.78,1.78,0,0,0,20.13,18l0-.09V7.14a2,2,0,0,0-.28-.64A3.18,3.18,0,0,0,19.43,6c-.5-.52-1-1-1.55-1.54A2.59,2.59,0,0,0,17.37,4a1.83,1.83,0,0,0-.61-.25H6l-.21,0a1.78,1.78,0,0,0-1.4,1.49l0,.1V17.87a2.49,2.49,0,0,0,.09.37,1.79,1.79,0,0,0,1.44,1.23l.09,0Zm-6.25-.6H6.92a.61.61,0,0,1-.68-.48.78.78,0,0,1,0-.22V12.3a.62.62,0,0,1,.69-.68H17.64a.62.62,0,0,1,.69.69V18.2a.64.64,0,0,1-.71.69H12.28ZM12,9.81H8.15a.63.63,0,0,1-.72-.71v-4a.64.64,0,0,1,.72-.72h7.66a.64.64,0,0,1,.72.72v4a.65.65,0,0,1-.74.72ZM13.5,5V9.18h1.78V5Z" transform="translate(-4.41 -3.76)"/></g></svg>',blockquote:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 475.082 475.081"><g><path d="M164.45,219.27h-63.954c-7.614,0-14.087-2.664-19.417-7.994c-5.327-5.33-7.994-11.801-7.994-19.417v-9.132c0-20.177,7.139-37.401,21.416-51.678c14.276-14.272,31.503-21.411,51.678-21.411h18.271c4.948,0,9.229-1.809,12.847-5.424c3.616-3.617,5.424-7.898,5.424-12.847V54.819c0-4.948-1.809-9.233-5.424-12.85c-3.617-3.612-7.898-5.424-12.847-5.424h-18.271c-19.797,0-38.684,3.858-56.673,11.563c-17.987,7.71-33.545,18.132-46.68,31.267c-13.134,13.129-23.553,28.688-31.262,46.677C3.855,144.039,0,162.931,0,182.726v200.991c0,15.235,5.327,28.171,15.986,38.834c10.66,10.657,23.606,15.985,38.832,15.985h109.639c15.225,0,28.167-5.328,38.828-15.985c10.657-10.663,15.987-23.599,15.987-38.834V274.088c0-15.232-5.33-28.168-15.994-38.832C192.622,224.6,179.675,219.27,164.45,219.27z"/><path d="M459.103,235.256c-10.656-10.656-23.599-15.986-38.828-15.986h-63.953c-7.61,0-14.089-2.664-19.41-7.994c-5.332-5.33-7.994-11.801-7.994-19.417v-9.132c0-20.177,7.139-37.401,21.409-51.678c14.271-14.272,31.497-21.411,51.682-21.411h18.267c4.949,0,9.233-1.809,12.848-5.424c3.613-3.617,5.428-7.898,5.428-12.847V54.819c0-4.948-1.814-9.233-5.428-12.85c-3.614-3.612-7.898-5.424-12.848-5.424h-18.267c-19.808,0-38.691,3.858-56.685,11.563c-17.984,7.71-33.537,18.132-46.672,31.267c-13.135,13.129-23.559,28.688-31.265,46.677c-7.707,17.987-11.567,36.879-11.567,56.674v200.991c0,15.235,5.332,28.171,15.988,38.834c10.657,10.657,23.6,15.985,38.828,15.985h109.633c15.229,0,28.171-5.328,38.827-15.985c10.664-10.663,15.985-23.599,15.985-38.834V274.088C475.082,258.855,469.76,245.92,459.103,235.256z"/></g></svg>',arrow_down:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 8.67"><g><path d="M18.79,7.52a.8.8,0,0,1,.56-.23.82.82,0,0,1,.79.79.8.8,0,0,1-.23.56l-7.07,7.07a.79.79,0,0,1-.57.25.77.77,0,0,1-.57-.25h0L4.64,8.65a.8.8,0,0,1-.23-.57.82.82,0,0,1,.79-.79.8.8,0,0,1,.56.23L12.28,14l3.26-3.26,3.25-3.26Z" transform="translate(-4.41 -7.29)"/></g></svg>',align_justify:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm0,5.9H20.15v-2H4.41v2Zm0,3.94H20.15v-2H4.41v2Zm0,3.93h7.87v-2H4.41v2Z" transform="translate(-4.41 -4.74)"/></g></svg>',align_left:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm11.8,3.94H4.41v2H16.22v-2Zm-11.8,5.9H18.18v-2H4.41v2Zm0,3.93h9.84v-2H4.41v2Z" transform="translate(-4.41 -4.74)"/></g></svg>',align_right:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm3.93,5.9H20.15v-2H8.34v2Zm-2,3.94H20.14v-2H6.37v2Zm3.94,3.93h9.84v-2H10.31v2Z" transform="translate(-4.41 -4.74)"/></g></svg>',align_center:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.77"><g><path d="M4.41,4.74v2H20.15v-2H4.41Zm2,3.94v2H18.18v-2H6.37Zm-1,5.9H19.16v-2H5.39v2Zm2,3.93H17.2v-2H7.36v2Z" transform="translate(-4.41 -4.74)"/></g></svg>',font_color:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.61"><g><path d="M18.5,15.57,14.28,4.32h-3.4L6.65,15.57h3l.8-2.26h4.23l.8,2.26h3ZM14,11.07H11.14L12.54,7,13.25,9c.41,1.18.64,1.86.7,2ZM4.41,16.69v2.24H20.15V16.69H4.41Z" transform="translate(-4.41 -4.32)"/></g></svg>',highlight_color:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.66 15.74"><g><path d="M12.32,9.31,13.38,13H11.21l.52-1.83q.46-1.61.54-1.83ZM4.44,3.76H20.1V19.5H4.44V3.76ZM14.71,17.32h2.63L13.7,6H10.89L7.26,17.32H9.89l.63-2.24h3.55l.32,1.12c.18.65.29,1,.32,1.12Z" transform="translate(-4.44 -3.76)"/></g></svg>',list_bullets:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 12.37"><g><path d="M7.77,16.12a1.59,1.59,0,0,0-.49-1.18,1.62,1.62,0,0,0-1.19-.49,1.68,1.68,0,1,0,0,3.36,1.67,1.67,0,0,0,1.68-1.69Zm0-4.48A1.67,1.67,0,0,0,6.09,10,1.68,1.68,0,0,0,4.9,12.82a1.62,1.62,0,0,0,1.19.49,1.67,1.67,0,0,0,1.68-1.67Zm12.38,3.64a.27.27,0,0,0-.08-.19.28.28,0,0,0-.2-.09H9.19a.28.28,0,0,0-.2.08.29.29,0,0,0-.08.19V17a.27.27,0,0,0,.28.28H19.87a.27.27,0,0,0,.19-.08.24.24,0,0,0,.08-.2V15.28ZM7.77,7.13a1.63,1.63,0,0,0-.49-1.2,1.61,1.61,0,0,0-1.19-.49,1.61,1.61,0,0,0-1.19.49,1.71,1.71,0,0,0,0,2.4,1.62,1.62,0,0,0,1.19.49,1.61,1.61,0,0,0,1.19-.49,1.63,1.63,0,0,0,.49-1.2Zm12.38,3.66a.28.28,0,0,0-.08-.2.29.29,0,0,0-.19-.08H9.19a.27.27,0,0,0-.28.28v1.69a.27.27,0,0,0,.08.19.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08.25.25,0,0,0,.08-.19V10.79Zm0-4.5a.27.27,0,0,0-.08-.19A.25.25,0,0,0,19.88,6H9.19A.28.28,0,0,0,9,6.1a.26.26,0,0,0-.08.19V8A.27.27,0,0,0,9,8.17a.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08A.25.25,0,0,0,20.14,8V6.29Z" transform="translate(-4.41 -5.44)"/></g></svg>',list_number:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.69 15.74"><g><path d="M7.66,18a1.24,1.24,0,0,0-.26-.78,1.17,1.17,0,0,0-.72-.42l.85-1V15H4.58v1.34h.94v-.46l.85,0h0c-.11.11-.22.23-.32.35s-.23.27-.37.47L5.39,17l.23.51c.61-.05.92.11.92.49a.42.42,0,0,1-.18.37.79.79,0,0,1-.45.12A1.41,1.41,0,0,1,5,18.15l-.51.77A2.06,2.06,0,0,0,6,19.5a1.8,1.8,0,0,0,1.2-.41A1.38,1.38,0,0,0,7.66,18Zm0-5.54H6.75V13H5.63A.72.72,0,0,1,6,12.51a5.45,5.45,0,0,1,.66-.45,2.71,2.71,0,0,0,.67-.57,1.19,1.19,0,0,0,.31-.81,1.29,1.29,0,0,0-.45-1,1.86,1.86,0,0,0-2-.11,1.51,1.51,0,0,0-.62.7l.74.52A.87.87,0,0,1,6,10.28a.51.51,0,0,1,.35.12.42.42,0,0,1,.13.33.55.55,0,0,1-.21.4,3,3,0,0,1-.5.38c-.19.13-.39.27-.58.42a2,2,0,0,0-.5.6,1.63,1.63,0,0,0-.21.81,3.89,3.89,0,0,0,.05.48h3.2V12.44Zm12.45,2.82a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2V17a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V15.26ZM7.69,7.32h-1V3.76H5.8L4.6,4.88l.63.68a1.85,1.85,0,0,0,.43-.48h0l0,2.24H4.74V8.2h3V7.32Zm12.43,3.42a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2v1.71a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V10.74Zm0-4.52A.27.27,0,0,0,20,6,.28.28,0,0,0,19.83,6H9.1A.32.32,0,0,0,8.89,6a.24.24,0,0,0-.08.19V7.93a.27.27,0,0,0,.08.19.32.32,0,0,0,.21.08H19.83A.32.32,0,0,0,20,8.12a.26.26,0,0,0,.08-.2V6.22Z" transform="translate(-4.43 -3.76)"/></g></svg>',table:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M4.41,8.05V3.76H8.7V8.05H4.41Zm5.71,0V3.76h4.3V8.05h-4.3Zm5.74-4.29h4.29V8.05H15.86V3.76Zm-11.45,10V9.48H8.7v4.3H4.41Zm5.71,0V9.48h4.3v4.3h-4.3Zm5.74,0V9.48h4.29v4.3H15.86ZM4.41,19.5V15.21H8.7V19.5H4.41Zm5.71,0V15.21h4.3V19.5h-4.3Zm5.74,0V15.21h4.29V19.5H15.86Z" transform="translate(-4.41 -3.76)"/></g></svg>',horizontal_rule:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 2.24"><g><path d="M20.15,12.75V10.51H4.41v2.24H20.15Z" transform="translate(-4.41 -10.51)"/></g></svg>',show_blocks:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.66 15.67"><g><path d="M19.72,5.58a1.64,1.64,0,0,0-1.64-1.64H6.23a1.62,1.62,0,0,0-1.16.48,1.63,1.63,0,0,0-.48,1.16V9.63a1.6,1.6,0,0,0,.48,1.16,1.62,1.62,0,0,0,1.16.47H18.09a1.67,1.67,0,0,0,1.16-.47,1.62,1.62,0,0,0,.48-1.16V5.58Zm-.94,4.05a.68.68,0,0,1-.7.7H6.23a.66.66,0,0,1-.48-.2.74.74,0,0,1-.21-.5V5.58a.66.66,0,0,1,.2-.48.71.71,0,0,1,.48-.21H18.08a.74.74,0,0,1,.5.21.66.66,0,0,1,.2.48ZM6.48,7.72a.21.21,0,0,0,.17-.07.22.22,0,0,0,.07-.17V7.06a1.27,1.27,0,0,1,.11-.52.37.37,0,0,1,.36-.23H8.77A.25.25,0,0,0,9,6.17a.19.19,0,0,0,0-.23.27.27,0,0,0-.2-.12H7.19a.88.88,0,0,0-.72.39,1.51,1.51,0,0,0-.23.85v.42a.24.24,0,0,0,.24.24Zm-.19.81a.21.21,0,0,0,.17-.07.26.26,0,0,0,.07-.17.24.24,0,0,0-.24-.24.2.2,0,0,0-.16.09.2.2,0,0,0-.07.16.22.22,0,0,0,.07.17.23.23,0,0,0,.16.06Zm8.46,5.1a1.63,1.63,0,0,0-.47-1.16A1.61,1.61,0,0,0,13.12,12H6.23a1.6,1.6,0,0,0-1.16.46,1.62,1.62,0,0,0-.48,1.16v4.05a1.64,1.64,0,0,0,1.64,1.64h6.89a1.6,1.6,0,0,0,1.16-.48,1.62,1.62,0,0,0,.47-1.16Zm-.94,4a.7.7,0,0,1-.2.49.65.65,0,0,1-.5.2H6.23a.66.66,0,0,1-.48-.2.75.75,0,0,1-.21-.49v-4a.74.74,0,0,1,.21-.5.66.66,0,0,1,.48-.2h6.89a.68.68,0,0,1,.7.7v4Zm6.15,0v-4a1.6,1.6,0,0,0-.48-1.16A1.67,1.67,0,0,0,18.32,12H17.1a1.63,1.63,0,0,0-1.16.47,1.61,1.61,0,0,0-.47,1.16v4a1.67,1.67,0,0,0,.47,1.16,1.62,1.62,0,0,0,1.16.48h1.22A1.64,1.64,0,0,0,20,17.68Zm-.94-4v4a.75.75,0,0,1-.21.49.62.62,0,0,1-.48.2H17.11a.69.69,0,0,1-.5-.2.7.7,0,0,1-.2-.49v-4a.68.68,0,0,1,.7-.7h1.22a.66.66,0,0,1,.48.2.72.72,0,0,1,.21.5Z" transform="translate(-4.44 -3.79)"/></g></svg>',cancel:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M14.15,11.63l5.61,5.61a1.29,1.29,0,0,1,.38.93,1.27,1.27,0,0,1-.4.93,1.25,1.25,0,0,1-.92.4,1.31,1.31,0,0,1-.94-.4l-5.61-5.61L6.67,19.1a1.31,1.31,0,0,1-.94.4,1.24,1.24,0,0,1-.92-.4,1.27,1.27,0,0,1-.4-.93,1.33,1.33,0,0,1,.38-.93l5.61-5.63L4.79,6a1.26,1.26,0,0,1-.38-.93,1.22,1.22,0,0,1,.4-.92,1.28,1.28,0,0,1,.92-.39,1.38,1.38,0,0,1,.94.38l5.61,5.61,5.61-5.61a1.33,1.33,0,0,1,.94-.38,1.26,1.26,0,0,1,.92.39,1.24,1.24,0,0,1,.4.92,1.29,1.29,0,0,1-.39.93L17,8.81l-2.8,2.82Z" transform="translate(-4.41 -3.76)"/></g></svg>',image:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.77"><g><path d="M8.77,8.72a.88.88,0,0,1-.61-.27.82.82,0,0,1-.25-.61.89.89,0,0,1,.25-.62A.82.82,0,0,1,8.77,7a.81.81,0,0,1,.61.25.83.83,0,0,1,.27.62.81.81,0,0,1-.25.61.91.91,0,0,1-.63.27Zm9.62-5a1.74,1.74,0,0,1,1.76,1.76V17.76a1.74,1.74,0,0,1-1.76,1.76H6.16A1.74,1.74,0,0,1,4.4,17.76V5.51A1.74,1.74,0,0,1,6.16,3.75H18.39Zm0,1.75H6.16v8L8.53,11.8a.94.94,0,0,1,.54-.17.86.86,0,0,1,.54.2L11.09,13l3.64-4.55a.78.78,0,0,1,.34-.25.85.85,0,0,1,.42-.07.89.89,0,0,1,.39.12.78.78,0,0,1,.28.29l2.24,3.67V5.51Zm0,12.24V15.6L15.3,10.53,11.89,14.8a.89.89,0,0,1-.59.32.82.82,0,0,1-.64-.18L9,13.62,6.16,15.74v2Z" transform="translate(-4.4 -3.75)"/></g></svg>',video:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.55"><g><path d="M20.15,10.26V18.9l-3.94-1.57v1.2H4.41V10.66H16.22v1.23l2-.81,2-.82ZM14.64,17h0V12.54h0v-.31H6V17h8.67Zm3.94-.37v-4l-2.37,1v2l1.18.48,1.19.48ZM7.94,9.86A2.77,2.77,0,0,1,5.19,7.11a2.76,2.76,0,0,1,5.51,0A2.78,2.78,0,0,1,7.94,9.86Zm0-3.93a1.21,1.21,0,0,0-.83.35,1.15,1.15,0,0,0-.34.84A1.09,1.09,0,0,0,7.11,8,1.15,1.15,0,0,0,8,8.28,1.13,1.13,0,0,0,9.11,7.12,1.16,1.16,0,0,0,7.94,5.93Zm5.9,3.93a2.34,2.34,0,0,1-1.67-.68,2.3,2.3,0,0,1-.68-1.67,2.35,2.35,0,0,1,4-1.67,2.37,2.37,0,0,1,0,3.34,2.33,2.33,0,0,1-1.68.68Zm0-3.14a.75.75,0,1,0,.55.22.73.73,0,0,0-.55-.22Z" transform="translate(-4.41 -4.35)"/></g></svg>',link:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.72"><g><path d="M13.05,13.63a.24.24,0,0,1,.15.22L13.42,16a.19.19,0,0,1-.08.18l-2.12,2.14a4.08,4.08,0,0,1-1.29.85A4,4,0,0,1,4.71,17a3.92,3.92,0,0,1-.3-1.52A4,4,0,0,1,4.71,14a3.91,3.91,0,0,1,.87-1.3L7.7,10.56a.25.25,0,0,1,.2-.06l2.17.22a.21.21,0,0,1,.19.15.24.24,0,0,1,0,.25L7.12,14.23a1.81,1.81,0,0,0,0,2.58,1.78,1.78,0,0,0,1.29.52,1.74,1.74,0,0,0,1.28-.52L12.8,13.7a.24.24,0,0,1,.25-.07ZM19,4.92a4,4,0,0,1,0,5.66L16.86,12.7a.25.25,0,0,1-.17.08l-2.2-.23a.21.21,0,0,1-.19-.15.22.22,0,0,1,0-.25L17.44,9a1.81,1.81,0,0,0,0-2.58,1.78,1.78,0,0,0-1.29-.52,1.74,1.74,0,0,0-1.28.52L11.76,9.57a.21.21,0,0,1-.25,0,.24.24,0,0,1-.16-.21l-.22-2.17a.19.19,0,0,1,.08-.18l2.12-2.14a4.08,4.08,0,0,1,1.29-.85,4.05,4.05,0,0,1,3.06,0,3.85,3.85,0,0,1,1.3.85ZM5.84,9.82a.25.25,0,0,1-.18-.08.19.19,0,0,1-.07-.19l.11-.77a.2.2,0,0,1,.11-.17.24.24,0,0,1,.2,0l2.5.72a.25.25,0,0,1,.15.27.22.22,0,0,1-.23.21l-2.59,0Zm4.12-2-.73-2.5a.27.27,0,0,1,0-.2A.21.21,0,0,1,9.41,5L10.19,5a.25.25,0,0,1,.19,0,.23.23,0,0,1,.08.18l-.05,2.61a.2.2,0,0,1-.19.23h0A.22.22,0,0,1,10,7.85Zm8.76,5.58a.25.25,0,0,1,.18.08.23.23,0,0,1,.06.2l-.11.77a.25.25,0,0,1-.11.17.21.21,0,0,1-.12,0l-.08,0L16,14a.25.25,0,0,1-.15-.27.22.22,0,0,1,.22-.21l1.29,0,1.33,0Zm-4.12,2,.74,2.51a.28.28,0,0,1,0,.2.23.23,0,0,1-.18.11l-.8.11a.23.23,0,0,1-.17-.07.25.25,0,0,1-.08-.18l0-2.61a.22.22,0,0,1,.22-.22.21.21,0,0,1,.26.15Z" transform="translate(-4.41 -3.77)"/></g></svg>',math:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.81 15.73"><g><path d="M17.19,5.73a1,1,0,0,0,.71-.29,1,1,0,0,0,.28-.7,1,1,0,0,0-1-1H7.35a1,1,0,0,0-1,1,.77.77,0,0,0,.13.47h0l4.58,6.43L6.68,17.81a1.25,1.25,0,0,0-.29.71.94.94,0,0,0,.28.7.92.92,0,0,0,.69.28H17.2a1,1,0,0,0,.71-.28,1,1,0,0,0,0-1.39.92.92,0,0,0-.71-.29H9.26l3.87-5.43a.86.86,0,0,0,0-.95L9.26,5.73h7.93Z" transform="translate(-6.38 -3.77)"/></g></svg>',unlink:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.72"><g><path d="M19,18.32a4,4,0,0,0,0-5.68L15.85,9.5l-1.17,1.55L17.57,14a2,2,0,0,1,.61,1.47,2.08,2.08,0,0,1-2.09,2.09,2,2,0,0,1-1.47-.61l-.38-.37-1.74,1,.8.78a4,4,0,0,0,5.68,0ZM8,9.77a2,2,0,0,1-1.27-1,1.89,1.89,0,0,1-.21-1.57A2.1,2.1,0,0,1,7.45,6,2,2,0,0,1,9,5.76L12.27,7.2l.49-2L9.48,3.9a4,4,0,0,0-3.06.41A3.82,3.82,0,0,0,4.56,6.73a3.8,3.8,0,0,0,.4,3A3.78,3.78,0,0,0,7.39,11.6l5.38,2,.49-2-2.64-.94L8,9.77Z" transform="translate(-4.41 -3.76)"/></g></svg>',table_header:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.74"><g><path d="M17,19.5v-.78H15.5v.78H17Zm-3,0v-.78H12.5v.78H14Zm-3,0v-.78H9.53v.78H11Zm-3,0v-.78H6.53v.78H8Zm10.55,0a1.73,1.73,0,0,0,.85-.35,1.67,1.67,0,0,0,.56-.76l-.71-.31a1.21,1.21,0,0,1-.35.4,1.34,1.34,0,0,1-.53.23l.08.38c.06.24.09.38.1.41Zm-13.7-.63.55-.55A.77.77,0,0,1,5.25,18a1.31,1.31,0,0,1-.06-.38v-.38H4.41v.38a2,2,0,0,0,.12.68,1.6,1.6,0,0,0,.35.57Zm15.27-2.12V15.26h-.78v1.49h.78Zm-15-1V14.23H4.41v1.49h.78Zm15-2V12.26h-.78v1.49h.78Zm-15-1V11.22H4.41v1.51h.78Zm15-2V9.26h-.78v1.51h.78Zm-15-1V8.17H4.41V9.74h.78Zm15-2V6.28h-.78V7.77h.78Zm-15-1.11V5.33L4.48,5.1a.77.77,0,0,0-.07.27,2.72,2.72,0,0,0,0,.28v1h.79ZM19.21,5l.63-.4A1.62,1.62,0,0,0,19.16,4a1.94,1.94,0,0,0-.91-.22v.78a1.31,1.31,0,0,1,.56.12.88.88,0,0,1,.4.36ZM6,4.54H7.78V3.76H6a.82.82,0,0,0-.28.06l.12.35c.07.21.1.33.11.36Zm10.8,0V3.76H15.28v.78h1.49Zm-3,0V3.76H12.28v.78h1.49Zm-3,0V3.76H9.28v.78h1.51ZM6,10.84h12.6V6.91H6Z" transform="translate(-4.4 -3.76)"/></g></svg>',merge_cell:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 15.74"><g><path d="M18.92,13.5h1.23v4.15A1.84,1.84,0,0,1,18.3,19.5H14V18.27H18.3a.6.6,0,0,0,.44-.18.59.59,0,0,0,.18-.44V13.5ZM18.3,3.76a1.84,1.84,0,0,1,1.85,1.85V9.82H18.92V5.6a.6.6,0,0,0-.18-.44A.59.59,0,0,0,18.3,5H14V3.76H18.3Zm1.85,8.51H15.6L17.26,14l-.86.86-3.14-3.17L16.4,8.51l.86.86L15.62,11h4.54v1.24Zm-13.9,6h4.27V19.5H6.25A1.84,1.84,0,0,1,4.4,17.65V13.5H5.63v4.15a.61.61,0,0,0,.62.62Zm0-14.51h4.27V5H6.25a.6.6,0,0,0-.44.18.57.57,0,0,0-.17.43V9.81H4.41V5.6A1.83,1.83,0,0,1,6.25,3.76Zm5,7.9L8.15,14.83,7.3,14,9,12.27H4.41V11H8.94L7.3,9.38,7.73,9l.43-.43Z" transform="translate(-4.4 -3.76)"/></g></svg>',split_cell:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 15.74"><g><path d="M10.37,12.25H6.74L8.4,13.94l-.87.86L4.41,11.63,7.53,8.5l.87.86L6.74,11h3.62v1.23Zm9.78-.61L17,14.81,16.13,14l1.66-1.69H14.16V11h3.63L16.13,9.37l.43-.43A5.24,5.24,0,0,1,17,8.51ZM18.9,8.22V5.61a.57.57,0,0,0-.18-.43A.65.65,0,0,0,18.29,5H12.88V18.28h5.41a.7.7,0,0,0,.44-.18.57.57,0,0,0,.18-.43V15h1.23v2.64a1.84,1.84,0,0,1-1.85,1.83h-12A1.84,1.84,0,0,1,4.94,19a1.81,1.81,0,0,1-.54-1.29V15H5.63v2.64a.57.57,0,0,0,.18.43.67.67,0,0,0,.44.18h5.41V5H6.25a.7.7,0,0,0-.44.18.56.56,0,0,0-.17.43V8.22H4.41V5.61A1.8,1.8,0,0,1,5,4.31a1.91,1.91,0,0,1,1.31-.55h12a1.89,1.89,0,0,1,1.31.55,1.8,1.8,0,0,1,.54,1.3V8.23H18.9Z" transform="translate(-4.4 -3.76)"/></g></svg>',caption:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 13.79"><g><path d="M4.41,18.52H20.15v-2H4.41ZM20,4.73H18.07V6h.65v.65H20V4.73ZM17,6V4.73H14.55V6H17ZM13.49,6V4.73H11V6h2.47ZM10,6V4.73H7.5V6H10ZM5.79,6h.65V4.73H4.5V6.67H5.8V6ZM4.5,11.34H5.79V8.48H4.5ZM6.44,13.8H5.79v-.65H4.5v1.94H6.44ZM17,15.09V13.8H14.55v1.29H17Zm-3.52,0V13.8H11v1.29h2.47Zm-3.53,0V13.8H7.5v1.29H10ZM20,13.16H18.72v.65h-.65V15.1H20Zm-1.29-1.82H20V8.48h-1.3v2.86Z" transform="translate(-4.41 -4.73)"/></g></svg>',edit:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.73"><g><path d="M7.51,5.68h6l1.52-1.57H6.94a2.4,2.4,0,0,0-1.79.82A2.8,2.8,0,0,0,4.41,6.8V17a2.55,2.55,0,0,0,.75,1.8A2.48,2.48,0,0,0,7,19.5H17.22a2.57,2.57,0,0,0,1.83-.74,2.52,2.52,0,0,0,.77-1.8V8.83l-1.58,1.54v6a1.54,1.54,0,0,1-1.53,1.53H7.51A1.54,1.54,0,0,1,6,16.41V7.21A1.52,1.52,0,0,1,7.51,5.68Zm5.63,7.47h0L10.7,10.74l-1,3.38,1.71-.48,1.7-.49Zm.34-.34h0l5.36-5.32L16.4,5.08,11,10.4l1.23,1.21,1.21,1.2ZM19.93,6.4a.82.82,0,0,0,.22-.48A.54.54,0,0,0,20,5.47L18.45,4A.67.67,0,0,0,18,3.77a.7.7,0,0,0-.48.21l-.74.72,2.44,2.43.37-.37.35-.36Z" transform="translate(-4.41 -3.77)"/></g></svg>',delete:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 15.74"><g><path d="M19.16,6.71a.94.94,0,0,0,.69-.28.91.91,0,0,0,.29-.68A1,1,0,0,0,19.85,5a.93.93,0,0,0-.69-.3H14.24A.94.94,0,0,0,14,4.06a.92.92,0,0,0-.7-.3h-2a1,1,0,0,0-.7.3.93.93,0,0,0-.28.68H5.39A.92.92,0,0,0,4.7,5a1,1,0,0,0-.29.71.91.91,0,0,0,.29.68,1,1,0,0,0,.69.28H19.16Zm-12.79,1a1,1,0,0,0-.7.3.94.94,0,0,0-.28.69v8.85A1.88,1.88,0,0,0,6,18.93a1.9,1.9,0,0,0,1.39.57H17.2a1.87,1.87,0,0,0,1.39-.58,1.91,1.91,0,0,0,.58-1.39V8.68A1,1,0,0,0,18.88,8a.89.89,0,0,0-.7-.29,1,1,0,0,0-.69.29.92.92,0,0,0-.29.68v7.87a1,1,0,0,1-1,1H8.34a.94.94,0,0,1-.69-.28,1,1,0,0,1-.29-.71V8.68a1,1,0,0,0-1-1Z" transform="translate(-4.41 -3.76)"/></g></svg>',modify:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.7 15.74"><g><path d="M19.79,15.23a.66.66,0,0,1,.3.38.59.59,0,0,1-.07.48l-.8,1.38a.66.66,0,0,1-.38.3.59.59,0,0,1-.48-.07l-.68-.38a4.55,4.55,0,0,1-1.34.77v.78a.64.64,0,0,1-.18.45.61.61,0,0,1-.45.18h-1.6a.6.6,0,0,1-.44-.18.66.66,0,0,1-.19-.45v-.78a4.36,4.36,0,0,1-1.32-.77l-.69.38a.58.58,0,0,1-.48.07.66.66,0,0,1-.38-.3l-.38-.66h.83a1.77,1.77,0,0,0,1.23-.52,1.72,1.72,0,0,0,.51-1.23v-.18a3,3,0,0,0,.49-.28l.15.09a1.83,1.83,0,0,0,.88.23A1.75,1.75,0,0,0,15.84,14l.88-1.52a1.7,1.7,0,0,0,.17-1.32,1.66,1.66,0,0,0-.3-.61,1.84,1.84,0,0,0-.51-.45l-.15-.09,0-.29,0-.28.15-.09a1,1,0,0,0,.26-.18l0,.06v.78a4.34,4.34,0,0,1,1.34.77l.68-.38a.68.68,0,0,1,.48-.06.64.64,0,0,1,.38.29l.8,1.38a.58.58,0,0,1,.07.48.63.63,0,0,1-.3.38l-.68.4a3.84,3.84,0,0,1,.08.76,4.13,4.13,0,0,1-.08.78l.34.18.32.2ZM10.17,7.86a1.9,1.9,0,0,1,1.35,3.23,1.85,1.85,0,0,1-1.35.55A1.9,1.9,0,0,1,8.83,8.41a1.92,1.92,0,0,1,1.34-.55Zm1.58,7.2a.73.73,0,0,1-.21.49.66.66,0,0,1-.48.2H9.29a.68.68,0,0,1-.69-.69V14.2a4.75,4.75,0,0,1-1.48-.86l-.75.45a.73.73,0,0,1-.7,0,.63.63,0,0,1-.25-.26L4.54,12a.67.67,0,0,1-.08-.53.71.71,0,0,1,.32-.42l.75-.43a4.8,4.8,0,0,1-.08-.85,4.71,4.71,0,0,1,.08-.85l-.74-.44a.71.71,0,0,1-.32-.42.65.65,0,0,1,.07-.54L5.42,6a.66.66,0,0,1,.42-.32l.18,0a.73.73,0,0,1,.35.09l.75.43A4.68,4.68,0,0,1,8.6,5.33V4.45a.68.68,0,0,1,.69-.69h1.77a.64.64,0,0,1,.48.2.73.73,0,0,1,.21.49v.88a4.75,4.75,0,0,1,1.48.85L14,5.75a.67.67,0,0,1,.34-.09l.18,0a.71.71,0,0,1,.42.32l.89,1.54a.67.67,0,0,1,.06.52.73.73,0,0,1-.32.43l-.75.42a4.8,4.8,0,0,1,.08.85,4.71,4.71,0,0,1-.08.85l.75.43a.66.66,0,0,1,.32.42.73.73,0,0,1-.06.54l-.89,1.52a.69.69,0,0,1-.25.26.7.7,0,0,1-.35.09.64.64,0,0,1-.34-.09l-.75-.45a4.87,4.87,0,0,1-1.48.86v.87ZM7.23,9.75a3,3,0,0,0,.86,2.08,2.94,2.94,0,1,0,4.16-4.16,3,3,0,0,0-2.08-.85A2.94,2.94,0,0,0,7.23,9.75Z" transform="translate(-4.44 -3.76)"/></g></svg>',revert:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 14.69"><g><path d="M18.26,15V12.3l1.89-2V15a2.58,2.58,0,0,1-.24,1c-.2.58-.75.92-1.65,1H7.56v2L4.41,15.63,7.56,13v2h10.7ZM6.3,8.28V11L4.41,13V8.28a2.58,2.58,0,0,1,.24-1c.2-.58.75-.92,1.65-1H17v-2l3.15,3.34L17,10.3v-2H6.3Z" transform="translate(-4.4 -4.28)"/></g></svg>',auto_size:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 15.74"><g><path d="M6.71,17.19,6.89,16l1.21-.15A6,6,0,0,1,6.81,13.9a5.78,5.78,0,0,1-.45-2.27A6,6,0,0,1,8.1,7.45a5.83,5.83,0,0,1,4.17-1.73l1-1-1-1A7.89,7.89,0,0,0,5,14.64a7.73,7.73,0,0,0,1.71,2.55Zm5.57,2.31h0A7.86,7.86,0,0,0,17.85,6.07L17.67,7.3l-1.21.15a5.9,5.9,0,0,1,1.29,1.92,5.81,5.81,0,0,1,.45,2.26,5.91,5.91,0,0,1-5.9,5.9l-1,1,.49.49.47.5Z" transform="translate(-4.41 -3.76)"/></g></svg>',insert_row_below:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M15.7,1.3c-0.1-0.1-0.1-0.2-0.2-0.2L15.3,1H0.4L0.3,1.1c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0.1-0.1,0.1L0,1.4v7.7l0.1,0.1c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h2.3V9.3l0.1-0.5L3,8.5l0.1-0.2c-0.1,0-0.2,0-0.3,0H1.2v-6h13.3v6h-1.6c-0.1,0-0.2,0-0.3,0l0.1,0.2l0.2,0.4C12.9,9,13,9.2,13,9.3v0.1h2.3l0.2-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1V1.4L15.7,1.3z"/><path d="M10.5,7.5C9.9,7.1,9.3,6.8,8.6,6.7c-0.2,0-0.5-0.1-0.7,0c-0.2,0-0.5,0-0.7,0C6.6,6.7,6.1,6.9,5.6,7.3C5.2,7.6,4.7,8,4.4,8.4C4.3,8.6,4.2,8.8,4.2,8.9C4.1,9.1,4,9.3,3.9,9.4C3.9,9.6,3.8,9.7,3.8,9.9c0,0.2-0.1,0.3-0.1,0.5v-0.1c-0.1,0.8,0.1,1.6,0.5,2.4c0.4,0.7,1,1.3,1.7,1.7c0.3,0.2,0.6,0.3,0.9,0.3c0.3,0.1,0.7,0.1,1,0.1c0.3,0,0.7,0,1-0.1c0.3-0.1,0.6-0.2,0.9-0.3c0.5-0.3,0.9-0.6,1.3-1c0.3-0.4,0.6-0.8,0.8-1.3c0.1-0.4,0.2-0.9,0.2-1.4c0-0.5-0.1-1-0.3-1.4C11.5,8.6,11.1,8,10.5,7.5z M10.1,11.3H8.5v1.6H8H7.9H7.3v0v-0.1v-1.4H5.7v-0.4v-0.2v-0.6h0h1.5V8.5h1.2v1.6h1.6V11.3z"/></g></svg>',insert_row_above:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M0.1,14.5c0.1,0.1,0.1,0.2,0.2,0.2l0.1,0.1h14.9l0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1l0.1-0.1V6.7l-0.1-0.1c0-0.1-0.1-0.1-0.2-0.2l-0.1-0.1h-2.3v0.1l-0.1,0.5l-0.2,0.4l-0.1,0.2c0.1,0,0.2,0,0.3,0h1.6v6H1.3v-6h1.6c0.1,0,0.2,0,0.3,0L3.1,7.3L2.9,6.9C2.8,6.8,2.8,6.6,2.7,6.5V6.3H0.4L0.3,6.4c-0.1,0-0.1,0.1-0.2,0.2L0,6.7v7.7L0.1,14.5z"/><path d="M5.3,8.3c0.6,0.5,1.2,0.8,1.9,0.9c0.2,0,0.5,0.1,0.7,0c0.2,0,0.5,0,0.7,0c0.6-0.1,1.1-0.3,1.6-0.6c0.5-0.3,0.9-0.7,1.2-1.2c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.4,0.2-0.5c0.1-0.1,0.1-0.3,0.1-0.4C12,5.8,12,5.6,12,5.4v0.1c0.1-0.8-0.1-1.6-0.5-2.4c-0.4-0.7-1-1.3-1.7-1.7C9.5,1.3,9.2,1.2,8.9,1.1C8.5,1,8.2,1,7.9,1c-0.3,0-0.7,0-1,0.1C6.6,1.2,6.3,1.3,6,1.4C5.5,1.7,5.1,2,4.7,2.4C4.4,2.8,4.1,3.3,3.9,3.8C3.8,4.2,3.7,4.7,3.7,5.2c0,0.5,0.1,1,0.3,1.4C4.3,7.2,4.7,7.8,5.3,8.3z M5.7,4.5h1.6V2.9h0.5h0.1h0.6v0v0.1v1.4H10v0.4v0.2v0.6h0H8.5v1.6H7.3V5.7H5.7V4.5z"/></g></svg>',insert_column_left:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M14.5,15.7c0.1-0.1,0.2-0.1,0.2-0.2l0.1-0.1V0.4l-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1L14.4,0H6.7L6.6,0.1c-0.1,0-0.1,0.1-0.2,0.2L6.3,0.4v2.3h0.1l0.5,0.1L7.3,3l0.2,0.1c0-0.1,0-0.2,0-0.3V1.2h6v13.3h-6v-1.6c0-0.1,0-0.2,0-0.3l-0.2,0.1l-0.4,0.2C6.7,12.9,6.6,13,6.4,13H6.3v2.3l0.1,0.2c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h7.7L14.5,15.7z"/><path d="M8.3,10.5C8.7,10,9,9.3,9.1,8.6c0-0.2,0.1-0.5,0-0.7c0-0.2,0-0.5,0-0.7C9,6.7,8.8,6.1,8.5,5.7C8.2,5.2,7.8,4.8,7.3,4.5C7.2,4.4,7,4.3,6.9,4.2C6.7,4.1,6.5,4,6.4,4C6.2,3.9,6.1,3.9,5.9,3.8c-0.2,0-0.3-0.1-0.5-0.1h0.1C4.7,3.7,3.8,3.9,3.1,4.3C2.4,4.7,1.8,5.3,1.4,6C1.3,6.3,1.2,6.6,1.1,6.9C1,7.2,1,7.6,1,7.9c0,0.3,0,0.7,0.1,1c0.1,0.3,0.2,0.6,0.3,0.9c0.3,0.5,0.6,0.9,1,1.3c0.4,0.3,0.8,0.6,1.3,0.8C4.2,12,4.7,12.1,5.1,12c0.5,0,1-0.1,1.4-0.3C7.2,11.5,7.8,11.1,8.3,10.5zM4.5,10.1V8.5H2.9V8V7.9V7.3h0H3h1.4V5.7h0.4h0.2h0.6v0v1.5h1.6v1.2H5.7v1.6H4.5z"/></g></svg>',insert_column_right:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M1.3,0.1C1.2,0.2,1.1,0.2,1.1,0.3L1,0.4v14.9l0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1l0.1,0.1h7.7l0.1-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1v-2.3H9.3l-0.5-0.1l-0.4-0.2l-0.2-0.1c0,0.1,0,0.2,0,0.3v1.6h-6V1.3h6v1.6c0,0.1,0,0.2,0,0.3l0.2-0.1l0.4-0.2C9,2.9,9.2,2.8,9.3,2.8h0.1V0.5L9.4,0.3c0-0.1-0.1-0.1-0.2-0.2L9.1,0H1.4L1.3,0.1z"/><path d="M7.5,5.3C7,5.8,6.7,6.5,6.6,7.2c0,0.2-0.1,0.5,0,0.7c0,0.2,0,0.5,0,0.7c0.1,0.6,0.3,1.1,0.6,1.6c0.3,0.5,0.7,0.9,1.2,1.2c0.2,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.2,0.5,0.2c0.1,0.1,0.3,0.1,0.4,0.1c0.2,0,0.3,0.1,0.5,0.1h-0.1c0.8,0.1,1.6-0.1,2.4-0.5c0.7-0.4,1.3-1,1.7-1.7c0.2-0.3,0.3-0.6,0.3-0.9c0.1-0.3,0.1-0.7,0.1-1c0-0.3,0-0.7-0.1-1c-0.1-0.3-0.2-0.6-0.3-0.9c-0.3-0.5-0.6-0.9-1-1.3C13,4.4,12.5,4.2,12,4c-0.4-0.1-0.9-0.2-1.4-0.2c-0.5,0-1,0.1-1.4,0.2C8.5,4.3,7.9,4.7,7.5,5.3z M11.3,5.7v1.6h1.6v0.5v0.1v0.6h0h-0.1h-1.4v1.6h-0.4h-0.2h-0.6v0V8.5H8.5V7.3h1.6V5.7H11.3z"/></g></svg>',delete_row:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 13.83"><g><path d="M4.7,18.46l.12.08H19.73l.12-.08a.58.58,0,0,0,.22-.22l.08-.12,0-7.69-.08-.11a.77.77,0,0,0-.18-.18l-.11-.08-2.31,0-.08.28-.1.29a1.58,1.58,0,0,1-.12.29l-.14.34s0,0,.18,0H18.9v6H5.64v-6H7.35c.14,0,.2,0,.18,0l-.14-.34a2.85,2.85,0,0,1-.12-.29l-.1-.29-.07-.27-2.31,0-.11.08a.77.77,0,0,0-.18.18l-.08.11,0,7.69.08.12a.47.47,0,0,0,.09.12l.13.09ZM12.11,13a4,4,0,0,0,1.46-.21,4.51,4.51,0,0,0,1.31-.71A4,4,0,0,0,16.26,10a4.32,4.32,0,0,0-.08-2.54,4.34,4.34,0,0,0-1-1.52,4.15,4.15,0,0,0-1.54-1,4.34,4.34,0,0,0-1.35-.22A4.07,4.07,0,0,0,11,4.93,3.94,3.94,0,0,0,9.24,6.07,3.92,3.92,0,0,0,8.15,8.88a3.91,3.91,0,0,0,.12.95A4.16,4.16,0,0,0,12.11,13Zm2.35-4.14v.58H10.09V8.27h4.37v.58Z" transform="translate(-4.4 -4.71)"/></g></svg>',delete_column:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13.81 15.74"><g><path d="M5.66,19.42l.12.08,7.69,0,.11-.08a.77.77,0,0,0,.18-.18l.08-.11,0-2.32-.15,0-.45-.15-.42-.18-.17-.07a1,1,0,0,0,0,.27v1.63h-6V5h6V6.62a.9.9,0,0,0,0,.26l.17-.07.42-.17a3.91,3.91,0,0,1,.45-.15l.15,0,0-2.32L13.75,4a.77.77,0,0,0-.18-.18l-.11-.08H5.79l-.13.07a.63.63,0,0,0-.21.22l-.08.12V19.08l.08.12a.47.47,0,0,0,.09.12.35.35,0,0,0,.12.1Zm9-3.67a4.16,4.16,0,0,0,2.36-.51,4.08,4.08,0,0,0,1.67-1.72,4,4,0,0,0,.35-.91,3.79,3.79,0,0,0,.1-1,4.71,4.71,0,0,0-.11-1,5,5,0,0,0-.3-.87,4.25,4.25,0,0,0-1-1.25,4.49,4.49,0,0,0-1.34-.81A4.26,4.26,0,0,0,15,7.48a3.88,3.88,0,0,0-1.41.25A4.32,4.32,0,0,0,11.86,9,4,4,0,0,0,11,10.94a4.4,4.4,0,0,0-.05.68,4.5,4.5,0,0,0,.05.68,3.93,3.93,0,0,0,.61,1.57,4.22,4.22,0,0,0,1.18,1.2,4.59,4.59,0,0,0,.48.27c.2.1.37.17.5.22a2.44,2.44,0,0,0,.45.12,4.61,4.61,0,0,0,.5.07Zm2.54-4.12v.58H12.87V11h4.37v.59Z" transform="translate(-5.37 -3.76)"/></g></svg>',fixed_column_width:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6,5H18A1,1 0 0,1 19,6A1,1 0 0,1 18,7H6A1,1 0 0,1 5,6A1,1 0 0,1 6,5M21,2V4H3V2H21M15,8H17V22H15V8M7,8H9V22H7V8M11,8H13V22H11V8Z" /></svg>',rotate_left:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M0.5,10.2c0,0.1,0,0.2,0,0.3v0.2l0,0c0.1,0.3,0.3,0.6,0.4,0.9l0,0C1,11.8,1.3,12,1.5,11.9h0.1h0.2h0.1c0.1-0.1,0.3-0.3,0.4-0.5v-0.2c0-0.1,0-0.2-0.1-0.3l0,0c-0.2-0.2-0.3-0.4-0.3-0.7l0,0C1.8,10,1.7,9.9,1.5,9.8c-0.1,0-0.2,0-0.3,0H0.9C0.7,9.9,0.6,10,0.5,10.2L0.5,10.2z"/><path d="M2.2,11.5L2.2,11.5L2.2,11.5z"/><path d="M5.9,3.6L5.9,3.6L5.9,3.6z"/><path d="M0.1,7.9c0,0.3,0,0.6,0,0.9l0,0l0,0l0,0l0,0c0,0.2,0.1,0.3,0.2,0.4l0,0c0.2,0.1,0.3,0.2,0.5,0.2l0,0l0,0c0.2,0,0.4-0.1,0.5-0.3l0,0c0-0.1,0.1-0.3,0.1-0.4V8.6l0,0c0-0.2,0-0.5,0-0.7l0,0c0-0.2-0.1-0.4-0.2-0.5C1.1,7.3,0.9,7.2,0.7,7.2S0.3,7.3,0.2,7.4C0.1,7.5,0,7.7,0.1,7.9z"/><path d="M1.9,12.7L1.9,12.7c0,0.2,0,0.4,0.2,0.5l0,0l0.2,0.3l0,0c0.2,0.1,0.3,0.2,0.5,0.4l0,0l0,0l0,0l0,0C2.9,14,3,14.1,3.2,14.1s0.4-0.1,0.5-0.2c0.1-0.2,0.2-0.3,0.2-0.5v-0.1c0-0.2-0.1-0.4-0.2-0.5l0,0l-0.4-0.4l-0.2-0.2l0,0C3,12.1,2.8,12,2.6,12l0,0c-0.2,0-0.4,0.1-0.5,0.2l0,0C2,12.3,1.9,12.5,1.9,12.7z"/><path d="M6.6,15c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.2,0.4,0.3l0,0c0.3,0,0.5,0,0.7,0h0.3l0,0c0.2,0,0.4-0.1,0.5-0.2c0.1-0.2,0.2-0.3,0.2-0.5l0,0l0,0c0-0.2-0.1-0.4-0.2-0.5l0,0c-0.1-0.1-0.3-0.2-0.5-0.2l0,0H7.9c-0.1,0-0.3,0-0.5,0l0,0H7.3c-0.2-0.1-0.3,0-0.5,0.1l0,0C6.7,14.6,6.6,14.8,6.6,15L6.6,15L6.6,15L6.6,15z"/><path d="M4.2,7.4C4,7.5,4,7.7,4,7.9c0,0.2,0,0.4,0.2,0.5l0,0l3.2,3.2l0,0c0.1,0.1,0.3,0.2,0.5,0.2s0.3-0.1,0.5-0.2l0,0l3.2-3.2l0,0c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5l0,0C11.5,7.3,11,6.7,10,5.8l0,0L8.4,4.2l0,0C8.3,4.1,8.1,4,7.9,4S7.5,4.1,7.4,4.2L4.2,7.4L4.2,7.4z M6.8,9L5.7,7.9l2.2-2.2l2.3,2.2l-2.3,2.2C7.7,9.9,7.3,9.5,6.8,9L6.8,9z"/><path d="M4.1,14.1C4,14.2,4,14.3,4,14.4v0.2l0,0c0.1,0.1,0.2,0.3,0.4,0.4l0,0c0.3,0.1,0.6,0.2,0.9,0.4h0.1h0.1l0,0c0.2,0,0.3-0.1,0.5-0.1l0,0c0.2-0.1,0.3-0.3,0.3-0.4l0,0l0,0l0,0l0,0v-0.2c0-0.1-0.1-0.2-0.1-0.3l0,0C6.1,14.2,6,14.1,5.8,14l0,0c-0.3-0.1-0.5-0.2-0.8-0.2l0,0c-0.1-0.1-0.2-0.1-0.3-0.1H4.5C4.3,13.7,4.2,13.9,4.1,14.1z"/><path d="M9.3,14.4c0,0.1-0.1,0.3,0,0.4V15l0,0c0,0.1,0.1,0.3,0.5,0.4c0.1,0.1,0.3,0.1,0.4,0.1l0,0h0.1l0,0c0.3-0.1,0.6-0.2,0.9-0.3l0,0c0.1-0.1,0.2-0.2,0.3-0.4l0.1-0.3c0-0.1-0.1-0.2-0.1-0.3l0,0c-0.1-0.2-0.2-0.3-0.4-0.4l0,0h-0.3c-0.1,0-0.2,0-0.3,0l0,0c-0.2,0.1-0.5,0.2-0.8,0.3l0,0C9.5,14.1,9.4,14.2,9.3,14.4L9.3,14.4z"/><path d="M11.4,14.7L11.4,14.7L11.4,14.7z"/><path d="M9.5,15.3L9.5,15.3L9.5,15.3z"/><path d="M15.9,7.9c0-1-0.2-2-0.6-3l0,0c-0.4-1-1-1.9-1.7-2.6C12.8,1.6,12,1,11,0.6l0,0C10.1,0.2,9,0,8,0C7.3,0,6.5,0.1,5.8,0.3l0,0C5.2,0.5,4.6,0.8,4,1.1L3.1,0.2l0,0C2.9,0.1,2.8,0,2.6,0H2.4l0,0C2.2,0,2,0.2,1.9,0.4l0,0L0.1,4.9l0,0C0,5,0,5.1,0,5.2c0,0.2,0.1,0.4,0.2,0.5l0,0c0.2,0.1,0.3,0.2,0.5,0.2h0.1H1l0,0l4.7-1.8l0,0C5.9,4,6.1,3.8,6.1,3.6V3.4C6.1,3.2,6,3,5.9,2.9l0,0L5.1,2.1c0.4-0.2,0.8-0.4,1.3-0.5c0.5-0.1,1.1-0.2,1.7-0.2c0.9,0,1.7,0.2,2.5,0.5l0,0c0.8,0.3,1.5,0.8,2.1,1.4c0.6,0.6,1.1,1.3,1.4,2.1l0,0c0.3,0.8,0.5,1.6,0.5,2.5s-0.2,1.7-0.5,2.5l0,0c-0.3,0.8-0.8,1.5-1.4,2.1c-0.2,0.2-0.4,0.3-0.6,0.5l0,0c-0.2,0.1-0.3,0.3-0.3,0.5v0.1c0,0.1,0,0.3,0.1,0.4l0,0c0.1,0.2,0.3,0.3,0.5,0.3l0,0c0.1,0,0.3-0.1,0.4-0.2l0,0l0,0l0,0l0,0c0.2-0.2,0.5-0.4,0.7-0.6l0,0l0,0l0,0l0,0c0.7-0.8,1.3-1.6,1.7-2.6C15.6,10,15.8,9,15.9,7.9z M1.9,4C2,3.8,2.1,3.5,2.3,3.1l0,0L2.7,2l1.2,1.2L1.9,4z"/><path d="M6.8,15.5L6.8,15.5L6.8,15.5z"/></g></svg>',rotate_right:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.8 15.8"><g><path d="M9.9,15.3L9.9,15.3L9.9,15.3z"/><path d="M6.9,15.1L6.9,15.1c0,0.1,0.1,0.3,0.2,0.4l0,0c0.1,0.2,0.3,0.3,0.5,0.3l0,0h0.3c0.2,0,0.4,0,0.7,0l0,0c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.2,0.2-0.4V15c0-0.2-0.1-0.4-0.2-0.4c-0.2-0.1-0.3-0.2-0.5-0.2H8.4l0,0c-0.1,0-0.3,0-0.5,0H7.6l0,0c-0.2,0-0.4,0.1-0.5,0.2C7,14.7,6.9,14.9,6.9,15.1z"/><path d="M6.5,14.4L6.5,14.4L6.5,14.4z"/><path d="M5.8,5.8L5.8,5.8c-1,0.9-1.5,1.5-1.7,1.6l0,0C4,7.5,4,7.7,4,7.9c0,0.2,0,0.4,0.2,0.5l0,0l3.2,3.2l0,0c0.2,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l0,0l3.2-3.2l0,0c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5l0,0L8.4,4.2C8.3,4.1,8.1,4,7.9,4C7.7,4,7.5,4.1,7.4,4.2l0,0L5.8,5.8z M5.6,7.9l2.3-2.2l2.2,2.2L9,9l0,0l0,0l0,0l0,0c-0.5,0.6-0.9,0.9-1.1,1.1L5.6,7.9z"/><path d="M9,15.5L9,15.5L9,15.5z"/><path d="M9.6,14.7v0.2l0,0l0,0l0,0l0,0c0.1,0.2,0.1,0.3,0.3,0.3c0.1,0.1,0.3,0.1,0.4,0.1l0,0h0.1h0.1c0.3-0.1,0.6-0.3,0.9-0.4l0,0c0.1-0.1,0.2-0.2,0.3-0.4l0,0v-0.2c0-0.1,0-0.2-0.1-0.3c-0.1-0.2-0.2-0.3-0.4-0.4H11c-0.1,0-0.2,0.1-0.3,0.1l0,0c-0.2,0.1-0.4,0.2-0.7,0.3l0,0l0,0c-0.1,0.1-0.3,0.2-0.4,0.4C9.6,14.5,9.6,14.6,9.6,14.7z"/><path d="M9,14.5L9,14.5L9,14.5z"/><path d="M9.6,14.4L9.6,14.4L9.6,14.4z"/><path d="M11.7,14L11.7,14L11.7,14z"/><path d="M15.6,7.4L15.6,7.4L15.6,7.4z"/><path d="M15,9.4c0.2,0,0.4,0,0.6-0.2l0,0c0.1-0.1,0.2-0.2,0.2-0.4l0,0l0,0l0,0l0,0c0-0.3,0-0.6,0-0.9c0-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.3-0.2-0.5-0.2s-0.4,0.1-0.5,0.2c-0.1,0.1-0.2,0.3-0.2,0.5l0,0c0,0.2,0,0.4,0,0.7l0,0v0.1c0,0.1,0,0.3,0.1,0.4l0,0C14.6,9.3,14.8,9.4,15,9.4L15,9.4L15,9.4z"/><path d="M14,12h0.1h0.2h0.1c0.2,0,0.5-0.2,0.6-0.4l0,0c0.2-0.3,0.3-0.6,0.4-0.9l0,0v-0.2c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.2-0.2-0.3-0.4-0.4h-0.3c-0.1,0-0.2,0-0.3,0C14.2,9.9,14,10,14,10.3l0,0c-0.1,0.2-0.2,0.5-0.3,0.7l0,0c-0.1,0.1-0.1,0.2-0.1,0.3v0.2l0,0l0,0C13.6,11.6,13.8,11.8,14,12z"/><path d="M14.6,7.4L14.6,7.4L14.6,7.4z"/><path d="M4.4,14.2c-0.1,0.1-0.1,0.2-0.1,0.3l0.1,0.2c0,0.2,0.2,0.3,0.3,0.4l0,0c0.3,0.1,0.6,0.3,1.1,0.4l0,0h0.1l0,0c0.1,0,0.2-0.1,0.4-0.2c0.1,0,0.2-0.2,0.3-0.3l0,0v-0.2c0-0.1-0.1-0.3-0.2-0.4c-0.1-0.1-0.2-0.2-0.4-0.3l0,0c-0.2-0.1-0.5-0.2-0.7-0.3l0,0c-0.1,0-0.2,0-0.3,0H4.7l0,0C4.6,13.9,4.4,14,4.4,14.2L4.4,14.2z"/><path d="M11.9,13.3c0,0.2,0.1,0.4,0.2,0.6c0.1,0.1,0.3,0.2,0.5,0.2s0.4-0.1,0.5-0.2l0,0l0,0l0,0l0,0c0.1-0.1,0.3-0.3,0.4-0.4l0,0l0.2-0.3l0,0c0.1-0.2,0.2-0.3,0.2-0.5l0,0c0-0.2-0.1-0.4-0.2-0.5l0,0c-0.1-0.1-0.3-0.2-0.5-0.2l0,0c-0.2,0-0.4,0.1-0.5,0.2l0,0l-0.2,0.2l-0.4,0.4l0,0C12,13,11.9,13.1,11.9,13.3L11.9,13.3z"/><path d="M12.1,13.8L12.1,13.8L12.1,13.8z"/><path d="M11.9,13.3L11.9,13.3L11.9,13.3z"/><path d="M15.9,5.2c0-0.1-0.1-0.2-0.1-0.3l0,0L14,0.4l0,0C13.9,0.2,13.7,0,13.5,0l0,0l0,0h-0.2c-0.2,0-0.4,0.1-0.5,0.2l0,0l-0.9,0.9c-0.5-0.3-1.1-0.6-1.8-0.8l0,0C9.4,0.1,8.7,0,7.9,0c-1,0-2,0.2-3,0.6S3,1.6,2.3,2.3C1.6,3.1,1,3.9,0.6,4.9l0,0C0.2,5.8,0,6.8,0,7.9c0,1,0.2,2,0.6,3s0.9,1.8,1.7,2.6l0,0l0,0l0,0l0,0c0.2,0.2,0.5,0.4,0.7,0.6l0,0l0,0l0,0l0,0c0.2,0.1,0.3,0.2,0.5,0.2l0,0c0.2,0,0.4-0.1,0.6-0.3l0,0c0.1-0.1,0.1-0.3,0.1-0.4v-0.1l0,0C4.1,13.3,4,13.1,3.9,13l0,0c-0.2-0.1-0.4-0.3-0.6-0.5c-0.6-0.6-1.1-1.3-1.4-2.1l0,0C1.6,9.6,1.4,8.8,1.4,7.9s0.2-1.7,0.5-2.5l0,0c0.3-0.8,0.8-1.5,1.4-2.1c0.6-0.6,1.3-1.1,2.1-1.4l0,0C6.2,1.6,7,1.4,7.9,1.4c0.6,0,1.1,0.1,1.7,0.2c0.5,0.1,0.9,0.3,1.3,0.5l-0.8,0.8l0,0C10,3.1,9.9,3.2,9.9,3.4v0.2l0,0l0,0c0,0.2,0.2,0.4,0.4,0.5l0,0l4.5,1.8l0,0H15h0.1c0.2,0,0.4-0.1,0.5-0.2l0,0C15.7,5.6,15.8,5.4,15.9,5.2z M11.8,3.2L13,2l0.4,1.1l0,0c0.2,0.4,0.3,0.7,0.4,0.9L11.8,3.2z"/></g></svg>',mirror_horizontal:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.75 15.74"><g><path d="M13.75,3.76l5.9,15.74h-5.9V3.76ZM4.9,19.5,10.8,3.76V19.5H4.9Z" transform="translate(-4.9 -3.76)"/></g></svg>',mirror_vertical:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.74 14.75"><g><path d="M20.15,13.1,4.41,19V13.1H20.15ZM4.41,4.25l15.74,5.9H4.41V4.25Z" transform="translate(-4.41 -4.25)"/></g></svg>',checked:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.75 12.1"><g><path d="M4.59,12.23l.12.18L9.43,17.5a.58.58,0,0,0,.84,0L20,7.45h0a.58.58,0,0,0,0-.84l-.85-.85a.58.58,0,0,0-.84,0H18.2l-8.12,8.41a.29.29,0,0,1-.42,0l-3.4-3.63a.58.58,0,0,0-.84,0l-.85.85a.6.6,0,0,0-.14.21.51.51,0,0,0,0,.44c.05.06.1.13.16.19Z" transform="translate(-4.38 -5.58)"/></g></svg>',line_break:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,6a1,1,0,0,0-1,1v4a1,1,0,0,1-1,1H7.41l1.3-1.29A1,1,0,0,0,7.29,9.29l-3,3a1,1,0,0,0-.21.33,1,1,0,0,0,0,.76,1,1,0,0,0,.21.33l3,3a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42L7.41,14H17a3,3,0,0,0,3-3V7A1,1,0,0,0,19,6Z"/></svg>',audio:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" /></svg>',image_gallery:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 30 150 150"><g><path d="M152.775,120.548V51.651c0-12.271-9.984-22.254-22.254-22.254H43.727c-12.271,0-22.254,9.983-22.254,22.254v68.896c0,12.27,9.983,22.254,22.254,22.254h86.795C142.791,142.802,152.775,132.817,152.775,120.548z M36.394,51.651c0-4.042,3.291-7.333,7.333-7.333h86.795c4.042,0,7.332,3.291,7.332,7.333v23.917l-14.938-17.767c-1.41-1.678-3.487-2.649-5.68-2.658h-0.029c-2.184,0-4.255,0.954-5.674,2.613L76.709,98.519l-9.096-9.398c-1.427-1.474-3.392-2.291-5.448-2.273c-2.052,0.025-4.004,0.893-5.396,2.4L36.394,111.32V51.651z M41.684,127.585l20.697-22.416l9.312,9.622c1.461,1.511,3.489,2.334,5.592,2.27c2.101-0.066,4.075-1.013,5.44-2.612l34.436-40.308l20.693,24.613v21.794c0,4.042-3.29,7.332-7.332,7.332H43.727C43.018,127.88,42.334,127.775,41.684,127.585z M182.616,152.5V75.657c0-4.12-3.34-7.46-7.461-7.46c-4.119,0-7.46,3.34-7.46,7.46V152.5c0,4.112-3.347,7.46-7.461,7.46h-94c-4.119,0-7.46,3.339-7.46,7.459c0,4.123,3.341,7.462,7.46,7.462h94C172.576,174.881,182.616,164.841,182.616,152.5z"/></g></svg>',bookmark:'<svg viewBox="0 0 24 24"><path d="M17,3H7A2,2 0 0,0 5,5V21L12,18L19,21V5C19,3.89 18.1,3 17,3Z" /></svg>',more_text:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 10 180 180"><g><path d="M49.711,142.188h49.027c2.328,0.002,4.394,1.492,5.129,3.699l9.742,29.252c0.363,1.092,1.385,1.828,2.537,1.83l15.883,0.01c0.859,0,1.667-0.412,2.17-1.109s0.641-1.594,0.37-2.41l-16.625-50.045L86.503,28.953c-0.36-1.097-1.383-1.839-2.537-1.842H64.532c-1.153-0.001-2.178,0.736-2.542,1.831L13.847,173.457c-0.271,0.816-0.135,1.713,0.369,2.412c0.503,0.697,1.311,1.109,2.171,1.109h15.872c1.151,0,2.173-0.736,2.537-1.828l9.793-29.287C45.325,143.66,47.39,142.18,49.711,142.188L49.711,142.188z M53.493,119.098l15.607-46.9c0.744-2.196,2.806-3.674,5.125-3.674s4.381,1.478,5.125,3.674l15.607,46.904c0.537,1.621,0.263,3.402-0.736,4.789c-1.018,1.408-2.649,2.24-4.386,2.24H58.615c-1.736,0-3.368-0.832-4.386-2.24C53.23,122.504,52.956,120.721,53.493,119.098L53.493,119.098z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.633,190.465,66.178,190.465,63.32L190.465,63.32z M190.465,101.994c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.887,1.026,5.352,3.056,7.395c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.994L190.465,101.994z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>',more_paragraph:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 10 180 180"><g><path d="M128.39,28.499H63.493c-25.558,0-46.354,20.796-46.354,46.354c0,25.559,20.796,46.353,46.354,46.353h9.271v55.625h18.542V47.04h9.271V176.83h18.543V47.04h9.271V28.499z M72.764,102.664h-9.271c-15.337,0-27.813-12.475-27.813-27.812c0-15.336,12.476-27.813,27.813-27.813h9.271V102.664z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.633,190.465,66.178,190.465,63.32L190.465,63.32z M190.465,101.994c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.887,1.026,5.352,3.056,7.395c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.994L190.465,101.994z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>',more_plus:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="35 30 140 140"><g><path d="M137.215,102.045c0,3.498-2.835,6.332-6.333,6.332H24.549c-3.498,0-6.334-2.834-6.334-6.332l0,0c0-3.498,2.836-6.333,6.334-6.333h106.333C134.38,95.711,137.215,98.547,137.215,102.045L137.215,102.045z M77.715,161.545c-3.498,0-6.333-2.836-6.333-6.334V48.878c0-3.498,2.836-6.333,6.333-6.333l0,0c3.498,0,6.334,2.835,6.334,6.333v106.333C84.049,158.709,81.213,161.545,77.715,161.545L77.715,161.545z M190.465,63.32c0-2.919-1.015-5.396-3.059-7.428c-2.029-2.031-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.016-7.388,3.047c-2.029,2.032-3.056,4.498-3.056,7.386c0,2.889,1.026,5.354,3.056,7.385c2.032,2.032,4.499,3.059,7.388,3.059c2.887,0,5.354-1.026,7.383-3.059C189.45,68.632,190.465,66.177,190.465,63.32L190.465,63.32z M190.465,101.993c0-2.858-1.015-5.313-3.059-7.333c-2.029-2.042-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.005-7.388,3.047c-2.029,2.021-3.056,4.486-3.056,7.376c0,2.888,1.026,5.353,3.056,7.396c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,107.389,190.465,104.914,190.465,101.993L190.465,101.993z M190.465,140.76c0-2.918-1.015-5.395-3.059-7.438c-2.029-2.041-4.496-3.047-7.383-3.047c-2.889,0-5.355,1.006-7.388,3.047c-2.029,2.043-3.056,4.52-3.056,7.438c0,2.922,1.026,5.398,3.056,7.439c2.032,2.021,4.499,3.047,7.388,3.047c2.887,0,5.354-1.025,7.383-3.047C189.45,146.158,190.465,143.682,190.465,140.76L190.465,140.76z"/></g></svg>',more_horizontal:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.76 3.58"><g><path d="M4.64,10.73a1.84,1.84,0,0,1,.65-.65,1.76,1.76,0,0,1,1.79,0A1.79,1.79,0,0,1,8,11.63a1.84,1.84,0,0,1-.25.9,1.69,1.69,0,0,1-.65.65,1.8,1.8,0,0,1-2.69-1.55A2.08,2.08,0,0,1,4.64,10.73Zm6.09,0a1.84,1.84,0,0,1,.65-.65,1.78,1.78,0,0,1,2.67,1.55,1.73,1.73,0,0,1-.24.9,1.84,1.84,0,0,1-.65.65,1.76,1.76,0,0,1-1.79,0,1.79,1.79,0,0,1-.64-2.44Zm6.08,0a1.69,1.69,0,0,1,.65-.65,1.76,1.76,0,0,1,1.79,0,1.79,1.79,0,0,1,.9,1.54,1.73,1.73,0,0,1-.24.9,1.84,1.84,0,0,1-.65.65,1.8,1.8,0,0,1-2.69-1.55A2,2,0,0,1,16.81,10.73Z" transform="translate(-4.39 -9.84)"/></g></svg>',more_vertical:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3.94 15.75"><g><path d="M12.28,7.69a1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39,1.92,1.92,0,0,1,.58-1.39,2,2,0,0,1,1.39-.58,1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39,1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58Zm0,2a1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39A1.92,1.92,0,0,1,13.67,13a2,2,0,0,1-1.39.58A1.92,1.92,0,0,1,10.89,13a2,2,0,0,1-.58-1.39,2,2,0,0,1,2-2Zm0,5.9a1.92,1.92,0,0,1,1.39.58,2,2,0,0,1,.58,1.39,1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58,1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39,1.92,1.92,0,0,1,.58-1.39,1.94,1.94,0,0,1,1.39-.58Z" transform="translate(-10.31 -3.75)"/></g></svg>',attachment:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8.38 15.68"><g><path d="M15.23,6h1v9.78a3.88,3.88,0,0,1-1.31,2.45,4,4,0,0,1-6.57-2.45V7A3,3,0,0,1,9.2,4.89a3,3,0,0,1,5,2.09v8.31a1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58,1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39V8h1v7.32a1,1,0,0,0,.29.69,1,1,0,0,0,.69.28A.9.9,0,0,0,13,16a1,1,0,0,0,.29-.69V7a1.92,1.92,0,0,0-.58-1.39A2,2,0,0,0,11.27,5a1.92,1.92,0,0,0-1.39.58A2,2,0,0,0,9.33,7v8.31a3,3,0,1,0,5.9,0V6Z" transform="translate(-8.08 -3.78)"/></g></svg>',map:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.7 15.62"><g><path d="M12.05,12.42a2.93,2.93,0,1,1,2.07-5A2.88,2.88,0,0,1,15,9.49a3,3,0,0,1-.86,2.07,2.89,2.89,0,0,1-2.07.86Zm0-5.36a2.43,2.43,0,0,0-1.72,4.16,2.48,2.48,0,0,0,1.72.72,2.44,2.44,0,0,0,0-4.88Zm0-3.3A5.84,5.84,0,0,1,17.9,9.62a9.94,9.94,0,0,1-1.73,5A33.59,33.59,0,0,1,12.84,19a1.52,1.52,0,0,1-.23.2,1,1,0,0,1-.55.2h0a1,1,0,0,1-.55-.2,1.52,1.52,0,0,1-.23-.2,33.59,33.59,0,0,1-3.33-4.32,9.93,9.93,0,0,1-1.72-5,5.84,5.84,0,0,1,5.85-5.86ZM12,18.34l.08.05.06-.06a35.58,35.58,0,0,0,3.06-3.93,9.35,9.35,0,0,0,1.74-4.77,4.88,4.88,0,0,0-4.88-4.88A4.79,4.79,0,0,0,8.6,6.17,4.84,4.84,0,0,0,7.17,9.62,9.29,9.29,0,0,0,8.91,14.4,36,36,0,0,0,12,18.34Z" transform="translate(-6.2 -3.76)"/></g></svg>',magic_stick:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.73 15.75"><g><path d="M19.86,19.21a1,1,0,0,0,.28-.68,1,1,0,0,0-.28-.7L13,10.93a1,1,0,0,0-.7-.28,1,1,0,0,0-.68,1.65l6.9,6.9a1,1,0,0,0,.69.29.93.93,0,0,0,.69-.28ZM9.19,8.55a3,3,0,0,0,1.68,0,14.12,14.12,0,0,0,1.41-.32A11.26,11.26,0,0,0,10.8,7.06c-.56-.36-.86-.56-.91-.58S10,5.91,10,5.11s0-1.26-.15-1.37a4.35,4.35,0,0,0-1.19.71c-.53.4-.81.62-.87.68a9,9,0,0,0-2-.6,6.84,6.84,0,0,0-.76-.09s0,.27.08.77a8.6,8.6,0,0,0,.61,2q-.09.09-.69.87a3.59,3.59,0,0,0-.68,1.17c.12.17.57.23,1.36.15S7,9.26,7.15,9.23s.21.36.57.91a10.49,10.49,0,0,0,1.14,1.48c0-.1.14-.57.31-1.4a3,3,0,0,0,0-1.67Z" transform="translate(-4.41 -3.74)"/></g></svg>',empty_file:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.78 15.75"><g><path d="M14.73,3.76,18.67,7.7v9.84a2,2,0,0,1-2,2H7.84a1.89,1.89,0,0,1-1.38-.58,2,2,0,0,1-.57-1.39V5.73a1.93,1.93,0,0,1,.57-1.38,2,2,0,0,1,1.38-.58h6.62l.26,0v0Zm2.95,4.92h-2a1.93,1.93,0,0,1-1.38-.57,2,2,0,0,1-.58-1.4V6.17c0-.36,0-.84,0-1.43H7.85a1,1,0,0,0-.7.29,1,1,0,0,0-.29.7V17.54a1,1,0,0,0,.29.69,1,1,0,0,0,.69.29h8.85a1,1,0,0,0,.71-.29.92.92,0,0,0,.28-.69Zm0-1L14.73,4.74v2A1,1,0,0,0,15,7.4a1,1,0,0,0,.69.29Z" transform="translate(-5.89 -3.76)"/></g></svg>'},E=n("P6u4"),S=n.n(E);const N={_d:null,_w:null,isIE:null,isIE_Edge:null,isOSX_IOS:null,_propertiesInit:function(){this._d||(this._d=document,this._w=window,this.isIE=navigator.userAgent.indexOf("Trident")>-1,this.isIE_Edge=navigator.userAgent.indexOf("Trident")>-1||navigator.appVersion.indexOf("Edge")>-1,this.isOSX_IOS=/(Mac|iPhone|iPod|iPad)/.test(navigator.platform))},_HTMLConvertor:function(e){const t={"&":"&amp;"," ":"&nbsp;","'":"&apos;",'"':"&quot;","<":"&lt;",">":"&gt;"};return e.replace(/&|\u00A0|'|"|<|>/g,(function(e){return"string"==typeof t[e]?t[e]:e}))},zeroWidthSpace:String.fromCharCode(8203),zeroWidthRegExp:new RegExp(String.fromCharCode(8203),"g"),onlyZeroWidthRegExp:new RegExp("^"+String.fromCharCode(8203)+"+$"),onlyZeroWidthSpace:function(e){return"string"!=typeof e&&(e=e.textContent),""===e||this.onlyZeroWidthRegExp.test(e)},getXMLHttpRequest:function(){if(!this._w.ActiveXObject)return this._w.XMLHttpRequest?new XMLHttpRequest:null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){return null}}},createElement:function(e){return this._d.createElement(e)},createTextNode:function(e){return this._d.createTextNode(e||"")},HTMLEncoder:function(e){const t={"<":"$lt;",">":"$gt;"};return e.replace(/<|>/g,(function(e){return"string"==typeof t[e]?t[e]:e}))},HTMLDecoder:function(e){const t={"$lt;":"<","$gt;":">"};return e.replace(/\$lt;|\$gt;/g,(function(e){return"string"==typeof t[e]?t[e]:e}))},hasOwn:function(e,t){return this._hasOwn.call(e,t)},_hasOwn:Object.prototype.hasOwnProperty,getIncludePath:function(e,t){let n="";const i=[],l="js"===t?"script":"link",o="js"===t?"src":"href";let s="(?:";for(let t=0,n=e.length;t<n;t++)s+=e[t]+(t<n-1?"|":")");const a=new this._w.RegExp("(^|.*[\\/])"+s+"(\\.[^\\/]+)?."+t+"(?:\\?.*|;.*)?$","i"),r=new this._w.RegExp(".+\\."+t+"(?:\\?.*|;.*)?$","i");for(let e=this._d.getElementsByTagName(l),t=0;t<e.length;t++)r.test(e[t][o])&&i.push(e[t]);for(let e=0;e<i.length;e++){let t=i[e][o].match(a);if(t){n=t[0];break}}if(""===n&&(n=i.length>0?i[0][o]:""),-1===n.indexOf(":/")&&"//"!==n.slice(0,2)&&(n=0===n.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+n:location.href.match(/^[^\?]*\/(?:)/)[0]+n),!n)throw"[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +"+name+", extension: "+t+")";return n},getPageStyle:function(e){let t="";const n=(e||this._d).styleSheets;for(let e,i=0,l=n.length;i<l;i++){try{e=n[i].cssRules}catch(e){continue}for(let n=0,i=e.length;n<i;n++)t+=e[n].cssText}return t},getIframeDocument:function(e){let t=e.contentWindow||e.contentDocument;return t.document&&(t=t.document),t},getAttributesToString:function(e,t){if(!e.attributes)return"";const n=e.attributes;let i="";for(let e=0,l=n.length;e<l;e++)t&&t.indexOf(n[e].name)>-1||(i+=n[e].name+'="'+n[e].value+'" ');return i},getByteLength:function(e){const t=this._w.encodeURIComponent;let n,i;return this.isIE_Edge?(i=this._w.unescape(t(e.toString())).length,n=0,null!==t(e.toString()).match(/(%0A|%0D)/gi)&&(n=t(e.toString()).match(/(%0A|%0D)/gi).length),i+n):(i=new this._w.TextEncoder("utf-8").encode(e.toString()).length,n=0,null!==t(e.toString()).match(/(%0A|%0D)/gi)&&(n=t(e.toString()).match(/(%0A|%0D)/gi).length),i+n)},isWysiwygDiv:function(e){return e&&1===e.nodeType&&(this.hasClass(e,"se-wrapper-wysiwyg")||/^BODY$/i.test(e.nodeName))},isNonEditable:function(e){return e&&1===e.nodeType&&"false"===e.getAttribute("contenteditable")},isTextStyleElement:function(e){return e&&3!==e.nodeType&&/^(strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)$/i.test(e.nodeName)},isFormatElement:function(e){return e&&1===e.nodeType&&(/^(P|DIV|H[1-6]|PRE|LI|TH|TD)$/i.test(e.nodeName)||this.hasClass(e,"(\\s|^)__se__format__replace_.+(\\s|$)|(\\s|^)__se__format__free_.+(\\s|$)"))&&!this.isComponent(e)&&!this.isWysiwygDiv(e)},isRangeFormatElement:function(e){return e&&1===e.nodeType&&(/^(BLOCKQUOTE|OL|UL|FIGCAPTION|TABLE|THEAD|TBODY|TR|TH|TD)$/i.test(e.nodeName)||this.hasClass(e,"(\\s|^)__se__format__range_.+(\\s|$)"))},isClosureRangeFormatElement:function(e){return e&&1===e.nodeType&&(/^(TH|TD)$/i.test(e.nodeName)||this.hasClass(e,"(\\s|^)__se__format__range__closure_.+(\\s|$)"))},isFreeFormatElement:function(e){return e&&1===e.nodeType&&(/^PRE$/i.test(e.nodeName)||this.hasClass(e,"(\\s|^)__se__format__free_.+(\\s|$)"))&&!this.isComponent(e)&&!this.isWysiwygDiv(e)},isClosureFreeFormatElement:function(e){return e&&1===e.nodeType&&this.hasClass(e,"(\\s|^)__se__format__free__closure_.+(\\s|$)")},isComponent:function(e){return e&&(/se-component/.test(e.className)||/^(TABLE|HR)$/.test(e.nodeName))},isUneditableComponent:function(e){return e&&this.hasClass(e,"__se__uneditable")},isMediaComponent:function(e){return e&&/se-component/.test(e.className)},isNotCheckingNode:function(e){return e&&/katex|__se__tag/.test(e.className)},getFormatElement:function(e,t){if(!e)return null;for(t||(t=function(){return!0});e;){if(this.isWysiwygDiv(e))return null;if(this.isRangeFormatElement(e)&&e.firstElementChild,this.isFormatElement(e)&&t(e))return e;e=e.parentNode}return null},getRangeFormatElement:function(e,t){if(!e)return null;for(t||(t=function(){return!0});e;){if(this.isWysiwygDiv(e))return null;if(this.isRangeFormatElement(e)&&!/^(THEAD|TBODY|TR)$/i.test(e.nodeName)&&t(e))return e;e=e.parentNode}return null},getFreeFormatElement:function(e,t){if(!e)return null;for(t||(t=function(){return!0});e;){if(this.isWysiwygDiv(e))return null;if(this.isFreeFormatElement(e)&&t(e))return e;e=e.parentNode}return null},getClosureFreeFormatElement:function(e,t){if(!e)return null;for(t||(t=function(){return!0});e;){if(this.isWysiwygDiv(e))return null;if(this.isClosureFreeFormatElement(e)&&t(e))return e;e=e.parentNode}return null},copyTagAttributes:function(e,t){t.style.cssText&&(e.style.cssText+=t.style.cssText);const n=t.classList;for(let t=0,i=n.length;t<i;t++)this.addClass(e,n[t]);e.style.cssText||e.removeAttribute("style"),e.className.trim()||e.removeAttribute("class")},copyFormatAttributes:function(e,t){(t=t.cloneNode(!1)).className=t.className.replace(/(\s|^)__se__format__[^\s]+/g,""),this.copyTagAttributes(e,t)},getArrayItem:function(e,t,n){if(!e||0===e.length)return null;t=t||function(){return!0};const i=[];for(let l,o=0,s=e.length;o<s;o++)if(l=e[o],t(l)){if(!n)return l;i.push(l)}return n?i:null},getArrayIndex:function(e,t){let n=-1;for(let i=0,l=e.length;i<l;i++)if(e[i]===t){n=i;break}return n},nextIdx:function(e,t){let n=this.getArrayIndex(e,t);return-1===n?-1:n+1},prevIdx:function(e,t){let n=this.getArrayIndex(e,t);return-1===n?-1:n-1},getPositionIndex:function(e){let t=0;for(;e=e.previousSibling;)t+=1;return t},getNodePath:function(e,t,n){const i=[];let l=!0;return this.getParentElement(e,function(e){if(e===t&&(l=!1),l&&!this.isWysiwygDiv(e)){if(n&&3===e.nodeType){let t=null,i=null;n.s=n.e=0;let l=e.previousSibling;for(;l&&3===l.nodeType;)i=l.textContent.replace(this.zeroWidthRegExp,""),n.s+=i.length,e.textContent=i+e.textContent,t=l,l=l.previousSibling,this.removeItem(t);let o=e.nextSibling;for(;o&&3===o.nodeType;)i=o.textContent.replace(this.zeroWidthRegExp,""),n.e+=i.length,e.textContent+=i,t=o,o=o.nextSibling,this.removeItem(t)}i.push(e)}return!1}.bind(this)),i.map(this.getPositionIndex).reverse()},getNodeFromPath:function(e,t){let n,i=t;for(let t=0,l=e.length;t<l&&(n=i.childNodes,0!==n.length);t++)i=n.length<=e[t]?n[n.length-1]:n[e[t]];return i},isSameAttributes:function(e,t){if(3===e.nodeType&&3===t.nodeType)return!0;if(3===e.nodeType||3===t.nodeType)return!1;const n=e.style,i=t.style;let l=0;for(let e=0,t=n.length;e<t;e++)n[n[e]]===i[n[e]]&&l++;const o=e.classList,s=t.classList,a=this._w.RegExp;let r=0;for(let e=0,t=o.length;e<t;e++)a("(s|^)"+o[e]+"(s|$)").test(s.value)&&r++;return l===i.length&&l===n.length&&r===s.length&&r===o.length},isList:function(e){return e&&/^(OL|UL)$/i.test("string"==typeof e?e:e.nodeName)},isListCell:function(e){return e&&/^LI$/i.test("string"==typeof e?e:e.nodeName)},isTable:function(e){return e&&/^(TABLE|THEAD|TBODY|TR|TH|TD)$/i.test("string"==typeof e?e:e.nodeName)},isCell:function(e){return e&&/^(TD|TH)$/i.test("string"==typeof e?e:e.nodeName)},isBreak:function(e){return e&&/^BR$/i.test("string"==typeof e?e:e.nodeName)},isAnchor:function(e){return e&&/^A$/i.test("string"==typeof e?e:e.nodeName)},isMedia:function(e){return e&&/^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test("string"==typeof e?e:e.nodeName)},isNumber:function(e){return!!e&&/^-?\d+(\.\d+)?$/.test(e+"")},getNumber:function(e,t){if(!e)return 0;let n=(e+"").match(/-?\d+(\.\d+)?/);return n&&n[0]?(n=n[0],t<0?1*n:0===t?this._w.Math.round(1*n):1*(1*n).toFixed(t)):0},getListChildren:function(e,t){const n=[];return e&&e.children&&0!==e.children.length?(t=t||function(){return!0},function i(l){e!==l&&t(l)&&n.push(l);for(let e=0,t=l.children.length;e<t;e++)i(l.children[e])}(e),n):n},getListChildNodes:function(e,t){const n=[];return e&&0!==e.childNodes.length?(t=t||function(){return!0},function i(l){e!==l&&t(l)&&n.push(l);for(let e=0,t=l.childNodes.length;e<t;e++)i(l.childNodes[e])}(e),n):n},getElementDepth:function(e){if(!e||this.isWysiwygDiv(e))return-1;let t=0;for(e=e.parentNode;e&&!this.isWysiwygDiv(e);)t+=1,e=e.parentNode;return t},compareElements:function(e,t){let n=e,i=t;for(;n&&i&&n.parentNode!==i.parentNode;)n=n.parentNode,i=i.parentNode;if(!n||!i)return{ancestor:null,a:e,b:t,result:0};const l=n.parentNode.childNodes,o=this.getArrayIndex(l,n),s=this.getArrayIndex(l,i);return{ancestor:n.parentNode,a:n,b:i,result:o>s?1:o<s?-1:0}},getParentElement:function(e,t){let n;if("function"==typeof t)n=t;else{let e;/^\./.test(t)?(e="className",t=t.split(".")[1]):/^#/.test(t)?(e="id",t="^"+t.split("#")[1]+"$"):/^:/.test(t)?(e="name",t="^"+t.split(":")[1]+"$"):(e="nodeName",t="^"+t+"$");const i=new this._w.RegExp(t,"i");n=function(t){return i.test(t[e])}}for(;e&&!n(e);){if(this.isWysiwygDiv(e))return null;e=e.parentNode}return e},getChildElement:function(e,t,n){let i;if("function"==typeof t)i=t;else{let e;/^\./.test(t)?(e="className",t=t.split(".")[1]):/^#/.test(t)?(e="id",t="^"+t.split("#")[1]+"$"):/^:/.test(t)?(e="name",t="^"+t.split(":")[1]+"$"):(e="nodeName",t="^"+("text"===t?"#"+t:t)+"$");const n=new this._w.RegExp(t,"i");i=function(t){return n.test(t[e])}}const l=this.getListChildNodes(e,(function(e){return i(e)}));return l[n?l.length-1:0]},getEdgeChildNodes:function(e,t){if(e){for(t||(t=e);e&&1===e.nodeType&&e.childNodes.length>0&&!this.isBreak(e);)e=e.firstChild;for(;t&&1===t.nodeType&&t.childNodes.length>0&&!this.isBreak(t);)t=t.lastChild;return{sc:e,ec:t||e}}},getOffset:function(e,t){let n=0,i=0,l=3===e.nodeType?e.parentElement:e;const o=this.getParentElement(e,this.isWysiwygDiv.bind(this));for(;l&&!this.hasClass(l,"se-container")&&l!==o;)n+=l.offsetLeft,i+=l.offsetTop,l=l.offsetParent;const s=t&&/iframe/i.test(t.nodeName);return{left:n+(s?t.parentElement.offsetLeft:0),top:i-(o?o.scrollTop:0)+(s?t.parentElement.offsetTop:0)}},getOverlapRangeAtIndex:function(e,t,n,i){if(e<=i?t<n:t>n)return 0;const l=(e>n?e:n)-(t<i?t:i);return(l<0?-1*l:l)+1},changeTxt:function(e,t){e&&t&&(e.textContent=t)},changeElement:function(e,t){if("string"==typeof t)if(e.outerHTML)e.outerHTML=t;else{const n=this.createElement("DIV");n.innerHTML=t,t=n.firstChild,e.parentNode.replaceChild(t,e)}else 1===t.nodeType&&e.parentNode.replaceChild(t,e)},setStyle:function(e,t,n){e.style[t]=n,n||e.style.cssText||e.removeAttribute("style")},hasClass:function(e,t){if(e)return new this._w.RegExp(t).test(e.className)},addClass:function(e,t){if(!e)return;new this._w.RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className)||(e.className+=(e.className.length>0?" ":"")+t)},removeClass:function(e,t){if(!e)return;const n=new this._w.RegExp("(\\s|^)"+t+"(\\s|$)");e.className=e.className.replace(n," ").trim(),e.className.trim()||e.removeAttribute("class")},toggleClass:function(e,t){if(!e)return;const n=new this._w.RegExp("(\\s|^)"+t+"(\\s|$)");n.test(e.className)?e.className=e.className.replace(n," ").trim():e.className+=" "+t,e.className.trim()||e.removeAttribute("class")},setDisabledButtons:function(e,t){for(let n=0,i=t.length;n<i;n++)t[n].disabled=e},removeItem:function(e){if(e)try{e.remove()}catch(t){e.parentNode&&e.parentNode.removeChild(e)}},removeItemAllParents:function(e,t,n){if(!e)return null;let i=null;return t||(t=function(e){if(e===n||this.isComponent(e))return!1;const t=e.textContent.trim();return 0===t.length||/^(\n|\u200B)+$/.test(t)}.bind(this)),function e(n){if(!N.isWysiwygDiv(n)){const l=n.parentNode;l&&t(n)&&(i={sc:n.previousElementSibling,ec:n.nextElementSibling},N.removeItem(n),e(l))}}(e),i},detachNestedList:function(e,t){const n=this._deleteNestedList(e);let i,l,o;if(n){i=n.cloneNode(!1),l=n.childNodes;const t=this.getPositionIndex(e);for(;l[t];)i.appendChild(l[t])}else i=e;if(t)o=this.getListChildren(i,function(e){return this.isListCell(e)&&!e.previousElementSibling}.bind(this));else{const t=this.getElementDepth(e)+2;o=this.getListChildren(e,function(e){return this.isListCell(e)&&!e.previousElementSibling&&this.getElementDepth(e)===t}.bind(this))}for(let e=0,t=o.length;e<t;e++)this._deleteNestedList(o[e]);return n&&(n.parentNode.insertBefore(i,n.nextSibling),l&&0===l.length&&this.removeItem(n)),i===e?i.parentNode:i},_deleteNestedList:function(e){const t=e.parentNode;let n,i,l,o,s,a=t,r=a.parentNode;for(;this.isListCell(r);){for(o=this.getPositionIndex(e),n=r.nextElementSibling,i=r.parentNode,l=a;l;){if(a=a.nextSibling,this.isList(l)){for(s=l.childNodes;s[o];)i.insertBefore(s[o],n);0===s.length&&this.removeItem(l)}else i.appendChild(l);l=a}a=i,r=i.parentNode}return 0===t.children.length&&this.removeItem(t),i},splitElement:function(e,t,n){const i=e.parentNode;let l,o,s,a=0,r=!0;if((!n||n<0)&&(n=0),3===e.nodeType){if(a=this.getPositionIndex(e),t>=0){e.splitText(t);const n=this.getNodeFromPath([a+1],i);this.onlyZeroWidthSpace(n)&&(n.data=this.zeroWidthSpace)}}else 1===e.nodeType&&(e.previousSibling?e=e.previousSibling:this.getElementDepth(e)===n&&(r=!1));let c=e;for(;this.getElementDepth(c)>n;)for(a=this.getPositionIndex(c)+1,c=c.parentNode,s=l,l=c.cloneNode(!1),o=c.childNodes,s&&(this.isListCell(l)&&this.isList(s)&&s.firstElementChild?(l.innerHTML=s.firstElementChild.innerHTML,N.removeItem(s.firstElementChild),s.children.length>0&&l.appendChild(s)):l.appendChild(s));o[a];)l.appendChild(o[a]);c.childNodes.length<=1&&(!c.firstChild||0===c.firstChild.textContent.length)&&(c.innerHTML="<br>");const d=c.parentNode;return r&&(c=c.nextSibling),l?(this.mergeSameTags(l,null,!1),this.mergeNestedTags(l,function(e){return this.isList(e)}.bind(this)),l.childNodes.length>0?d.insertBefore(l,c):l=c,0===i.childNodes.length&&this.removeItem(i),l):c},mergeSameTags:function(e,t,n){const i=this,l=t?t.length:0;let o=null;return l&&(o=this._w.Array.apply(null,new this._w.Array(l)).map(this._w.Number.prototype.valueOf,0)),function e(s,a,r){const c=s.childNodes;for(let d,u,h=0,g=c.length;h<g&&(d=c[h],u=c[h+1],d);h++)if(n&&i._isIgnoreNodeChange(d)||!n&&(i.isTable(d)||i.isListCell(d)||i.isFormatElement(d)&&!i.isFreeFormatElement(d)))(i.isTable(d)||i.isListCell(d))&&e(d,a+1,h);else{if(1===g&&s.nodeName===d.nodeName&&s.parentNode){if(l){let e,n,o,r,c;for(let u=0;u<l;u++)if(e=t[u],e&&e[a]===h){for(n=d,o=s,r=a,c=!0;r>=0;){if(i.getArrayIndex(o.childNodes,n)!==e[r]){c=!1;break}n=d.parentNode,o=n.parentNode,r--}c&&(e.splice(a,1),e[a]=h)}}i.copyTagAttributes(d,s),s.parentNode.insertBefore(d,s),i.removeItem(s)}if(!u){1===d.nodeType&&e(d,a+1,h);break}if(d.nodeName===u.nodeName&&i.isSameAttributes(d,u)&&d.href===u.href){const e=d.childNodes;let n=0;for(let t=0,i=e.length;t<i;t++)e[t].textContent.length>0&&n++;const s=d.lastChild,c=u.firstChild;let g=0;if(s&&c){const e=3===s.nodeType&&3===c.nodeType;g=s.textContent.length;let i=s.previousSibling;for(;i&&3===i.nodeType;)g+=i.textContent.length,i=i.previousSibling;if(n>0&&3===s.nodeType&&3===c.nodeType&&(s.textContent.length>0||c.textContent.length>0)&&n--,l){let i=null;for(let d=0;d<l;d++)if(i=t[d],i&&i[a]>h){if(a>0&&i[a-1]!==r)continue;i[a]-=1,i[a+1]>=0&&i[a]===h&&(i[a+1]+=n,e&&s&&3===s.nodeType&&c&&3===c.nodeType&&(o[d]+=g))}}}if(3===d.nodeType){if(g=d.textContent.length,d.textContent+=u.textContent,l){let e=null;for(let i=0;i<l;i++)if(e=t[i],e&&e[a]>h){if(a>0&&e[a-1]!==r)continue;e[a]-=1,e[a+1]>=0&&e[a]===h&&(e[a+1]+=n,o[i]+=g)}}}else d.innerHTML+=u.innerHTML;i.removeItem(u),h--}else 1===d.nodeType&&e(d,a+1,h)}}(e,0,0),o},mergeNestedTags:function(e,t){"string"==typeof t?t=function(e){return this.test(e.tagName)}.bind(new this._w.RegExp("^("+(t||".+")+")$","i")):"function"!=typeof t&&(t=function(){return!0}),function e(n){let i=n.children;if(1===i.length&&i[0].nodeName===n.nodeName&&t(n)){const e=i[0];for(i=e.children;i[0];)n.appendChild(i[0]);n.removeChild(e)}for(let t=0,i=n.children.length;t<i;t++)e(n.children[t])}(e)},removeEmptyNode:function(e,t){const n=this;t&&(t=n.getParentElement(t,(function(t){return e===t.parentElement}))),function i(l){if(n._notTextNode(l)||l===t||n.isNonEditable(l))return 0;if(l===e||!n.onlyZeroWidthSpace(l.textContent)||l.firstChild&&n.isBreak(l.firstChild)){const e=l.children;for(let t=0,l=e.length,o=0;t<l;t++)e[t+o]&&!n.isComponent(e[t+o])&&(o+=i(e[t+o]))}else if(l.parentNode)return l.parentNode.removeChild(l),-1;return 0}(e),0===e.childNodes.length&&(e.innerHTML="<br>")},htmlRemoveWhiteSpace:function(e){return e?e.trim().replace(/<\/?(?!strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)[^>^<]+>\s+(?=<)/gi,(function(e){return e.trim()})):""},sortByDepth:function(e,t){const n=t?1:-1,i=-1*n;e.sort(function(e,t){return this.isListCell(e)&&this.isListCell(t)?(e=this.getElementDepth(e))>(t=this.getElementDepth(t))?n:e<t?i:0:0}.bind(this))},_isIgnoreNodeChange:function(e){return e&&3!==e.nodeType&&(this.isNonEditable(e)||!this.isTextStyleElement(e))},_isMaintainedNode:function(e){return e&&3!==e.nodeType&&/^(a|label|code)$/i.test("string"==typeof e?e:e.nodeName)},_isSizeNode:function(e){return e&&3!==e.nodeType&&this.isTextStyleElement(e)&&!!e.style.fontSize},_notTextNode:function(e){return e&&3!==e.nodeType&&(this.isComponent(e)||/^(br|input|select|canvas|img|iframe|audio|video)$/i.test("string"==typeof e?e:e.nodeName))},_disallowedTags:function(e){return/^(meta|script|link|style|[a-z]+\:[a-z]+)$/i.test(e.nodeName)},createTagsWhitelist:function(e){return new RegExp("<\\/?\\b(?!\\b"+e.replace(/\|/g,"\\b|\\b")+"\\b)[^>]*>","gi")},_getCheckFormat:function(e){return 3===e.nodeType?"null":this.isComponent(e)?"component":this.isClosureFreeFormatElement(e)?"closureFreeFormat":this.isFreeFormatElement(e)?"freeFormat":this.isClosureRangeFormatElement(e)?"closureRangeFormat":this.isRangeFormatElement(e)?"rangeFormat":this.isFormatElement(e)?"format":e.nodeName.toLowerCase()},_consistencyCheckOfHTML:function(e,t,n){const i=[],l=[],o=[],s=[],a=this.getListChildNodes(e,function(n){if(1!==n.nodeType)return!1;if(!t.test(n.nodeName)&&0===n.childNodes.length&&this.isNotCheckingNode(n))return i.push(n),!1;const a=!this.getParentElement(n,this.isNotCheckingNode);if(!this.isTable(n)&&!this.isListCell(n)&&(this.isFormatElement(n)||this.isRangeFormatElement(n)||this.isTextStyleElement(n))&&0===n.childNodes.length&&a)return l.push(n),!1;if(this.isList(n.parentNode)&&!this.isList(n)&&!this.isListCell(n))return o.push(n),!1;if(this.isCell(n)){const e=n.firstElementChild;if(!this.isFormatElement(e)&&!this.isRangeFormatElement(e)&&!this.isComponent(e))return s.push(n),!1}return n.parentNode!==e&&(this.isFormatElement(n)||this.isComponent(n)||this.isList(n))&&!this.isRangeFormatElement(n.parentNode)&&!this.isListCell(n.parentNode)&&!this.getParentElement(n,this.isComponent)&&a}.bind(this));for(let e=0,t=i.length;e<t;e++)this.removeItem(i[e]);const r=[];for(let e,t,n=0,i=a.length;n<i;n++)e=a[n],t=e.parentNode,t&&t.parentNode&&(t.parentNode.insertBefore(e,t),r.push(t));for(let e,t=0,n=r.length;t<n;t++)e=r[t],this.onlyZeroWidthSpace(e.textContent.trim())&&this.removeItem(e);for(let e=0,t=l.length;e<t;e++)this.removeItem(l[e]);for(let e,t,n,i,l=0,s=o.length;l<s;l++){for(e=o[l],t=this.createElement("LI"),n=e.childNodes;n[0];)t.appendChild(n[0]);i=e.parentNode,i&&(i.insertBefore(t,e),this.removeItem(e))}for(let e,t,n=0,i=s.length;n<i;n++)e=s[n],t=this.createElement("DIV"),t.innerHTML=0===e.textContent.trim().length&&0===e.children.length?"<br>":e.innerHTML,e.innerHTML=t.outerHTML},_setDefaultOptionStyle:function(e,t){let n="";e.height&&(n+="height:"+e.height+";"),e.minHeight&&(n+="min-height:"+e.minHeight+";"),e.maxHeight&&(n+="max-height:"+e.maxHeight+";"),e.position&&(n+="position:"+e.position+";"),e.width&&(n+="width:"+e.width+";"),e.minWidth&&(n+="min-width:"+e.minWidth+";"),e.maxWidth&&(n+="max-width:"+e.maxWidth+";");let i="",l="",o="";const s=(t=n+t).split(";");for(let t,n=0,a=s.length;n<a;n++)t=s[n].trim(),t&&(/^(min-|max-)?width\s*:/.test(t)?i+=t+";":/^(min-|max-)?height\s*:/.test(t)?(/^height/.test(t)&&"auto"===t.split(":")[1].trim()&&(e.height="auto"),l+=t+";"):o+=t+";");return{top:i,frame:l,editor:o}},_setIframeDocument:function(e,t){e.setAttribute("scrolling","auto"),e.contentDocument.head.innerHTML='<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1">'+this._setIframeCssTags(t),e.contentDocument.body.className=t._editableClass,e.contentDocument.body.setAttribute("contenteditable",!0)},_setIframeCssTags:function(e){const t=e.iframeCSSFileName,n=this._w.RegExp;let i="";for(let e,l=0,o=t.length;l<o;l++){if(e=[],/(^https?:\/\/)|(^data:text\/css,)/.test(t[l]))e.push(t[l]);else{const i=new n("(^|.*[\\/])"+t[l]+"(\\..+)?\\.css(?:\\?.*|;.*)?$","i");for(let t,n=document.getElementsByTagName("link"),l=0,o=n.length;l<o;l++)t=n[l].href.match(i),t&&e.push(t[0])}if(!e||0===e.length)throw'[SUNEDITOR.constructor.iframe.fail] The suneditor CSS files installation path could not be automatically detected. Please set the option property "iframeCSSFileName" before creating editor instances.';for(let t=0,n=e.length;t<n;t++)i+='<link href="'+e[t]+'" rel="stylesheet">'}return i+("auto"===e.height?"<style>\n/** Iframe height auto */\nbody{height: min-content; overflow: hidden;}\n</style>":"")}};var T=N,k={init:function(e,t){"object"!=typeof t&&(t={});const n=document;this._initOptions(e,t);const i=n.createElement("DIV");i.className="sun-editor"+(t.rtl?" se-rtl":""),e.id&&(i.id="suneditor_"+e.id);const l=n.createElement("DIV");l.className="se-container";const o=this._createToolBar(n,t.buttonList,t.plugins,t);o.element.style.visibility="hidden",o.pluginCallButtons.math&&this._checkKatexMath(t.katex);const s=n.createElement("DIV");s.className="se-arrow";const a=n.createElement("DIV");a.className="se-toolbar-sticky-dummy";const r=n.createElement("DIV");r.className="se-wrapper";const c=this._initElements(t,i,o.element,s),d=c.bottomBar,u=c.wysiwygFrame,h=c.placeholder;let g=c.codeView;const p=d.resizingBar,m=d.navigation,f=d.charWrapper,_=d.charCounter,b=n.createElement("DIV");b.className="se-loading-box sun-editor-common",b.innerHTML='<div class="se-loading-effect"></div>';const v=n.createElement("DIV");v.className="se-line-breaker",v.innerHTML='<button class="se-btn">'+t.icons.line_break+"</button>";const y=n.createElement("DIV");y.className+="se-line-breaker-component";const C=y.cloneNode(!0);y.innerHTML=C.innerHTML=t.icons.line_break;const w=n.createElement("DIV");w.className="se-resizing-back";const x=t.toolbarContainer;return x&&x.appendChild(o.element),r.appendChild(g),h&&r.appendChild(h),x||l.appendChild(o.element),l.appendChild(a),l.appendChild(r),l.appendChild(w),l.appendChild(b),l.appendChild(v),l.appendChild(y),l.appendChild(C),p&&l.appendChild(p),i.appendChild(l),g=this._checkCodeMirror(t,g),{constructed:{_top:i,_relative:l,_toolBar:o.element,_menuTray:o._menuTray,_editorArea:r,_wysiwygArea:u,_codeArea:g,_placeholder:h,_resizingBar:p,_navigation:m,_charWrapper:f,_charCounter:_,_loading:b,_lineBreaker:v,_lineBreaker_t:y,_lineBreaker_b:C,_resizeBack:w,_stickyDummy:a,_arrow:s},options:t,plugins:o.plugins,pluginCallButtons:o.pluginCallButtons,_responsiveButtons:o.responsiveButtons}},_checkCodeMirror:function(e,t){if(e.codeMirror){const n=[{mode:"htmlmixed",htmlMode:!0,lineNumbers:!0,lineWrapping:!0},e.codeMirror.options||{}].reduce((function(e,t){for(let n in t)T.hasOwn(t,n)&&(e[n]=t[n]);return e}),{});"auto"===e.height&&(n.viewportMargin=1/0,n.height="auto");const i=e.codeMirror.src.fromTextArea(t,n);i.display.wrapper.style.cssText=t.style.cssText,e.codeMirrorEditor=i,(t=i.display.wrapper).className+=" se-wrapper-code-mirror"}return t},_checkKatexMath:function(e){if(!e)throw Error('[SUNEDITOR.create.fail] To use the math button you need to add a "katex" object to the options.');const t=[{throwOnError:!1},e.options||{}].reduce((function(e,t){for(let n in t)T.hasOwn(t,n)&&(e[n]=t[n]);return e}),{});e.options=t},_setOptions:function(e,t,n){this._initOptions(t.element.originElement,e);const i=t.element,l=i.relative,o=i.editorArea,s=e.toolbarContainer&&e.toolbarContainer!==n.toolbarContainer,a=e.buttonList!==n.buttonList||e.mode!==n.mode||s,r=this._createToolBar(document,a?e.buttonList:n.buttonList,e.plugins,e);r.pluginCallButtons.math&&this._checkKatexMath(e.katex);const c=document.createElement("DIV");c.className="se-arrow",a&&(r.element.style.visibility="hidden",s?(e.toolbarContainer.appendChild(r.element),i.toolbar.parentElement.removeChild(i.toolbar)):i.toolbar.parentElement.replaceChild(r.element,i.toolbar),i.toolbar=r.element,i._menuTray=r._menuTray,i._arrow=c);const d=this._initElements(e,i.topArea,a?r.element:i.toolbar,c),u=d.bottomBar,h=d.wysiwygFrame,g=d.placeholder;let p=d.codeView;return i.resizingBar&&l.removeChild(i.resizingBar),u.resizingBar&&l.appendChild(u.resizingBar),o.innerHTML="",o.appendChild(p),g&&o.appendChild(g),p=this._checkCodeMirror(e,p),i.resizingBar=u.resizingBar,i.navigation=u.navigation,i.charWrapper=u.charWrapper,i.charCounter=u.charCounter,i.wysiwygFrame=h,i.code=p,i.placeholder=g,e.rtl?T.addClass(i.topArea,"se-rtl"):T.removeClass(i.topArea,"se-rtl"),{callButtons:r.pluginCallButtons,plugins:r.plugins,toolbar:r}},_initElements:function(e,t,n,i){t.style.cssText=e._editorStyles.top,/inline/i.test(e.mode)?(n.className+=" se-toolbar-inline",n.style.width=e.toolbarWidth):/balloon/i.test(e.mode)&&(n.className+=" se-toolbar-balloon",n.style.width=e.toolbarWidth,n.appendChild(i));const l=document.createElement(e.iframe?"IFRAME":"DIV");l.className="se-wrapper-inner se-wrapper-wysiwyg",e.iframe?(l.allowFullscreen=!0,l.frameBorder=0,l.style.cssText=e._editorStyles.frame):(l.setAttribute("contenteditable",!0),l.setAttribute("scrolling","auto"),l.className+=" "+e._editableClass,l.style.cssText=e._editorStyles.frame+e._editorStyles.editor);const o=document.createElement("TEXTAREA");o.className="se-wrapper-inner se-wrapper-code",o.style.cssText=e._editorStyles.frame,o.style.display="none","auto"===e.height&&(o.style.overflow="hidden");let s=null,a=null,r=null,c=null;if(e.resizingBar&&(s=document.createElement("DIV"),s.className="se-resizing-bar sun-editor-common",a=document.createElement("DIV"),a.className="se-navigation sun-editor-common",s.appendChild(a),e.charCounter)){if(r=document.createElement("DIV"),r.className="se-char-counter-wrapper",e.charCounterLabel){const t=document.createElement("SPAN");t.className="se-char-label",t.textContent=e.charCounterLabel,r.appendChild(t)}if(c=document.createElement("SPAN"),c.className="se-char-counter",c.textContent="0",r.appendChild(c),e.maxCharCount>0){const t=document.createElement("SPAN");t.textContent=" / "+e.maxCharCount,r.appendChild(t)}s.appendChild(r)}let d=null;return e.placeholder&&(d=document.createElement("SPAN"),d.className="se-placeholder",d.innerText=e.placeholder),{bottomBar:{resizingBar:s,navigation:a,charWrapper:r,charCounter:c},wysiwygFrame:l,codeView:o,placeholder:d}},_initOptions:function(e,t){t.lang=t.lang||S.a,t.defaultTag="string"==typeof t.defaultTag?t.defaultTag:"p";const n=t.textTags=[{bold:"STRONG",underline:"U",italic:"EM",strike:"DEL"},t.textTags||{}].reduce((function(e,t){for(let n in t)T.hasOwn(t,n)&&(e[n]=t[n]);return e}),{});t._textTagsMap={strong:n.bold,b:n.bold,u:n.underline,ins:n.underline,em:n.italic,i:n.italic,del:n.strike,strike:n.strike,s:n.strike},t.value="string"==typeof t.value?t.value:null,t.historyStackDelayTime="number"==typeof t.historyStackDelayTime?t.historyStackDelayTime:400,t._defaultTagsWhitelist="string"==typeof t._defaultTagsWhitelist?t._defaultTagsWhitelist:"br|p|div|pre|blockquote|h[1-6]|ol|ul|li|hr|figure|figcaption|img|iframe|audio|video|source|table|thead|tbody|tr|th|td|a|b|strong|var|i|em|u|ins|s|span|strike|del|sub|sup|code",t._editorTagsWhitelist=t._defaultTagsWhitelist+("string"==typeof t.addTagsWhitelist&&t.addTagsWhitelist.length>0?"|"+t.addTagsWhitelist:""),t.pasteTagsWhitelist="string"==typeof t.pasteTagsWhitelist?t.pasteTagsWhitelist:t._editorTagsWhitelist,t.attributesWhitelist=t.attributesWhitelist&&"object"==typeof t.attributesWhitelist?t.attributesWhitelist:null,t.mode=t.mode||"classic",t.rtl=!!t.rtl,t._editableClass="sun-editor-editable"+(t.rtl?" se-rtl":""),t.toolbarWidth=t.toolbarWidth?T.isNumber(t.toolbarWidth)?t.toolbarWidth+"px":t.toolbarWidth:"auto",t.toolbarContainer="string"==typeof t.toolbarContainer?document.querySelector(t.toolbarContainer):t.toolbarContainer,t.stickyToolbar=/balloon/i.test(t.mode)||t.toolbarContainer?-1:void 0===t.stickyToolbar?0:/^\d+/.test(t.stickyToolbar)?T.getNumber(t.stickyToolbar,0):-1,t.fullScreenOffset=void 0===t.fullScreenOffset?0:/^\d+/.test(t.fullScreenOffset)?T.getNumber(t.fullScreenOffset,0):0,t.iframe=t.fullPage||t.iframe,t.fullPage=!!t.fullPage,t.iframeCSSFileName=t.iframe?"string"==typeof t.iframeCSSFileName?[t.iframeCSSFileName]:t.iframeCSSFileName||["suneditor"]:null,t.previewTemplate="string"==typeof t.previewTemplate?t.previewTemplate:null,t.codeMirror=t.codeMirror?t.codeMirror.src?t.codeMirror:{src:t.codeMirror}:null,t.katex=t.katex?t.katex.src?t.katex:{src:t.katex}:null,t.position="string"==typeof t.position?t.position:null,t.display=t.display||("none"!==e.style.display&&e.style.display?e.style.display:"block"),t.popupDisplay=t.popupDisplay||"full",t.resizingBar=void 0===t.resizingBar?!/inline|balloon/i.test(t.mode):t.resizingBar,t.showPathLabel=!!t.resizingBar&&("boolean"!=typeof t.showPathLabel||t.showPathLabel),t.charCounter=t.maxCharCount>0||"boolean"==typeof t.charCounter&&t.charCounter,t.charCounterType="string"==typeof t.charCounterType?t.charCounterType:"char",t.charCounterLabel="string"==typeof t.charCounterLabel?t.charCounterLabel.trim():null,t.maxCharCount=T.isNumber(t.maxCharCount)&&t.maxCharCount>-1?1*t.maxCharCount:null,t.width=t.width?T.isNumber(t.width)?t.width+"px":t.width:e.clientWidth?e.clientWidth+"px":"100%",t.minWidth=(T.isNumber(t.minWidth)?t.minWidth+"px":t.minWidth)||"",t.maxWidth=(T.isNumber(t.maxWidth)?t.maxWidth+"px":t.maxWidth)||"",t.height=t.height?T.isNumber(t.height)?t.height+"px":t.height:e.clientHeight?e.clientHeight+"px":"auto",t.minHeight=(T.isNumber(t.minHeight)?t.minHeight+"px":t.minHeight)||"",t.maxHeight=(T.isNumber(t.maxHeight)?t.maxHeight+"px":t.maxHeight)||"",t.defaultStyle="string"==typeof t.defaultStyle?t.defaultStyle:"",t.font=t.font?t.font:null,t.fontSize=t.fontSize?t.fontSize:null,t.formats=t.formats?t.formats:null,t.colorList=t.colorList?t.colorList:null,t.lineHeights=t.lineHeights?t.lineHeights:null,t.paragraphStyles=t.paragraphStyles?t.paragraphStyles:null,t.textStyles=t.textStyles?t.textStyles:null,t.fontSizeUnit="string"==typeof t.fontSizeUnit&&t.fontSizeUnit.trim()||"px",t.imageResizing=void 0===t.imageResizing||t.imageResizing,t.imageHeightShow=void 0===t.imageHeightShow||!!t.imageHeightShow,t.imageWidth=t.imageWidth?T.isNumber(t.imageWidth)?t.imageWidth+"px":t.imageWidth:"auto",t.imageHeight=t.imageHeight?T.isNumber(t.imageHeight)?t.imageHeight+"px":t.imageHeight:"auto",t.imageSizeOnlyPercentage=!!t.imageSizeOnlyPercentage,t._imageSizeUnit=t.imageSizeOnlyPercentage?"%":"px",t.imageRotation=void 0!==t.imageRotation?t.imageRotation:!(t.imageSizeOnlyPercentage||!t.imageHeightShow),t.imageFileInput=void 0===t.imageFileInput||t.imageFileInput,t.imageUrlInput=void 0===t.imageUrlInput||!t.imageFileInput||t.imageUrlInput,t.imageUploadHeader=t.imageUploadHeader||null,t.imageUploadUrl="string"==typeof t.imageUploadUrl?t.imageUploadUrl:null,t.imageUploadSizeLimit=/\d+/.test(t.imageUploadSizeLimit)?T.getNumber(t.imageUploadSizeLimit,0):null,t.imageMultipleFile=!!t.imageMultipleFile,t.imageAccept="string"!=typeof t.imageAccept||"*"===t.imageAccept.trim()?"image/*":t.imageAccept.trim()||"image/*",t.imageGalleryUrl="string"==typeof t.imageGalleryUrl?t.imageGalleryUrl:null,t.videoResizing=void 0===t.videoResizing||t.videoResizing,t.videoHeightShow=void 0===t.videoHeightShow||!!t.videoHeightShow,t.videoRatioShow=void 0===t.videoRatioShow||!!t.videoRatioShow,t.videoWidth=t.videoWidth&&T.getNumber(t.videoWidth,0)?T.isNumber(t.videoWidth)?t.videoWidth+"px":t.videoWidth:"",t.videoHeight=t.videoHeight&&T.getNumber(t.videoHeight,0)?T.isNumber(t.videoHeight)?t.videoHeight+"px":t.videoHeight:"",t.videoSizeOnlyPercentage=!!t.videoSizeOnlyPercentage,t._videoSizeUnit=t.videoSizeOnlyPercentage?"%":"px",t.videoRotation=void 0!==t.videoRotation?t.videoRotation:!(t.videoSizeOnlyPercentage||!t.videoHeightShow),t.videoRatio=T.getNumber(t.videoRatio,4)||.5625,t.videoRatioList=t.videoRatioList?t.videoRatioList:null,t.youtubeQuery=(t.youtubeQuery||"").replace("?",""),t.videoFileInput=!!t.videoFileInput,t.videoUrlInput=void 0===t.videoUrlInput||!t.videoFileInput||t.videoUrlInput,t.videoUploadHeader=t.videoUploadHeader||null,t.videoUploadUrl="string"==typeof t.videoUploadUrl?t.videoUploadUrl:null,t.videoUploadSizeLimit=/\d+/.test(t.videoUploadSizeLimit)?T.getNumber(t.videoUploadSizeLimit,0):null,t.videoMultipleFile=!!t.videoMultipleFile,t.videoTagAttrs=t.videoTagAttrs||null,t.videoIframeAttrs=t.videoIframeAttrs||null,t.videoAccept="string"!=typeof t.videoAccept||"*"===t.videoAccept.trim()?"video/*":t.videoAccept.trim()||"video/*",t.audioWidth=t.audioWidth?T.isNumber(t.audioWidth)?t.audioWidth+"px":t.audioWidth:"",t.audioHeight=t.audioHeight?T.isNumber(t.audioHeight)?t.audioHeight+"px":t.audioHeight:"",t.audioFileInput=!!t.audioFileInput,t.audioUrlInput=void 0===t.audioUrlInput||!t.audioFileInput||t.audioUrlInput,t.audioUploadHeader=t.audioUploadHeader||null,t.audioUploadUrl="string"==typeof t.audioUploadUrl?t.audioUploadUrl:null,t.audioUploadSizeLimit=/\d+/.test(t.audioUploadSizeLimit)?T.getNumber(t.audioUploadSizeLimit,0):null,t.audioMultipleFile=!!t.audioMultipleFile,t.audioTagAttrs=t.audioTagAttrs||null,t.audioAccept="string"!=typeof t.audioAccept||"*"===t.audioAccept.trim()?"audio/*":t.audioAccept.trim()||"audio/*",t.tableCellControllerPosition="string"==typeof t.tableCellControllerPosition?t.tableCellControllerPosition.toLowerCase():"cell",t.linkProtocol="string"==typeof t.linkProtocol?t.linkProtocol:null,t.linkRel=Array.isArray(t.linkRel)?t.linkRel:[],t.tabDisable=!!t.tabDisable,t.shortcutsDisable=Array.isArray(t.shortcutsDisable)?t.shortcutsDisable:[],t.shortcutsHint=void 0===t.shortcutsHint||!!t.shortcutsHint,t.callBackSave=t.callBackSave?t.callBackSave:null,t.templates=t.templates?t.templates:null,t.placeholder="string"==typeof t.placeholder?t.placeholder:null,t.buttonList=t.buttonList?t.buttonList:[["undo","redo"],["bold","underline","italic","strike","subscript","superscript"],["removeFormat"],["outdent","indent"],["fullScreen","showBlocks","codeView"],["preview","print"]],t.rtl&&(t.buttonList=t.buttonList.reverse()),t.icons=t.icons&&"object"==typeof t.icons?[x,t.icons].reduce((function(e,t){for(let n in t)T.hasOwn(t,n)&&(e[n]=t[n]);return e}),{}):x,t.icons=t.rtl?[t.icons,t.icons.rtl].reduce((function(e,t){for(let n in t)T.hasOwn(t,n)&&(e[n]=t[n]);return e}),{}):t.icons,t._editorStyles=T._setDefaultOptionStyle(t,t.defaultStyle)},_defaultButtons:function(e){const t=e.icons,n=e.lang,i=T.isOSX_IOS?"⌘":"CTRL",l=T.isOSX_IOS?"⇧":"+SHIFT",o=e.shortcutsHint?e.shortcutsDisable:["bold","strike","underline","italic","undo","indent","save"],s=e.rtl?["[","]"]:["]","["];return{bold:["_se_command_bold",n.toolbar.bold+'<span class="se-shortcut">'+(o.indexOf("bold")>-1?"":i+'+<span class="se-shortcut-key">B</span>')+"</span>","bold","",t.bold],underline:["_se_command_underline",n.toolbar.underline+'<span class="se-shortcut">'+(o.indexOf("underline")>-1?"":i+'+<span class="se-shortcut-key">U</span>')+"</span>","underline","",t.underline],italic:["_se_command_italic",n.toolbar.italic+'<span class="se-shortcut">'+(o.indexOf("italic")>-1?"":i+'+<span class="se-shortcut-key">I</span>')+"</span>","italic","",t.italic],strike:["_se_command_strike",n.toolbar.strike+'<span class="se-shortcut">'+(o.indexOf("strike")>-1?"":i+l+'+<span class="se-shortcut-key">S</span>')+"</span>","strike","",t.strike],subscript:["_se_command_subscript",n.toolbar.subscript,"SUB","",t.subscript],superscript:["_se_command_superscript",n.toolbar.superscript,"SUP","",t.superscript],removeFormat:["",n.toolbar.removeFormat,"removeFormat","",t.erase],indent:["_se_command_indent",n.toolbar.indent+'<span class="se-shortcut">'+(o.indexOf("indent")>-1?"":i+'+<span class="se-shortcut-key">'+s[0]+"</span>")+"</span>","indent","",t.outdent],outdent:["_se_command_outdent",n.toolbar.outdent+'<span class="se-shortcut">'+(o.indexOf("indent")>-1?"":i+'+<span class="se-shortcut-key">'+s[1]+"</span>")+"</span>","outdent","",t.indent],fullScreen:["se-code-view-enabled se-resizing-enabled _se_command_fullScreen",n.toolbar.fullScreen,"fullScreen","",t.expansion],showBlocks:["_se_command_showBlocks",n.toolbar.showBlocks,"showBlocks","",t.show_blocks],codeView:["se-code-view-enabled se-resizing-enabled _se_command_codeView",n.toolbar.codeView,"codeView","",t.code_view],undo:["_se_command_undo se-resizing-enabled",n.toolbar.undo+'<span class="se-shortcut">'+(o.indexOf("undo")>-1?"":i+'+<span class="se-shortcut-key">Z</span>')+"</span>","undo","",t.undo],redo:["_se_command_redo se-resizing-enabled",n.toolbar.redo+'<span class="se-shortcut">'+(o.indexOf("undo")>-1?"":i+'+<span class="se-shortcut-key">Y</span> / '+i+l+'+<span class="se-shortcut-key">Z</span>')+"</span>","redo","",t.redo],preview:["se-resizing-enabled",n.toolbar.preview,"preview","",t.preview],print:["se-resizing-enabled",n.toolbar.print,"print","",t.print],save:["_se_command_save se-resizing-enabled",n.toolbar.save+'<span class="se-shortcut">'+(o.indexOf("save")>-1?"":i+'+<span class="se-shortcut-key">S</span>')+"</span>","save","",t.save],blockquote:["",n.toolbar.tag_blockquote,"blockquote","command",t.blockquote],font:["se-btn-select se-btn-tool-font",n.toolbar.font,"font","submenu",'<span class="txt">'+n.toolbar.font+"</span>"+t.arrow_down],formatBlock:["se-btn-select se-btn-tool-format",n.toolbar.formats,"formatBlock","submenu",'<span class="txt">'+n.toolbar.formats+"</span>"+t.arrow_down],fontSize:["se-btn-select se-btn-tool-size",n.toolbar.fontSize,"fontSize","submenu",'<span class="txt">'+n.toolbar.fontSize+"</span>"+t.arrow_down],fontColor:["",n.toolbar.fontColor,"fontColor","submenu",t.font_color],hiliteColor:["",n.toolbar.hiliteColor,"hiliteColor","submenu",t.highlight_color],align:["se-btn-align",n.toolbar.align,"align","submenu",e.rtl?t.align_right:t.align_left],list:["",n.toolbar.list,"list","submenu",t.list_number],horizontalRule:["btn_line",n.toolbar.horizontalRule,"horizontalRule","submenu",t.horizontal_rule],table:["",n.toolbar.table,"table","submenu",t.table],lineHeight:["",n.toolbar.lineHeight,"lineHeight","submenu",t.line_height],template:["",n.toolbar.template,"template","submenu",t.template],paragraphStyle:["",n.toolbar.paragraphStyle,"paragraphStyle","submenu",t.paragraph_style],textStyle:["",n.toolbar.textStyle,"textStyle","submenu",t.text_style],link:["",n.toolbar.link,"link","dialog",t.link],image:["",n.toolbar.image,"image","dialog",t.image],video:["",n.toolbar.video,"video","dialog",t.video],audio:["",n.toolbar.audio,"audio","dialog",t.audio],math:["",n.toolbar.math,"math","dialog",t.math],imageGallery:["",n.toolbar.imageGallery,"imageGallery","fileBrowser",t.image_gallery]}},_createModuleGroup:function(){const e=T.createElement("DIV");e.className="se-btn-module se-btn-module-border";const t=T.createElement("UL");return t.className="se-menu-list",e.appendChild(t),{div:e,ul:t}},_createButton:function(e,t,n,i,l,o,s){const a=T.createElement("LI"),r=T.createElement("BUTTON");return r.setAttribute("type","button"),r.setAttribute("class","se-btn"+(e?" "+e:"")+" se-tooltip"),r.setAttribute("data-command",n),r.setAttribute("data-display",i),r.setAttribute("tabindex","-1"),l||(l='<span class="se-icon-text">!</span>'),/^default\./i.test(l)&&(l=s[l.replace(/^default\./i,"")]),/^text\./i.test(l)&&(l=l.replace(/^text\./i,""),r.className+=" se-btn-more-text"),l+='<span class="se-tooltip-inner"><span class="se-tooltip-text">'+(t||n)+"</span></span>",o&&r.setAttribute("disabled",!0),r.innerHTML=l,a.appendChild(r),{li:a,button:r}},_createToolBar:function(e,t,n,i){const l=e.createElement("DIV");l.className="se-toolbar-separator-vertical";const o=e.createElement("DIV");o.className="se-toolbar sun-editor-common";const s=e.createElement("DIV");s.className="se-btn-tray",o.appendChild(s),t=JSON.parse(JSON.stringify(t));const a=i.icons,r=this._defaultButtons(i),c={},d=[],u={};if(n){const e=n.length?n:Object.keys(n).map((function(e){return n[e]}));for(let t,n=0,i=e.length;n<i;n++)t=e[n].default||e[n],u[t.name]=t}let h=null,g=null,p=null,m=null,f="",_=!1;const b=T.createElement("DIV");b.className="se-toolbar-more-layer";e:for(let n,i,o,v,y,C=0;C<t.length;C++)if(n=!1,y="",v=t[C],p=this._createModuleGroup(),"object"==typeof v){for(let e,l=0;l<v.length;l++){if(g=v[l],e=!1,/^\%\d+/.test(g)&&0===l){v[0]=g.replace(/[^\d]/g,""),d.push(v),t.splice(C--,1);continue e}if("object"==typeof g)"function"==typeof g.add?(f=g.name,h=r[f],u[f]=g):(f=g.name,h=[g.buttonClass,g.title,g.name,g.dataDisplay,g.innerHTML,g._disabled]);else{if(/^\-/.test(g)){y=g.substr(1),p.div.style.float=y;continue}if(/^\:/.test(g)){e=!0;const t=g.match(/^\:([^\-]+)\-([^\-]+)\-([^\-]+)/);o="__se__"+t[1].trim();h=["se-btn-more",t[2].trim(),o,"MORE",t[3].trim()]}else h=r[g];if(f=g,!h){const e=u[f];if(!e)throw Error("[SUNEDITOR.create.toolbar.fail] The button name of a plugin that does not exist. ["+f+"]");h=[e.buttonClass,e.title,e.name,e.display,e.innerHTML,e._disabled]}}m=this._createButton(h[0],h[1],h[2],h[3],h[4],h[5],a),(n?i:p.ul).appendChild(m.li),u[f]&&(c[f]=m.button),e&&(n=!0,i=T.createElement("DIV"),i.className="se-more-layer "+o,i.innerHTML='<div class="se-more-form"><ul class="se-menu-list"'+(y?' style="float: '+y+';"':"")+"></ul></div>",b.appendChild(i),i=i.firstElementChild.firstElementChild)}if(_){const e=l.cloneNode(!1);y&&(e.style.float=y),s.appendChild(e)}s.appendChild(p.div),_=!0}else if(/^\/$/.test(v)){const t=e.createElement("DIV");t.className="se-btn-module-enter",s.appendChild(t),_=!1}switch(s.children.length){case 0:s.style.display="none";break;case 1:T.removeClass(s.firstElementChild,"se-btn-module-border")}d.length>0&&d.unshift(t),b.children.length>0&&s.appendChild(b);const v=e.createElement("DIV");v.className="se-menu-tray",o.appendChild(v);const y=e.createElement("DIV");return y.className="se-toolbar-cover",o.appendChild(y),{element:o,plugins:u,pluginCallButtons:c,responsiveButtons:d,_menuTray:v,_buttonTray:s}}};var L=function(e,t,n){return{element:{originElement:e,topArea:t._top,relative:t._relative,toolbar:t._toolBar,_buttonTray:t._toolBar.querySelector(".se-btn-tray"),_menuTray:t._menuTray,resizingBar:t._resizingBar,navigation:t._navigation,charWrapper:t._charWrapper,charCounter:t._charCounter,editorArea:t._editorArea,wysiwygFrame:t._wysiwygArea,wysiwyg:t._wysiwygArea,code:t._codeArea,placeholder:t._placeholder,loading:t._loading,lineBreaker:t._lineBreaker,lineBreaker_t:t._lineBreaker_t,lineBreaker_b:t._lineBreaker_b,resizeBackground:t._resizeBack,_stickyDummy:t._stickyDummy,_arrow:t._arrow},tool:{cover:t._toolBar.querySelector(".se-toolbar-cover"),bold:t._toolBar.querySelector("._se_command_bold"),underline:t._toolBar.querySelector("._se_command_underline"),italic:t._toolBar.querySelector("._se_command_italic"),strike:t._toolBar.querySelector("._se_command_strike"),subscript:t._toolBar.querySelector("._se_command_subscript"),superscript:t._toolBar.querySelector("._se_command_superscript"),undo:t._toolBar.querySelector("._se_command_undo"),redo:t._toolBar.querySelector("._se_command_redo"),save:t._toolBar.querySelector("._se_command_save"),outdent:t._toolBar.querySelector("._se_command_outdent"),indent:t._toolBar.querySelector("._se_command_indent"),fullScreen:t._toolBar.querySelector("._se_command_fullScreen"),showBlocks:t._toolBar.querySelector("._se_command_showBlocks"),codeView:t._toolBar.querySelector("._se_command_codeView")},options:n,option:n}},B={name:"notice",add:function(e){const t=e.context;t.notice={};let n=e.util.createElement("DIV"),i=e.util.createElement("SPAN"),l=e.util.createElement("BUTTON");n.className="se-notice",l.className="close",l.setAttribute("aria-label","Close"),l.setAttribute("title",e.lang.dialogBox.close),l.innerHTML=e.icons.cancel,n.appendChild(i),n.appendChild(l),t.notice.modal=n,t.notice.message=i,l.addEventListener("click",this.onClick_cancel.bind(e)),t.element.editorArea.appendChild(n),n=null},onClick_cancel:function(e){e.preventDefault(),e.stopPropagation(),this.plugins.notice.close.call(this)},open:function(e){this.context.notice.message.textContent=e,this.context.notice.modal.style.display="block"},close:function(){this.context.notice.modal.style.display="none"}},A={init:function(e){return{create:function(t,n){return this.create(t,n,e)}.bind(this)}},create:function(e,t,n){T._propertiesInit(),"object"!=typeof t&&(t={}),n&&(t=[n,t].reduce((function(e,t){for(let n in t)if(T.hasOwn(t,n))if("plugins"===n&&t[n]&&e[n]){let i=e[n],l=t[n];i=i.length?i:Object.keys(i).map((function(e){return i[e]})),l=l.length?l:Object.keys(l).map((function(e){return l[e]})),e[n]=l.filter((function(e){return-1===i.indexOf(e)})).concat(i)}else e[n]=t[n];return e}),{}));const i="string"==typeof e?document.getElementById(e):e;if(!i){if("string"==typeof e)throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:"'+e+'")');throw Error("[SUNEDITOR.create.fail] suneditor requires textarea's element or id value")}const l=k.init(i,t);if(l.constructed._top.id&&document.getElementById(l.constructed._top.id))throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:"'+l.constructed._top.id+'")');return function(e,t,n,i,l,o){const s=e.element.originElement.ownerDocument||document,a=s.defaultView||window,r=T,c=l.icons,d={_d:s,_w:a,_parser:new a.DOMParser,_wd:null,_ww:null,_shadowRoot:null,util:r,functions:null,options:null,notice:B,icons:c,history:null,context:e,pluginCallButtons:t,plugins:n||{},initPlugins:{},_targetPlugins:{},_menuTray:{},lang:i,effectNode:null,submenu:null,container:null,_submenuName:"",_bindedSubmenuOff:null,_bindedContainerOff:null,submenuActiveButton:null,containerActiveButton:null,controllerArray:[],currentControllerName:"",currentControllerTarget:null,currentFileComponentInfo:null,codeViewDisabledButtons:null,resizingDisabledButtons:null,_moreLayerActiveButton:null,_htmlCheckWhitelistRegExp:null,_disallowedTextTagsRegExp:null,editorTagsWhitelistRegExp:null,pasteTagsWhitelistRegExp:null,hasFocus:!1,isDisabled:!1,_attributesWhitelistRegExp:null,_attributesTagsWhitelist:null,_bindControllersOff:null,_isInline:null,_isBalloon:null,_isBalloonAlways:null,_inlineToolbarAttr:{top:"",width:"",isShow:!1},_notHideToolbar:!1,_sticky:!1,_antiBlur:!1,_lineBreaker:null,_lineBreakerButton:null,_componentsInfoInit:!0,_componentsInfoReset:!1,activePlugins:null,managedTagsInfo:null,_charTypeHTML:!1,_fileInfoPluginsCheck:null,_fileInfoPluginsReset:null,_fileManager:{tags:null,regExp:null,queryString:null,pluginRegExp:null,pluginMap:null},commandMap:null,_styleCommandMap:null,_defaultCommand:{bold:l.textTags.bold,underline:l.textTags.underline,italic:l.textTags.italic,strike:l.textTags.strike,subscript:"SUB",superscript:"SUP"},_variable:{isCodeView:!1,isFullScreen:!1,innerHeight_fullScreen:0,resizeClientY:0,tabSize:4,codeIndent:4,minResizingSize:r.getNumber(e.element.wysiwygFrame.style.minHeight||"65",0),currentNodes:[],currentNodesMap:[],_range:null,_selectionNode:null,_originCssText:e.element.topArea.style.cssText,_bodyOverflow:"",_editorAreaOriginCssText:"",_wysiwygOriginCssText:"",_codeOriginCssText:"",_fullScreenAttrs:{sticky:!1,balloon:!1,inline:!1},_lineBreakComp:null,_lineBreakDir:""},callPlugin:function(e,n,i){if(i=i||t[e],!this.plugins[e])throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:"'+e+'")');this.initPlugins[e]?"object"==typeof this._targetPlugins[e]&&i&&this.initMenuTarget(e,i,this._targetPlugins[e]):(this.plugins[e].add(this,i),this.initPlugins[e]=!0),this.plugins[e].active&&!this.commandMap[e]&&i&&(this.commandMap[e]=i,this.activePlugins.push(e)),"function"==typeof n&&n()},addModule:function(e){for(let t,n=0,i=e.length;n<i;n++)t=e[n].name,this.plugins[t]||(this.plugins[t]=e[n]),this.initPlugins[t]||(this.initPlugins[t]=!0,"function"==typeof this.plugins[t].add&&this.plugins[t].add(this))},initMenuTarget:function(t,n,i){n?(e.element._menuTray.appendChild(i),this._targetPlugins[t]=!0,this._menuTray[n.getAttribute("data-command")]=i):this._targetPlugins[t]=i},submenuOn:function(e){this._bindedSubmenuOff&&this._bindedSubmenuOff(),this._bindControllersOff&&this.controllersOff();const t=this._submenuName=e.getAttribute("data-command"),n=this.submenu=this._menuTray[t];this.submenuActiveButton=e,this._setMenuPosition(e,n),this._bindedSubmenuOff=this.submenuOff.bind(this),this.addDocEvent("mousedown",this._bindedSubmenuOff,!1),this.plugins[t].on&&this.plugins[t].on.call(this),this._antiBlur=!0},submenuOff:function(){this.removeDocEvent("mousedown",this._bindedSubmenuOff),this._bindedSubmenuOff=null,this.submenu&&(this._submenuName="",this.submenu.style.display="none",this.submenu=null,r.removeClass(this.submenuActiveButton,"on"),this.submenuActiveButton=null,this._notHideToolbar=!1),this._antiBlur=!1},containerOn:function(e){this._bindedContainerOff&&this._bindedContainerOff();const t=this._containerName=e.getAttribute("data-command"),n=this.container=this._menuTray[t];this.containerActiveButton=e,this._setMenuPosition(e,n),this._bindedContainerOff=this.containerOff.bind(this),this.addDocEvent("mousedown",this._bindedContainerOff,!1),this.plugins[t].on&&this.plugins[t].on.call(this),this._antiBlur=!0},containerOff:function(){this.removeDocEvent("mousedown",this._bindedContainerOff),this._bindedContainerOff=null,this.container&&(this._containerName="",this.container.style.display="none",this.container=null,r.removeClass(this.containerActiveButton,"on"),this.containerActiveButton=null,this._notHideToolbar=!1),this._antiBlur=!1},_setMenuPosition:function(t,n){n.style.visibility="hidden",n.style.display="block",n.style.height="",r.addClass(t,"on");const i=this.context.element.toolbar,o=i.offsetWidth,s=u._getEditorOffsets(e.element.toolbar),c=n.offsetWidth,d=t.parentElement.offsetLeft+3;if(l.rtl){const e=t.offsetWidth,i=c>e?c-e:0,l=i>0?0:e-c;n.style.left=d-i+l+"px",s.left>u._getEditorOffsets(n).left&&(n.style.left="0px")}else{const e=o<=c?0:o-(d+c);n.style.left=e<0?d+e+"px":d+"px"}let h=0,g=t;for(;g&&g!==i;)h+=g.offsetTop,g=g.offsetParent;const p=h;this._isBalloon?h+=i.offsetTop+t.offsetHeight:h-=t.offsetHeight;const m=s.top;let f=n.offsetHeight,_=e.element.topArea,b=0;for(;_;)b+=_.scrollTop,_=_.parentElement;const v=a.innerHeight-(m-b+p+t.parentElement.offsetHeight);if(v<f){let e=-1*(f-p+3);const i=m-b+e,l=f+(i<0?i:0);l>v?(n.style.height=l+"px",e=-1*(l-p+3)):(n.style.height=v+"px",e=p+t.parentElement.offsetHeight),n.style.top=e+"px"}else n.style.top=p+t.parentElement.offsetHeight+"px";n.style.visibility=""},controllersOn:function(){this._bindControllersOff&&this._bindControllersOff(),this.controllerArray=[];for(let e,t=0;t<arguments.length;t++)e=arguments[t],e&&("string"!=typeof e?"function"!=typeof e?r.hasClass(e,"se-controller")?(e.style&&(e.style.display="block"),this.controllerArray.push(e)):(this.currentControllerTarget=e,this.currentFileComponentInfo=this.getFileComponent(e)):this.controllerArray.push(e):this.currentControllerName=e);this._bindControllersOff=this.controllersOff.bind(this),this.addDocEvent("mousedown",this._bindControllersOff,!1),this.addDocEvent("keydown",this._bindControllersOff,!1),this._antiBlur=!0,"function"==typeof h.showController&&h.showController(this.currentControllerName,this.controllerArray,this)},controllersOff:function(t){this._lineBreaker.style.display="none";const n=this.controllerArray.length;if(t&&t.target&&n>0)for(let e=0;e<n;e++)if("function"==typeof this.controllerArray[e].contains&&this.controllerArray[e].contains(t.target))return;if((!this._fileManager.pluginRegExp.test(this.currentControllerName)||!t||"keydown"!==t.type||27===t.keyCode)&&(e.element.lineBreaker_t.style.display=e.element.lineBreaker_b.style.display="none",this._variable._lineBreakComp=null,this.currentControllerName="",this.currentControllerTarget=null,this.currentFileComponentInfo=null,this.effectNode=null,this._bindControllersOff)){if(this.removeDocEvent("mousedown",this._bindControllersOff),this.removeDocEvent("keydown",this._bindControllersOff),this._bindControllersOff=null,n>0){for(let e=0;e<n;e++)"function"==typeof this.controllerArray[e]?this.controllerArray[e]():this.controllerArray[e].style.display="none";this.controllerArray=[]}this._antiBlur=!1}},setControllerPosition:function(t,n,i,o){l.rtl&&(o.left*=-1);const s=r.getOffset(n,e.element.wysiwygFrame);t.style.visibility="hidden",t.style.display="block";const a="top"===i?-(t.offsetHeight+2):n.offsetHeight+12;t.style.top=s.top+a+o.top+"px";const c=s.left-e.element.wysiwygFrame.scrollLeft+o.left,d=t.offsetWidth,u=n.offsetWidth,h=r.hasClass(t.firstElementChild,"se-arrow")?t.firstElementChild:null;if(l.rtl){const n=d>u?d-u:0,i=n>0?0:u-d;t.style.left=c-n+i+"px",n>0&&h&&(h.style.left=(d-14<10+n?d-14:10+n)+"px");const l=e.element.wysiwygFrame.offsetLeft-t.offsetLeft;l>0&&(t.style.left="0px",h&&(h.style.left=l+"px"))}else{t.style.left=c+"px";const n=e.element.wysiwygFrame.offsetWidth-(t.offsetLeft+d);n<0?(t.style.left=t.offsetLeft+n+"px",h&&(h.style.left=20-n+"px")):h&&(h.style.left="20px")}t.style.visibility=""},execCommand:function(e,t,n){this._wd.execCommand(e,t,"formatBlock"===e?"<"+n+">":n),this.history.push(!0)},nativeFocus:function(){const t=r.getParentElement(this.getSelectionNode(),"figcaption");t?t.focus():e.element.wysiwyg.focus(),this._editorRange()},focus:function(){if("none"!==e.element.wysiwygFrame.style.display){if(l.iframe)this.nativeFocus();else try{const t=this.getRange();if(t.startContainer===t.endContainer&&r.isWysiwygDiv(t.startContainer)){const t=r.createElement(l.defaultTag),n=r.createElement("BR");t.appendChild(n),e.element.wysiwyg.appendChild(t),this.setRange(n,0,n,0)}else this.setRange(t.startContainer,t.startOffset,t.endContainer,t.endOffset)}catch(e){this.nativeFocus()}u._applyTagEffects(),this._isBalloon&&u._toggleToolbarBalloon()}},focusEdge:function(t){t||(t=e.element.wysiwyg.lastElementChild);const n=this.getFileComponent(t);n?this.selectComponent(n.target,n.pluginName):t?(t=r.getChildElement(t,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!0))?this.setRange(t,t.textContent.length,t,t.textContent.length):this.nativeFocus():this.focus()},blur:function(){l.iframe?e.element.wysiwygFrame.blur():e.element.wysiwyg.blur()},setRange:function(e,t,n,i){if(!e||!n)return;t>e.textContent.length&&(t=e.textContent.length),i>n.textContent.length&&(i=n.textContent.length),r.isFormatElement(e)&&(e=e.childNodes[t]||e,t=0),r.isFormatElement(n)&&(n=n.childNodes[i]||n,i=t>1?t:0);const o=this._wd.createRange();try{o.setStart(e,t),o.setEnd(n,i)}catch(e){return console.warn("[SUNEDITOR.core.focus.error] "+e),void this.nativeFocus()}const s=this.getSelection();return s.removeAllRanges&&s.removeAllRanges(),s.addRange(o),this._editorRange(),l.iframe&&this.nativeFocus(),o},removeRange:function(){this._variable._range=null,this._variable._selectionNode=null,this.getSelection().removeAllRanges();const e=this.commandMap,t=this.activePlugins;for(let i in e)r.hasOwn(e,i)&&(t.indexOf(i)>-1?n[i].active.call(this,null):e.OUTDENT&&/^OUTDENT$/i.test(i)?e.OUTDENT.setAttribute("disabled",!0):e.INDENT&&/^INDENT$/i.test(i)?e.INDENT.removeAttribute("disabled"):r.removeClass(e[i],"active"))},getRange:function(){const t=this._variable._range||this._createDefaultRange(),n=this.getSelection();if(t.collapsed===n.isCollapsed||!e.element.wysiwyg.contains(n.focusNode))return t;if(n.rangeCount>0)return this._variable._range=n.getRangeAt(0),this._variable._range;{const e=n.anchorNode,t=n.focusNode,i=n.anchorOffset,l=n.focusOffset,o=r.compareElements(e,t),s=o.ancestor&&(0===o.result?i<=l:o.result>1);return this.setRange(s?e:t,s?i:l,s?t:e,s?l:i)}},getRange_addLine:function(t,n){if(this._selectionVoid(t)){const i=e.element.wysiwyg,o=r.createElement(l.defaultTag);o.innerHTML="<br>",i.insertBefore(o,n&&n!==i?n.nextElementSibling:i.firstElementChild),this.setRange(o.firstElementChild,0,o.firstElementChild,1),t=this._variable._range}return t},getSelection:function(){return this._shadowRoot&&this._shadowRoot.getSelection?this._shadowRoot.getSelection():this._ww.getSelection()},getSelectionNode:function(){if(r.isWysiwygDiv(this._variable._selectionNode)&&this._editorRange(),!this._variable._selectionNode){const t=r.getChildElement(e.element.wysiwyg.firstChild,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!1);if(t)return this._variable._selectionNode=t,t;this._editorRange()}return this._variable._selectionNode},_editorRange:function(){const e=this.getSelection();if(!e)return null;let t=null,n=null;t=e.rangeCount>0?e.getRangeAt(0):this._createDefaultRange(),this._variable._range=t,n=t.collapsed?t.commonAncestorContainer:e.extentNode||e.anchorNode,this._variable._selectionNode=n},_createDefaultRange:function(){const t=e.element.wysiwyg;t.focus();const n=this._wd.createRange();let i=t.firstElementChild;return i||(i=r.createElement(l.defaultTag),i.innerHTML="<br>",t.appendChild(i)),n.setStart(i,0),n.setEnd(i,0),n},_selectionVoid:function(e){const t=e.commonAncestorContainer;return r.isWysiwygDiv(e.startContainer)&&r.isWysiwygDiv(e.endContainer)||/FIGURE/i.test(t.nodeName)||this._fileManager.regExp.test(t.nodeName)||r.isMediaComponent(t)},_resetRangeToTextNode:function(){const t=this.getRange();if(this._selectionVoid(t))return!1;let n,i,o,s=t.startContainer,a=t.startOffset,c=t.endContainer,d=t.endOffset;if(r.isFormatElement(s)&&(s=s.childNodes[a]||s.lastChild,a=s.textContent.length),r.isFormatElement(c)&&(c=c.childNodes[d]||c.lastChild,d=c.textContent.length),n=r.isWysiwygDiv(s)?e.element.wysiwyg.firstChild:s,i=a,r.isBreak(n)||1===n.nodeType&&n.childNodes.length>0){const e=r.isBreak(n);if(!e){for(;n&&!r.isBreak(n)&&1===n.nodeType;)n=n.childNodes[i]||n.nextElementSibling||n.nextSibling,i=0;let e=r.getFormatElement(n,null);e===r.getRangeFormatElement(e,null)&&(e=r.createElement(r.getParentElement(n,r.isCell)?"DIV":l.defaultTag),n.parentNode.insertBefore(e,n),e.appendChild(n))}if(r.isBreak(n)){const t=r.createTextNode(r.zeroWidthSpace);n.parentNode.insertBefore(t,n),n=t,e&&s===c&&(c=n,d=1)}}if(s=n,a=i,n=r.isWysiwygDiv(c)?e.element.wysiwyg.lastChild:c,i=d,r.isBreak(n)||1===n.nodeType&&n.childNodes.length>0){const e=r.isBreak(n);if(!e){for(;n&&!r.isBreak(n)&&1===n.nodeType&&(o=n.childNodes,0!==o.length);)n=o[i>0?i-1:i]||!/FIGURE/i.test(o[0].nodeName)?o[0]:n.previousElementSibling||n.previousSibling||s,i=i>0?n.textContent.length:i;let e=r.getFormatElement(n,null);e===r.getRangeFormatElement(e,null)&&(e=r.createElement(r.isCell(e)?"DIV":l.defaultTag),n.parentNode.insertBefore(e,n),e.appendChild(n))}if(r.isBreak(n)){const t=r.createTextNode(r.zeroWidthSpace);n.parentNode.insertBefore(t,n),n=t,i=1,e&&!n.previousSibling&&r.removeItem(c)}}return c=n,d=i,this.setRange(s,a,c,d),!0},getSelectedElements:function(t){if(!this._resetRangeToTextNode())return[];let n=this.getRange();if(r.isWysiwygDiv(n.startContainer)){const t=e.element.wysiwyg.children;if(0===t.length)return[];this.setRange(t[0],0,t[t.length-1],t[t.length-1].textContent.trim().length),n=this.getRange()}const i=n.startContainer,l=n.endContainer,o=n.commonAncestorContainer,s=r.getListChildren(o,(function(e){return t?t(e):r.isFormatElement(e)}));if(r.isWysiwygDiv(o)||r.isRangeFormatElement(o)||s.unshift(r.getFormatElement(o,null)),i===l||1===s.length)return s;let a=r.getFormatElement(i,null),c=r.getFormatElement(l,null),d=null,u=null;const h=function(e){return!r.isTable(e)||/^TABLE$/i.test(e.nodeName)};let g=r.getRangeFormatElement(a,h),p=r.getRangeFormatElement(c,h);r.isTable(g)&&r.isListCell(g.parentNode)&&(g=g.parentNode),r.isTable(p)&&r.isListCell(p.parentNode)&&(p=p.parentNode);const m=g===p;for(let e,t=0,n=s.length;t<n;t++)if(e=s[t],a===e||!m&&e===g)d=t;else if(c===e||!m&&e===p){u=t;break}return null===d&&(d=0),null===u&&(u=s.length-1),s.slice(d,u+1)},getSelectedElementsAndComponents:function(e){const t=this.getRange().commonAncestorContainer,n=r.getParentElement(t,r.isComponent),i=r.isTable(t)?this.getSelectedElements(null):this.getSelectedElements(function(e){const t=this.getParentElement(e,this.isComponent);return this.isFormatElement(e)&&(!t||t===n)||this.isComponent(e)&&!this.getFormatElement(e)}.bind(r));if(e)for(let e=0,t=i.length;e<t;e++)for(let n=e-1;n>=0;n--)if(i[n].contains(i[e])){i.splice(e,1),e--,t--;break}return i},isEdgePoint:function(e,t,n){return"end"!==n&&0===t||(!n||"front"!==n)&&!e.nodeValue&&1===t||(!n||"end"===n)&&!!e.nodeValue&&t===e.nodeValue.length},isEdgeFormat:function(e,t,n){if(!this.isEdgePoint(e,t,n))return!1;let i=!0;for(n="front"===n?"previousSibling":"nextSibling";e&&!r.isFormatElement(e)&&!r.isWysiwygDiv(e);)!e[n]||r.isBreak(e[n])&&!e[n][n]?e=e.parentNode:(i=!1,e=null);return i},showLoading:function(){e.element.loading.style.display="block"},closeLoading:function(){e.element.loading.style.display="none"},appendFormatTag:function(e,t){const n=r.getFormatElement(this.getSelectionNode(),null),i=t?"string"==typeof t?t:t.nodeName:r.isFormatElement(n)&&!r.isFreeFormatElement(n)?n.nodeName:l.defaultTag,o=r.createElement(i);return o.innerHTML="<br>",(t&&"string"!=typeof t||!t&&r.isFormatElement(n))&&r.copyTagAttributes(o,t||n),r.isCell(e)?e.insertBefore(o,e.nextElementSibling):e.parentNode.insertBefore(o,e.nextElementSibling),o},insertComponent:function(e,t,n,i){if(n&&!this.checkCharCount(e,null))return null;const l=this.removeNode();this.getRange_addLine(this.getRange(),l.container);let o=null,s=this.getSelectionNode(),a=r.getFormatElement(s,null);if(r.isListCell(a))this.insertNode(e,s===a?null:l.container.nextSibling,!1),e.nextSibling||e.parentNode.appendChild(r.createElement("BR"));else{if(this.getRange().collapsed&&(3===l.container.nodeType||r.isBreak(l.container))){const e=r.getParentElement(l.container,function(e){return this.isRangeFormatElement(e)}.bind(r));o=r.splitElement(l.container,l.offset,e?r.getElementDepth(e)+1:0),o&&(a=o.previousSibling)}this.insertNode(e,a,!1),a&&r.onlyZeroWidthSpace(a)&&r.removeItem(a)}if(this.setRange(e,0,e,0),!i){const t=this.getFileComponent(e);t?this.selectComponent(t.target,t.pluginName):o&&(o=r.getEdgeChildNodes(o,null).sc||o,this.setRange(o,0,o,0))}return t||this.history.push(1),o||e},getFileComponent:function(e){if(!this._fileManager.queryString||!e)return null;let t,n;return(/^FIGURE$/i.test(e.nodeName)||/se-component/.test(e.className))&&(t=e.querySelector(this._fileManager.queryString)),!t&&e.nodeName&&this._fileManager.regExp.test(e.nodeName)&&(t=e),t&&(n=this._fileManager.pluginMap[t.nodeName.toLowerCase()],n)?{target:t,component:r.getParentElement(t,r.isComponent),pluginName:n}:null},selectComponent:function(e,t){if(r.isUneditableComponent(r.getParentElement(e,r.isComponent))||r.isUneditableComponent(e))return!1;this.hasFocus||this.focus();const n=this.plugins[t];n&&a.setTimeout(function(){"function"==typeof n.select&&this.callPlugin(t,n.select.bind(this,e),null),this._setComponentLineBreaker(e)}.bind(this))},_setComponentLineBreaker:function(t){this._lineBreaker.style.display="none";const n=r.getParentElement(t,r.isComponent),i=e.element.lineBreaker_t.style,l=e.element.lineBreaker_b.style,o="block"===this.context.resizing.resizeContainer.style.display?this.context.resizing.resizeContainer:t,s=r.isListCell(n.parentNode);let a,c,d;(s?n.previousSibling:r.isFormatElement(n.previousElementSibling))?i.display="none":(this._variable._lineBreakComp=n,c=e.element.wysiwyg.scrollTop,a=r.getOffset(t,e.element.wysiwygFrame).top+c,d=o.offsetWidth/2/2,i.top=a-c-12+"px",i.left=r.getOffset(o).left+d+"px",i.display="block"),(s?n.nextSibling:r.isFormatElement(n.nextElementSibling))?l.display="none":(a||(this._variable._lineBreakComp=n,c=e.element.wysiwyg.scrollTop,a=r.getOffset(t,e.element.wysiwygFrame).top+c,d=o.offsetWidth/2/2),l.top=a+o.offsetHeight-c-12+"px",l.left=r.getOffset(o).left+o.offsetWidth-d-24+"px",l.display="block")},insertNode:function(e,t,n){if(n&&!this.checkCharCount(e,null))return null;const i=r.getFreeFormatElement(this.getSelectionNode(),null),o=!i&&(r.isFormatElement(e)||r.isRangeFormatElement(e))||r.isComponent(e);if(!t&&o){const e=this.getRange();if(e.startOffset!==e.endOffset||e.startContainer!==e.endContainer){const e=this.removeNode();if(3===e.container.nodeType||r.isBreak(e.container)){const n=r.getParentElement(e.container,function(e){return this.isRangeFormatElement(e)||this.isListCell(e)}.bind(r));(t=r.splitElement(e.container,e.offset,n?r.getElementDepth(n)+1:0))&&(t=t.previousSibling)}}}const s=t||o?this.getRange():this.getRange_addLine(this.getRange(),null),a=s.commonAncestorContainer,c=s.startOffset,d=s.endOffset,u=s.startContainer===a&&r.isFormatElement(a),h=u?a.childNodes[c]:s.startContainer,g=u?a.childNodes[d]:s.endContainer;let p,m=null;if(t)p=t.parentNode,t=t.nextSibling,m=!0;else if(p=h,3===h.nodeType&&(p=h.parentNode),s.collapsed)if(3===a.nodeType)t=a.textContent.length>d?a.splitText(d):a.nextSibling;else if(r.isBreak(p))t=p,p=p.parentNode;else{let n=p.childNodes[c];const i=n&&3===n.nodeType&&r.onlyZeroWidthSpace(n)&&r.isBreak(n.nextSibling)?n.nextSibling:n;i?i.nextSibling?t=r.isBreak(i)&&!r.isBreak(e)?i:i.nextSibling:(p.removeChild(i),t=null):t=null}else{if(h===g){t=this.isEdgePoint(g,d)?g.nextSibling:g.splitText(d);let e=h;this.isEdgePoint(h,c)||(e=h.splitText(c)),p.removeChild(e),0===p.childNodes.length&&o&&(p.innerHTML="<br>")}else{const e=this.removeNode(),n=e.container,i=e.prevContainer;if(n&&0===n.childNodes.length&&o&&(r.isFormatElement(n)?n.innerHTML="<br>":r.isRangeFormatElement(n)&&(n.innerHTML="<"+l.defaultTag+"><br></"+l.defaultTag+">")),!o&&i)if(p=3===i.nodeType?i.parentNode:i,p.contains(n))for(t=n;t.parentNode!==p;)t=t.parentNode;else t=null;else p=o?a:n,t=o?g:null;for(;t&&!r.isFormatElement(t)&&t.parentNode!==a;)t=t.parentNode}}try{if(r.isFormatElement(e)||r.isRangeFormatElement(e)||!r.isListCell(p)&&r.isComponent(e)){const e=p;if(r.isList(t))p=t,t=null;else if(r.isListCell(t))p=t.previousElementSibling||t;else if(!m&&!t){const e=this.removeNode(),n=3===e.container.nodeType?r.isListCell(r.getFormatElement(e.container,null))?e.container:r.getFormatElement(e.container,null)||e.container.parentNode:e.container,i=r.isWysiwygDiv(n)||r.isRangeFormatElement(n);p=i?n:n.parentNode,t=i?null:n.nextSibling}0===e.childNodes.length&&p!==e&&r.removeItem(e)}!o||i||r.isRangeFormatElement(p)||r.isListCell(p)||r.isWysiwygDiv(p)||(t=p.nextElementSibling,p=p.parentNode),p.insertBefore(e,p===t?p.lastChild:t)}catch(t){p.appendChild(e)}finally{if(i&&(r.isFormatElement(e)||r.isRangeFormatElement(e))&&(e=this._setIntoFreeFormat(e)),!r.isComponent(e)){let t=1;if(3===e.nodeType){const t=e.previousSibling,n=e.nextSibling,i=!t||1===t.nodeType||r.onlyZeroWidthSpace(t)?"":t.textContent,l=!n||1===n.nodeType||r.onlyZeroWidthSpace(n)?"":n.textContent;t&&i.length>0&&(e.textContent=i+e.textContent,r.removeItem(t)),n&&n.length>0&&(e.textContent+=l,r.removeItem(n));const o={container:e,startOffset:i.length,endOffset:e.textContent.length-l.length};return this.setRange(e,o.startOffset,e,o.endOffset),o}if(!r.isBreak(e)&&r.isFormatElement(p)){let n=null;e.previousSibling&&!r.isBreak(e.previousSibling)||(n=r.createTextNode(r.zeroWidthSpace),e.parentNode.insertBefore(n,e)),e.nextSibling&&!r.isBreak(e.nextSibling)||(n=r.createTextNode(r.zeroWidthSpace),e.parentNode.insertBefore(n,e.nextSibling)),r._isIgnoreNodeChange(e)&&(e=e.nextSibling,t=0)}this.setRange(e,t,e,t)}return this.history.push(!0),e}},_setIntoFreeFormat:function(e){const t=e.parentNode;let n,i;for(;r.isFormatElement(e)||r.isRangeFormatElement(e);){for(n=e.childNodes,i=null;n[0];)if(i=n[0],r.isFormatElement(i)||r.isRangeFormatElement(i)){if(this._setIntoFreeFormat(i),!e.parentNode)break;n=e.childNodes}else t.insertBefore(i,e);0===e.childNodes.length&&r.removeItem(e),e=r.createElement("BR"),t.insertBefore(e,i.nextSibling)}return e},removeNode:function(){this._resetRangeToTextNode();const t=this.getRange();let n,i=0,l=t.startContainer,o=t.endContainer;const s=t.startOffset,a=t.endOffset,c=3===t.commonAncestorContainer.nodeType&&t.commonAncestorContainer.parentNode===l.parentNode?l.parentNode:t.commonAncestorContainer;let d=null,u=null;const h=r.getListChildNodes(c,null);let g=r.getArrayIndex(h,l),p=r.getArrayIndex(h,o);if(h.length>0&&g>-1&&p>-1){for(let e=g+1,t=l;e>=0;e--)h[e]===t.parentNode&&h[e].firstChild===t&&0===s&&(g=e,t=t.parentNode);for(let e=p-1,t=o;e>g;e--)h[e]===t.parentNode&&1===h[e].nodeType&&(h.splice(e,1),t=t.parentNode,--p)}else{if(0===h.length){if(r.isFormatElement(c)||r.isRangeFormatElement(c)||r.isWysiwygDiv(c)||r.isBreak(c)||r.isMedia(c))return{container:c,offset:0};if(3===c.nodeType)return{container:c,offset:a};h.push(c),l=o=c}else if(l=o=h[0],r.isBreak(l)||r.onlyZeroWidthSpace(l))return{container:r.isMedia(c)?c:l,offset:0};g=p=0}function m(e){const t=r.getFormatElement(e,null);if(r.removeItem(e),r.isListCell(t)){const e=r.getArrayItem(t.children,r.isList,!1);if(e){const n=e.firstElementChild,i=n.childNodes;for(;i[0];)t.insertBefore(i[0],e);r.removeItemAllParents(n,null,null)}}}for(let e=g;e<=p;e++){const t=h[e];if(0===t.length||3===t.nodeType&&void 0===t.data)m(t);else if(t!==l)t!==o?m(t):(u=1===o.nodeType?r.createTextNode(o.textContent):r.createTextNode(o.substringData(a,o.length-a)),u.length>0?o.data=u.data:m(o));else if(1===l.nodeType?d=r.createTextNode(l.textContent):t===o?(d=r.createTextNode(l.substringData(0,s)+o.substringData(a,o.length-a)),i=s):d=r.createTextNode(l.substringData(0,s)),d.length>0?l.data=d.data:m(l),t===o)break}if(n=o&&o.parentNode?o:l&&l.parentNode?l:t.endContainer||t.startContainer,!r.isWysiwygDiv(n)&&0===n.childNodes.length){const t=r.removeItemAllParents(n,function(e){if(this.isComponent(e))return!1;const t=e.textContent;return 0===t.length||/^(\n|\u200B)+$/.test(t)}.bind(r),null);t&&(n=t.sc||t.ec||e.element.wysiwyg)}return this.setRange(n,i,n,i),this.history.push(!0),{container:n,offset:i,prevContainer:l&&l.parentNode?l:null}},applyRangeFormatElement:function(e){this.getRange_addLine(this.getRange(),null);const t=this.getSelectedElementsAndComponents(!1);if(!t||0===t.length)return;e:for(let e,n,i,l,o,s,a=0,c=t.length;a<c;a++)if(e=t[a],r.isListCell(e))if(n=e.lastElementChild,n&&r.isListCell(e.nextElementSibling)&&t.indexOf(e.nextElementSibling)>-1&&(l=n.lastElementChild,t.indexOf(l)>-1)){let e=null;for(;e=l.lastElementChild;)if(r.isList(e)){if(!(t.indexOf(e.lastElementChild)>-1))continue e;l=e.lastElementChild}i=n.firstElementChild,o=t.indexOf(i),s=t.indexOf(l),t.splice(o,s-o+1),c=t.length}else;let n,i,l,o=t[t.length-1];n=r.isRangeFormatElement(o)||r.isFormatElement(o)?o:r.getRangeFormatElement(o,null)||r.getFormatElement(o,null),r.isCell(n)?(i=null,l=n):(i=n.nextSibling,l=n.parentNode);let s=r.getElementDepth(n),a=null;const c=[],d=function(e,t,n){let i=null;if(e!==t&&!r.isTable(t)){if(t&&r.getElementDepth(e)===r.getElementDepth(t))return n;i=r.removeItemAllParents(t,null,e)}return i?i.ec:n};for(let n,o,u,h,g,p,m,f=0,_=t.length;f<_;f++)if(n=t[f],o=n.parentNode,o&&!e.contains(o))if(u=r.getElementDepth(n),r.isList(o)){if(null===a&&(p?(a=p,m=!0,p=null):a=o.cloneNode(!1)),c.push(n),g=t[f+1],f===_-1||g&&g.parentNode!==o){g&&n.contains(g.parentNode)&&(p=g.parentNode.cloneNode(!1));let t,f=o.parentNode;for(;r.isList(f);)t=r.createElement(f.nodeName),t.appendChild(a),a=t,f=f.parentNode;const _=this.detachRangeFormatElement(o,c,null,!0,!0);s>=u?(s=u,l=_.cc,i=d(l,o,_.ec),i&&(l=i.parentNode)):l===_.cc&&(i=_.ec),l!==_.cc&&(h=d(l,_.cc,h),i=void 0!==h?h:_.cc);for(let e=0,t=_.removeArray.length;e<t;e++)a.appendChild(_.removeArray[e]);m||e.appendChild(a),p&&_.removeArray[_.removeArray.length-1].appendChild(p),a=null,m=!1}}else s>=u&&(s=u,l=o,i=n.nextSibling),e.appendChild(n),l!==o&&(h=d(l,o),void 0!==h&&(i=h));if(this.effectNode=null,r.mergeSameTags(e,null,!1),r.mergeNestedTags(e,function(e){return this.isList(e)}.bind(r)),i&&r.getElementDepth(i)>0&&(r.isList(i.parentNode)||r.isList(i.parentNode.parentNode))){const t=r.getParentElement(i,function(e){return this.isRangeFormatElement(e)&&!this.isList(e)}.bind(r)),n=r.splitElement(i,null,t?r.getElementDepth(t)+1:0);n.parentNode.insertBefore(e,n)}else l.insertBefore(e,i),d(e,i);const u=r.getEdgeChildNodes(e.firstElementChild,e.lastElementChild);t.length>1?this.setRange(u.sc,0,u.ec,u.ec.textContent.length):this.setRange(u.ec,u.ec.textContent.length,u.ec,u.ec.textContent.length),this.history.push(!1)},detachRangeFormatElement:function(e,t,n,i,o){const s=this.getRange(),a=s.startOffset,c=s.endOffset;let d=r.getListChildNodes(e,(function(t){return t.parentNode===e})),u=e.parentNode,h=null,g=null,p=e.cloneNode(!1);const m=[],f=r.isList(n);let _=!1,b=!1,v=!1;function y(t,n,i,l){if(r.onlyZeroWidthSpace(n)&&(n.innerHTML=r.zeroWidthSpace),3===n.nodeType)return t.insertBefore(n,i),n;const o=(v?n:l).childNodes;let s=n.cloneNode(!1),a=null,c=null;for(;o[0];)c=o[0],!r._notTextNode(c)||r.isBreak(c)||r.isListCell(s)?s.appendChild(c):(s.childNodes.length>0&&(a||(a=s),t.insertBefore(s,i),s=n.cloneNode(!1)),t.insertBefore(c,i),a||(a=c));if(s.childNodes.length>0){if(r.isListCell(t)&&r.isListCell(s)&&r.isList(i))if(f){for(a=i;i;)s.appendChild(i),i=i.nextSibling;t.parentNode.insertBefore(s,t.nextElementSibling)}else{const t=l.nextElementSibling,n=r.detachNestedList(l,!1);if(e!==n||t!==l.nextElementSibling){const t=s.childNodes;for(;t[0];)l.appendChild(t[0]);e=n,b=!0}}else t.insertBefore(s,i);a||(a=s)}return a}for(let o,s,a,c=0,C=d.length;c<C;c++)if(o=d[c],3!==o.nodeType||!r.isList(p))if(v=!1,i&&0===c&&(h=t&&t.length!==C&&t[0]!==o?p:e.previousSibling),t&&(s=t.indexOf(o)),t&&-1===s)p||(p=e.cloneNode(!1)),p.appendChild(o);else{if(t&&(a=t[s+1]),p&&p.children.length>0&&(u.insertBefore(p,e),p=null),!f&&r.isListCell(o))if(a&&r.getElementDepth(o)!==r.getElementDepth(a)&&(r.isListCell(u)||r.getArrayItem(o.children,r.isList,!1))){const t=o.nextElementSibling,n=r.detachNestedList(o,!1);e===n&&t===o.nextElementSibling||(e=n,b=!0)}else{const t=o;o=r.createElement(i?t.nodeName:r.isList(e.parentNode)||r.isListCell(e.parentNode)?"LI":r.isCell(e.parentNode)?"DIV":l.defaultTag);const n=r.isListCell(o),s=t.childNodes;for(;s[0]&&(!r.isList(s[0])||n);)o.appendChild(s[0]);r.copyFormatAttributes(o,t),v=!0}else o=o.cloneNode(!1);if(!b&&(i?(m.push(o),r.removeItem(d[c])):(n?(_||(u.insertBefore(n,e),_=!0),o=y(n,o,null,d[c])):o=y(u,o,e,d[c]),b||(t?(g=o,h||(h=o)):h||(h=g=o))),b)){b=v=!1,d=r.getListChildNodes(e,(function(t){return t.parentNode===e})),p=e.cloneNode(!1),u=e.parentNode,c=-1,C=d.length;continue}}const C=e.parentNode;let w=e.nextSibling;p&&p.children.length>0&&C.insertBefore(p,w),n?h=n.previousSibling:h||(h=e.previousSibling),w=e.nextSibling,0===e.children.length||0===e.textContent.length?r.removeItem(e):r.removeEmptyNode(e,null);let x=null;if(i)x={cc:C,sc:h,ec:w,removeArray:m};else{h||(h=g),g||(g=h);const e=r.getEdgeChildNodes(h,g.parentNode?h:g);x={cc:(e.sc||e.ec).parentNode,sc:e.sc,ec:e.ec}}if(this.effectNode=null,o)return x;!i&&x&&(t?this.setRange(x.sc,a,x.ec,c):this.setRange(x.sc,0,x.sc,0)),this.history.push(!1)},detachList:function(e,t){let n={},i=!1,l=!1,o=null,s=null;const a=function(e){return!this.isComponent(e)}.bind(r);for(let c,d,u,h,g=0,p=e.length;g<p;g++){if(u=g===p-1,d=r.getRangeFormatElement(e[g],a),h=r.isList(d),!c&&h)c=d,n={r:c,f:[r.getParentElement(e[g],"LI")]},0===g&&(i=!0);else if(c&&h)if(c!==d){const a=this.detachRangeFormatElement(n.f[0].parentNode,n.f,null,t,!0);d=e[g].parentNode,i&&(o=a.sc,i=!1),u&&(s=a.ec),h?(c=d,n={r:c,f:[r.getParentElement(e[g],"LI")]},u&&(l=!0)):c=null}else n.f.push(r.getParentElement(e[g],"LI")),u&&(l=!0);if(u&&r.isList(c)){const e=this.detachRangeFormatElement(n.f[0].parentNode,n.f,null,t,!0);(l||1===p)&&(s=e.ec),i&&(o=e.sc||s)}}return{sc:o,ec:s}},nodeChange:function(e,t,n,i){this._resetRangeToTextNode();let l=this.getRange_addLine(this.getRange(),null);t=!!(t&&t.length>0)&&t,n=!!(n&&n.length>0)&&n;const o=!e,s=o&&!n&&!t;let c=l.startContainer,d=l.startOffset,u=l.endContainer,h=l.endOffset;if(s&&l.collapsed&&r.isFormatElement(c.parentNode)&&r.isFormatElement(u.parentNode)||c===u&&1===c.nodeType&&r.isNonEditable(c))return;if(l.collapsed&&!s&&1===c.nodeType&&!r.isBreak(c)&&!r.isComponent(c)){let e=null;const t=c.childNodes[d];t&&(e=t.nextSibling?r.isBreak(t)?t:t.nextSibling:null);const n=r.createTextNode(r.zeroWidthSpace);c.insertBefore(n,e),this.setRange(n,1,n,1),l=this.getRange(),c=l.startContainer,d=l.startOffset,u=l.endContainer,h=l.endOffset}r.isFormatElement(c)&&(c=c.childNodes[d]||c.firstChild,d=0),r.isFormatElement(u)&&(u=u.childNodes[h]||u.lastChild,h=u.textContent.length),o&&(e=r.createElement("DIV"));const g=a.RegExp,p=e.nodeName;if(!s&&c===u&&!n&&e){let t=c,n=0;const i=[],l=e.style;for(let e=0,t=l.length;e<t;e++)i.push(l[e]);const s=e.classList;for(let e=0,t=s.length;e<t;e++)i.push("."+s[e]);if(i.length>0){for(;!r.isFormatElement(t)&&!r.isWysiwygDiv(t);){for(let l=0;l<i.length;l++)if(1===t.nodeType){const s=i[l],a=!!/^\./.test(s)&&new g("\\s*"+s.replace(/^\./,"")+"(\\s+|$)","ig"),r=o?!!t.style[s]:!!t.style[s]&&!!e.style[s]&&t.style[s]===e.style[s],c=!1!==a&&(o?!!t.className.match(a):!!t.className.match(a)&&!!e.className.match(a));(r||c)&&n++}t=t.parentNode}if(n>=i.length)return}}let m,f={},_={},b="",v="",y="";if(t){for(let e,n=0,i=t.length;n<i;n++)e=t[n],/^\./.test(e)?v+=(v?"|":"\\s*(?:")+e.replace(/^\./,""):b+=(b?"|":"(?:;|^|\\s)(?:")+e;b&&(b+=")\\s*:[^;]*\\s*(?:;|$)",b=new g(b,"ig")),v&&(v+=")(?=\\s+|$)",v=new g(v,"ig"))}if(n){y="^(?:"+n[0];for(let e=1;e<n.length;e++)y+="|"+n[e];y+=")$",y=new g(y,"i")}const C=a.Boolean,w={v:!1},x=function(e){const t=e.cloneNode(!1);if(3===t.nodeType||r.isBreak(t))return t;if(s)return null;const n=!y&&o||y&&y.test(t.nodeName);if(n&&!i)return w.v=!0,null;const l=t.style.cssText;let a="";b&&l.length>0&&(a=l.replace(b,"").trim(),a!==l&&(w.v=!0));const c=t.className;let d="";return v&&c.length>0&&(d=c.replace(v,"").trim(),d!==c&&(w.v=!0)),(!o||!v&&c||!b&&l||a||d||!n)&&(a||d||t.nodeName!==p||C(b)!==C(l)||C(v)!==C(c))?(b&&l.length>0&&(t.style.cssText=a),t.style.cssText||t.removeAttribute("style"),v&&c.length>0&&(t.className=d.trim()),t.className.trim()||t.removeAttribute("class"),t.style.cssText||t.className||t.nodeName!==p&&!n?t:(w.v=!0,null)):(w.v=!0,null)},E=this.getSelectedElements(null);l=this.getRange(),c=l.startContainer,d=l.startOffset,u=l.endContainer,h=l.endOffset,r.getFormatElement(c,null)||(c=r.getChildElement(E[0],(function(e){return 3===e.nodeType}),!1),d=0),r.getFormatElement(u,null)||(u=r.getChildElement(E[E.length-1],(function(e){return 3===e.nodeType}),!1),h=u.textContent.length);const S=r.getFormatElement(c,null)===r.getFormatElement(u,null),N=E.length-(S?0:1);m=e.cloneNode(!1);const T=s||o&&function(e){for(let t=0,n=e.length;t<n;t++)if(r._isMaintainedNode(e[t])||r._isSizeNode(e[t]))return!0;return!1}(n),k=r._isSizeNode(m),L=this._util_getMaintainedNode.bind(r,T,k),B=this._util_isMaintainedNode.bind(r,T,k);if(S){const e=this._nodeChange_oneLine(E[0],m,x,c,d,u,h,s,o,l.collapsed,w,L,B);f.container=e.startContainer,f.offset=e.startOffset,_.container=e.endContainer,_.offset=e.endOffset,f.container===_.container&&r.onlyZeroWidthSpace(f.container)&&(f.offset=_.offset=1),this._setCommonListStyle(e.ancestor,null)}else{N>0&&(m=e.cloneNode(!1),_=this._nodeChange_endLine(E[N],m,x,u,h,s,o,w,L,B));for(let t,n=N-1;n>0;n--)m=e.cloneNode(!1),t=this._nodeChange_middleLine(E[n],m,x,s,o,w,_.container),t.endContainer&&(_.ancestor=null,_.container=t.endContainer),this._setCommonListStyle(t.ancestor,null);m=e.cloneNode(!1),f=this._nodeChange_startLine(E[0],m,x,c,d,s,o,w,L,B,_.container),f.endContainer&&(_.ancestor=null,_.container=f.endContainer),N<=0?_=f:_.container||(_.ancestor=null,_.container=f.container,_.offset=f.container.textContent.length),this._setCommonListStyle(f.ancestor,null),this._setCommonListStyle(_.ancestor||r.getFormatElement(_.container),null)}this.controllersOff(),this.setRange(f.container,f.offset,_.container,_.offset),this.history.push(!1)},_setCommonListStyle:function(e,t){if(!r.isListCell(e))return;t||e.removeAttribute("style");const n=r.getArrayItem((t||e).childNodes,(function(e){return!r.isBreak(e)&&!r.onlyZeroWidthSpace(e.textContent.trim())}),!0);if(n[0]&&1===n.length){if(!(t=n[0])||1!==t.nodeType)return;const i=t.style,l=e.style;/STRONG/i.test(t.nodeName)?l.fontWeight="bold":i.fontWeight&&(l.fontWeight=i.fontWeight),i.color&&(l.color=i.color),i.fontSize&&(l.fontSize=i.fontSize),this._setCommonListStyle(e,t)}},_stripRemoveNode:function(e){const t=e.parentNode;if(!e||3===e.nodeType||!t)return;const n=e.childNodes;for(;n[0];)t.insertBefore(n[0],e);t.removeChild(e)},_util_getMaintainedNode:function(e,t,n){return!n||e?null:this.getParentElement(n,this._isMaintainedNode.bind(this))||(t?null:this.getParentElement(n,this._isSizeNode.bind(this)))},_util_isMaintainedNode:function(e,t,n){if(!n||e||1!==n.nodeType)return!1;const i=this._isMaintainedNode(n);return this.getParentElement(n,this._isMaintainedNode.bind(this))?i:i||!t&&this._isSizeNode(n)},_nodeChange_oneLine:function(e,t,n,i,l,o,s,c,d,u,h,g,p){let m=i.parentNode;for(;!(m.nextSibling||m.previousSibling||r.isFormatElement(m.parentNode)||r.isWysiwygDiv(m.parentNode))&&m.nodeName!==t.nodeName;)m=m.parentNode;if(!d&&m===o.parentNode&&m.nodeName===t.nodeName&&r.onlyZeroWidthSpace(i.textContent.slice(0,l))&&r.onlyZeroWidthSpace(o.textContent.slice(s))){const e=m.childNodes;let n=!0;for(let t,l,s,a,c=0,d=e.length;c<d;c++)if(t=e[c],a=!r.onlyZeroWidthSpace(t),t!==i)if(t!==o){if(!l&&a||l&&s&&a){n=!1;break}}else s=!0;else l=!0;if(n)return r.copyTagAttributes(m,t),{startContainer:i,startOffset:l,endContainer:o,endOffset:s}}h.v=!1;const f=e,_=[t],b=e.cloneNode(!1),v=i===o;let y,C,w,x,E,S=i,N=l,T=o,k=s,L=!1,B=!1;const A=a.RegExp;function z(e){const t=new A("(?:;|^|\\s)(?:"+x+"null)\\s*:[^;]*\\s*(?:;|$)","ig");let n="";return t&&e.style.cssText.length>0&&(n=t.test(e.style.cssText)),!n}if(function e(i,l){const o=i.childNodes;for(let i,s=0,a=o.length;s<a;s++){let a=o[s];if(!a)continue;let d,h=l;if(!L&&a===S){let e=b;E=g(a);const o=r.createTextNode(1===S.nodeType?"":S.substringData(0,N)),s=r.createTextNode(1===S.nodeType?"":S.substringData(N,v&&k>=N?k-N:S.data.length-N));if(E){const t=g(l);if(t&&t.parentNode!==e){let n=t,i=null;for(;n.parentNode!==e;){for(l=i=n.parentNode.cloneNode(!1);n.childNodes[0];)i.appendChild(n.childNodes[0]);n.appendChild(i),n=n.parentNode}n.parentNode.appendChild(t)}E=E.cloneNode(!1)}r.onlyZeroWidthSpace(o)||l.appendChild(o);const c=g(l);for(c&&(E=c),E&&(e=E),C=a,y=[],x="";C!==e&&C!==f&&null!==C;)i=p(C)?null:n(C),i&&1===C.nodeType&&z(C)&&(y.push(i),x+=C.style.cssText.substr(0,C.style.cssText.indexOf(":"))+"|"),C=C.parentNode;const d=y.pop()||s;for(w=C=d;y.length>0;)C=y.pop(),w.appendChild(C),w=C;if(t.appendChild(d),e.appendChild(t),E&&!g(T)&&(t=t.cloneNode(!1),b.appendChild(t),_.push(t)),S=s,N=0,L=!0,C!==s&&C.appendChild(S),!v)continue}if(B||a!==T){if(L){if(1===a.nodeType&&!r.isBreak(a)){r._isIgnoreNodeChange(a)?(b.appendChild(a.cloneNode(!0)),u||(t=t.cloneNode(!1),b.appendChild(t),_.push(t))):e(a,a);continue}C=a,y=[],x="";const o=[];for(;null!==C.parentNode&&C!==f&&C!==t;)i=B?C.cloneNode(!1):n(C),1===C.nodeType&&!r.isBreak(a)&&i&&z(C)&&(p(C)?E||o.push(i):y.push(i),x+=C.style.cssText.substr(0,C.style.cssText.indexOf(":"))+"|"),C=C.parentNode;y=y.concat(o);const s=y.pop()||a;for(w=C=s;y.length>0;)C=y.pop(),w.appendChild(C),w=C;if(!p(t.parentNode)||p(s)||r.onlyZeroWidthSpace(t)||(t=t.cloneNode(!1),b.appendChild(t),_.push(t)),B||E||!p(s))s===a?l=B?b:t:B?(b.appendChild(s),l=C):(t.appendChild(s),l=C);else{t=t.cloneNode(!1);const e=s.childNodes;for(let n=0,i=e.length;n<i;n++)t.appendChild(e[n]);s.appendChild(t),b.appendChild(s),_.push(t),l=t.children.length>0?C:t}if(E&&3===a.nodeType)if(g(a)){const e=r.getParentElement(l,function(e){return this._isMaintainedNode(e.parentNode)||e.parentNode===b}.bind(r));E.appendChild(e),t=e.cloneNode(!1),_.push(t),b.appendChild(t)}else E=null}d=a.cloneNode(!1),l.appendChild(d),1!==a.nodeType||r.isBreak(a)||(h=d),e(a,h)}else{E=g(a);const e=r.createTextNode(1===T.nodeType?"":T.substringData(k,T.length-k)),l=r.createTextNode(v||1===T.nodeType?"":T.substringData(0,k));if(E?E=E.cloneNode(!1):p(t.parentNode)&&!E&&(t=t.cloneNode(!1),b.appendChild(t),_.push(t)),!r.onlyZeroWidthSpace(e)){C=a,x="",y=[];const t=[];for(;C!==b&&C!==f&&null!==C;)1===C.nodeType&&z(C)&&(p(C)?t.push(C.cloneNode(!1)):y.push(C.cloneNode(!1)),x+=C.style.cssText.substr(0,C.style.cssText.indexOf(":"))+"|"),C=C.parentNode;for(y=y.concat(t),d=w=C=y.pop()||e;y.length>0;)C=y.pop(),w.appendChild(C),w=C;b.appendChild(d),C.textContent=e.data}if(E&&d){const e=g(d);e&&(E=e)}for(C=a,y=[],x="";C!==b&&C!==f&&null!==C;)i=p(C)?null:n(C),i&&1===C.nodeType&&z(C)&&(y.push(i),x+=C.style.cssText.substr(0,C.style.cssText.indexOf(":"))+"|"),C=C.parentNode;const o=y.pop()||l;for(w=C=o;y.length>0;)C=y.pop(),w.appendChild(C),w=C;E?((t=t.cloneNode(!1)).appendChild(o),E.insertBefore(t,E.firstChild),b.appendChild(E),_.push(t),E=null):t.appendChild(o),T=l,k=l.data.length,B=!0,!c&&u&&(t=l,l.textContent=r.zeroWidthSpace),C!==l&&C.appendChild(T)}}}(e,b),d&&!c&&!h.v)return{ancestor:e,startContainer:i,startOffset:l,endContainer:o,endOffset:s};if(c=c&&d)for(let e=0;e<_.length;e++){let t,n,i,l=_[e];if(u)t=r.createTextNode(r.zeroWidthSpace),b.replaceChild(t,l);else{const e=l.childNodes;for(n=e[0];e[0];)i=e[0],b.insertBefore(i,l);r.removeItem(l)}0===e&&(u?S=T=t:(S=n,T=i))}else{if(d)for(let e=0;e<_.length;e++)this._stripRemoveNode(_[e]);u&&(S=T=t)}r.removeEmptyNode(b,t),u&&(N=S.textContent.length,k=T.textContent.length);const M=c||0===T.textContent.length;r.isBreak(T)||0!==T.textContent.length||(r.removeItem(T),T=S),k=M?T.textContent.length:k;const H={s:0,e:0},I=r.getNodePath(S,b,H),D=!T.parentNode;D&&(T=S);const O={s:0,e:0},F=r.getNodePath(T,b,D||M?null:O);N+=H.s,k=u?N:D?S.textContent.length:M?k+H.s:k+O.s;const R=r.mergeSameTags(b,[I,F],!0);return e.parentNode.replaceChild(b,e),S=r.getNodeFromPath(I,b),T=r.getNodeFromPath(F,b),{ancestor:b,startContainer:S,startOffset:N+R[0],endContainer:T,endOffset:k+R[1]}},_nodeChange_startLine:function(e,t,n,i,l,o,s,a,c,d,u){let h=i.parentNode;for(;!(h.nextSibling||h.previousSibling||r.isFormatElement(h.parentNode)||r.isWysiwygDiv(h.parentNode))&&h.nodeName!==t.nodeName;)h=h.parentNode;if(!s&&h.nodeName===t.nodeName&&!r.isFormatElement(h)&&!h.nextSibling&&r.onlyZeroWidthSpace(i.textContent.slice(0,l))){let n=!0,o=i.previousSibling;for(;o;){if(!r.onlyZeroWidthSpace(o)){n=!1;break}o=o.previousSibling}if(n)return r.copyTagAttributes(h,t),{ancestor:e,container:i,offset:l}}a.v=!1;const g=e,p=[t],m=e.cloneNode(!1);let f,_,b,v,y=i,C=l,w=!1;if(function e(i,l){const o=i.childNodes;for(let i,s,a=0,h=o.length;a<h;a++){const h=o[a];if(!h)continue;let x=l;if(w&&!r.isBreak(h)){if(1===h.nodeType){if(r._isIgnoreNodeChange(h)){if(t=t.cloneNode(!1),s=h.cloneNode(!0),m.appendChild(s),m.appendChild(t),p.push(t),u&&h.contains(u)){const e=r.getNodePath(u,h);u=r.getNodeFromPath(e,s)}}else e(h,h);continue}_=h,f=[];const o=[];for(;null!==_.parentNode&&_!==g&&_!==t;)i=n(_),1===_.nodeType&&i&&(d(_)?v||o.push(i):f.push(i)),_=_.parentNode;f=f.concat(o);const a=f.length>0,y=f.pop()||h;for(b=_=y;f.length>0;)_=f.pop(),b.appendChild(_),b=_;if(d(t.parentNode)&&!d(y)&&(t=t.cloneNode(!1),m.appendChild(t),p.push(t)),!v&&d(y)){t=t.cloneNode(!1);const e=y.childNodes;for(let n=0,i=e.length;n<i;n++)t.appendChild(e[n]);y.appendChild(t),m.appendChild(y),l=d(_)?t:_,p.push(t)}else a?(t.appendChild(y),l=_):l=t;if(v&&3===h.nodeType)if(c(h)){const e=r.getParentElement(l,function(e){return this._isMaintainedNode(e.parentNode)||e.parentNode===m}.bind(r));v.appendChild(e),t=e.cloneNode(!1),p.push(t),m.appendChild(t)}else v=null}if(w||h!==y)i=w?n(h):h.cloneNode(!1),i&&(l.appendChild(i),1!==h.nodeType||r.isBreak(h)||(x=i)),e(h,x);else{let e=m;v=c(h);const o=r.createTextNode(1===y.nodeType?"":y.substringData(0,C)),s=r.createTextNode(1===y.nodeType?"":y.substringData(C,y.length-C));if(v){const t=c(l);if(t&&t.parentNode!==e){let n=t,i=null;for(;n.parentNode!==e;){for(l=i=n.parentNode.cloneNode(!1);n.childNodes[0];)i.appendChild(n.childNodes[0]);n.appendChild(i),n=n.parentNode}n.parentNode.appendChild(t)}v=v.cloneNode(!1)}r.onlyZeroWidthSpace(o)||l.appendChild(o);const a=c(l);for(a&&(v=a),v&&(e=v),_=l,f=[];_!==e&&null!==_;)i=n(_),1===_.nodeType&&i&&f.push(i),_=_.parentNode;const d=f.pop()||l;for(b=_=d;f.length>0;)_=f.pop(),b.appendChild(_),b=_;d!==l?(t.appendChild(d),l=_):l=t,r.isBreak(h)&&t.appendChild(h.cloneNode(!1)),e.appendChild(t),y=s,C=0,w=!0,l.appendChild(y)}}}(e,m),s&&!o&&!a.v)return{ancestor:e,container:i,offset:l,endContainer:u};if(o=o&&s)for(let e=0;e<p.length;e++){let t=p[e];const n=t.childNodes,i=n[0];for(;n[0];)m.insertBefore(n[0],t);r.removeItem(t),0===e&&(y=i)}else if(s){t=t.firstChild;for(let e=0;e<p.length;e++)this._stripRemoveNode(p[e])}if(o||0!==m.childNodes.length){r.removeEmptyNode(m,t),r.onlyZeroWidthSpace(m.textContent)&&(y=m.firstChild,C=0);const n={s:0,e:0},i=r.getNodePath(y,m,n);C+=n.s;const l=r.mergeSameTags(m,[i],!0);e.parentNode.replaceChild(m,e),y=r.getNodeFromPath(i,m),C+=l[0]}else e.childNodes?y=e.childNodes[0]:(y=r.createTextNode(r.zeroWidthSpace),e.appendChild(y));return{ancestor:m,container:y,offset:C,endContainer:u}},_nodeChange_middleLine:function(e,t,n,i,l,o,s){if(!l){let n=null;s&&e.contains(s)&&(n=r.getNodePath(s,e));const i=e.cloneNode(!0),l=t.nodeName,o=t.style.cssText,a=t.className;let c,d=i.childNodes,u=0,h=d.length;for(;u<h&&(c=d[u],3!==c.nodeType);u++){if(c.nodeName!==l){if(!r.isBreak(c)&&r._isIgnoreNodeChange(c))continue;if(1===h){d=c.childNodes,h=d.length,u=-1;continue}break}c.style.cssText+=o,r.addClass(c,a)}if(h>0&&u===h)return e.innerHTML=i.innerHTML,{ancestor:e,endContainer:n?r.getNodeFromPath(n,e):null}}o.v=!1;const a=e.cloneNode(!1),c=[t];let d=!0;if(function e(i,l){const o=i.childNodes;for(let i,u,h=0,g=o.length;h<g;h++){let g=o[h];if(!g)continue;let p=l;if(r.isBreak(g)||!r._isIgnoreNodeChange(g))i=n(g),i&&(d=!1,l.appendChild(i),1===g.nodeType&&(p=i)),r.isBreak(g)||e(g,p);else if(t.childNodes.length>0&&(a.appendChild(t),t=t.cloneNode(!1)),u=g.cloneNode(!0),a.appendChild(u),a.appendChild(t),c.push(t),l=t,s&&g.contains(s)){const e=r.getNodePath(s,g);s=r.getNodeFromPath(e,u)}}}(e,t),d||l&&!i&&!o.v)return{ancestor:e,endContainer:s};if(a.appendChild(t),i&&l)for(let e=0;e<c.length;e++){let t=c[e];const n=t.childNodes;for(;n[0];)a.insertBefore(n[0],t);r.removeItem(t)}else if(l){t=t.firstChild;for(let e=0;e<c.length;e++)this._stripRemoveNode(c[e])}return r.removeEmptyNode(a,t),r.mergeSameTags(a,null,!0),e.parentNode.replaceChild(a,e),{ancestor:a,endContainer:s}},_nodeChange_endLine:function(e,t,n,i,l,o,s,a,c,d){let u=i.parentNode;for(;!(u.nextSibling||u.previousSibling||r.isFormatElement(u.parentNode)||r.isWysiwygDiv(u.parentNode))&&u.nodeName!==t.nodeName;)u=u.parentNode;if(!s&&u.nodeName===t.nodeName&&!r.isFormatElement(u)&&!u.previousSibling&&r.onlyZeroWidthSpace(i.textContent.slice(l))){let n=!0,o=i.nextSibling;for(;o;){if(!r.onlyZeroWidthSpace(o)){n=!1;break}o=o.nextSibling}if(n)return r.copyTagAttributes(u,t),{ancestor:e,container:i,offset:l}}a.v=!1;const h=e,g=[t],p=e.cloneNode(!1);let m,f,_,b,v=i,y=l,C=!1;if(function e(i,l){const o=i.childNodes;for(let i,s=o.length-1;0<=s;s--){const a=o[s];if(!a)continue;let u=l;if(C&&!r.isBreak(a)){if(1===a.nodeType){if(r._isIgnoreNodeChange(a)){t=t.cloneNode(!1);const e=a.cloneNode(!0);p.insertBefore(e,l),p.insertBefore(t,e),g.push(t)}else e(a,a);continue}f=a,m=[];const o=[];for(;null!==f.parentNode&&f!==h&&f!==t;)i=n(f),i&&1===f.nodeType&&(d(f)?b||o.push(i):m.push(i)),f=f.parentNode;m=m.concat(o);const s=m.length>0,u=m.pop()||a;for(_=f=u;m.length>0;)f=m.pop(),_.appendChild(f),_=f;if(d(t.parentNode)&&!d(u)&&(t=t.cloneNode(!1),p.insertBefore(t,p.firstChild),g.push(t)),!b&&d(u)){t=t.cloneNode(!1);const e=u.childNodes;for(let n=0,i=e.length;n<i;n++)t.appendChild(e[n]);u.appendChild(t),p.insertBefore(u,p.firstChild),g.push(t),l=t.children.length>0?f:t}else s?(t.insertBefore(u,t.firstChild),l=f):l=t;if(b&&3===a.nodeType)if(c(a)){const e=r.getParentElement(l,function(e){return this._isMaintainedNode(e.parentNode)||e.parentNode===p}.bind(r));b.appendChild(e),t=e.cloneNode(!1),g.push(t),p.insertBefore(t,p.firstChild)}else b=null}if(C||a!==v)i=C?n(a):a.cloneNode(!1),i&&(l.insertBefore(i,l.firstChild),1!==a.nodeType||r.isBreak(a)||(u=i)),e(a,u);else{b=c(a);const e=r.createTextNode(1===v.nodeType?"":v.substringData(y,v.length-y)),o=r.createTextNode(1===v.nodeType?"":v.substringData(0,y));if(b){b=b.cloneNode(!1);const e=c(l);if(e&&e.parentNode!==p){let t=e,n=null;for(;t.parentNode!==p;){for(l=n=t.parentNode.cloneNode(!1);t.childNodes[0];)n.appendChild(t.childNodes[0]);t.appendChild(n),t=t.parentNode}t.parentNode.insertBefore(e,t.parentNode.firstChild)}b=b.cloneNode(!1)}else d(t.parentNode)&&!b&&(t=t.cloneNode(!1),p.appendChild(t),g.push(t));for(r.onlyZeroWidthSpace(e)||l.insertBefore(e,l.firstChild),f=l,m=[];f!==p&&null!==f;)i=d(f)?null:n(f),i&&1===f.nodeType&&m.push(i),f=f.parentNode;const s=m.pop()||l;for(_=f=s;m.length>0;)f=m.pop(),_.appendChild(f),_=f;s!==l?(t.insertBefore(s,t.firstChild),l=f):l=t,r.isBreak(a)&&t.appendChild(a.cloneNode(!1)),b?(b.insertBefore(t,b.firstChild),p.insertBefore(b,p.firstChild),b=null):p.insertBefore(t,p.firstChild),v=o,y=o.data.length,C=!0,l.insertBefore(v,l.firstChild)}}}(e,p),s&&!o&&!a.v)return{ancestor:e,container:i,offset:l};if(o=o&&s)for(let e=0;e<g.length;e++){let t=g[e];const n=t.childNodes;let i=null;for(;n[0];)i=n[0],p.insertBefore(i,t);r.removeItem(t),e===g.length-1&&(v=i,y=i.textContent.length)}else if(s){t=t.firstChild;for(let e=0;e<g.length;e++)this._stripRemoveNode(g[e])}if(o||0!==p.childNodes.length){if(!s&&0===t.textContent.length)return r.removeEmptyNode(p,null),{ancestor:null,container:null,offset:0};r.removeEmptyNode(p,t),r.onlyZeroWidthSpace(p.textContent)?(v=p.firstChild,y=v.textContent.length):r.onlyZeroWidthSpace(v)&&(v=t,y=1);const n={s:0,e:0},i=r.getNodePath(v,p,n);y+=n.s;const l=r.mergeSameTags(p,[i],!0);e.parentNode.replaceChild(p,e),v=r.getNodeFromPath(i,p),y+=l[0]}else e.childNodes?v=e.childNodes[0]:(v=r.createTextNode(r.zeroWidthSpace),e.appendChild(v));return{ancestor:p,container:v,offset:y}},actionCall:function(t,n,i){if(n){if(/more/i.test(n)&&i!==this._moreLayerActiveButton){const n=e.element.toolbar.querySelector("."+t);return void(n&&(this._moreLayerActiveButton&&(e.element.toolbar.querySelector("."+this._moreLayerActiveButton.getAttribute("data-command")).style.display="none",r.removeClass(this._moreLayerActiveButton,"on")),r.addClass(i,"on"),this._moreLayerActiveButton=i,n.style.display="block",u._showToolbarBalloon(),u._showToolbarInline()))}if(/submenu/.test(n)&&(null===this._menuTray[t]||i!==this.submenuActiveButton))return void this.callPlugin(t,this.submenuOn.bind(this,i),i);if(/dialog/.test(n))return void this.callPlugin(t,this.plugins[t].open.bind(this),i);if(/command/.test(n))this.callPlugin(t,this.plugins[t].action.bind(this),i);else{if(/container/.test(n)&&(null===this._menuTray[t]||i!==this.containerActiveButton))return void this.callPlugin(t,this.containerOn.bind(this,i),i);/fileBrowser/.test(n)&&this.callPlugin(t,this.plugins[t].open.bind(this,null),i)}}else t&&this.commandHandler(i,t);if(/more/i.test(n)){const t=e.element.toolbar.querySelector("."+this._moreLayerActiveButton.getAttribute("data-command"));t&&(r.removeClass(this._moreLayerActiveButton,"on"),this._moreLayerActiveButton=null,t.style.display="none",u._showToolbarBalloon(),u._showToolbarInline())}else/submenu/.test(n)?this.submenuOff():/command/.test(n)||(this.submenuOff(),this.containerOff())},commandHandler:function(t,n){switch(n){case"copy":case"cut":this.execCommand(n);break;case"paste":break;case"selectAll":const i=e.element.wysiwyg;let o=r.getChildElement(i.firstChild,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!1)||i.firstChild,s=r.getChildElement(i.lastChild,(function(e){return 0===e.childNodes.length||3===e.nodeType}),!0)||i.lastChild;if(!o||!s)return;if(r.isMedia(o)){const e=this.getFileComponent(o),t=r.createElement("BR"),n=r.createElement(l.defaultTag);n.appendChild(t),o=e?e.component:o,o.parentNode.insertBefore(n,o),o=t}if(r.isMedia(s)){const e=r.createElement("BR"),t=r.createElement(l.defaultTag);t.appendChild(e),i.appendChild(t),s=e}this.setRange(o,0,s,s.textContent.length);break;case"codeView":this.toggleCodeView();break;case"fullScreen":this.toggleFullScreen(t);break;case"indent":case"outdent":this.indent(n);break;case"undo":this.history.undo();break;case"redo":this.history.redo();break;case"removeFormat":this.removeFormat(),this.focus();break;case"print":this.print();break;case"preview":this.preview();break;case"showBlocks":this.toggleDisplayBlocks();break;case"save":if("function"==typeof l.callBackSave)l.callBackSave(this.getContents(!1));else{if("function"!=typeof h.save)throw Error("[SUNEDITOR.core.commandHandler.fail] Please register call back function in creation option. (callBackSave : Function)");h.save()}e.tool.save&&e.tool.save.setAttribute("disabled",!0);break;default:n=this._defaultCommand[n.toLowerCase()]||n,this.commandMap[n]||(this.commandMap[n]=t);const a=this._variable.currentNodesMap,c=a.indexOf(n)>-1?null:r.createElement(n);let d=n;/^SUB$/i.test(n)&&a.indexOf("SUP")>-1?d="SUP":/^SUP$/i.test(n)&&a.indexOf("SUB")>-1&&(d="SUB"),this.nodeChange(c,null,[d],!1),this.focus()}},removeFormat:function(){this.nodeChange(null,null,null,null)},indent:function(e){const t=this.getRange(),n=this.getSelectedElements(null),i=[],o="indent"!==e,s=l.rtl?"marginRight":"marginLeft";let a=t.startContainer,c=t.endContainer,d=t.startOffset,u=t.endOffset;for(let e,t,l=0,a=n.length;l<a;l++)e=n[l],r.isListCell(e)&&this.plugins.list?(o||e.previousElementSibling)&&i.push(e):(t=/\d+/.test(e.style[s])?r.getNumber(e.style[s],0):0,o?t-=25:t+=25,r.setStyle(e,s,t<=0?"":t+"px"));i.length>0&&this.plugins.list.editInsideList.call(this,o,i),this.effectNode=null,this.setRange(a,d,c,u),this.history.push(!1)},toggleDisplayBlocks:function(){const t=e.element.wysiwyg;r.toggleClass(t,"se-show-block"),r.hasClass(t,"se-show-block")?r.addClass(this._styleCommandMap.showBlocks,"active"):r.removeClass(this._styleCommandMap.showBlocks,"active"),this._resourcesStateChange()},toggleCodeView:function(){const t=this._variable.isCodeView;this.controllersOff(),r.setDisabledButtons(!t,this.codeViewDisabledButtons),t?(this._setCodeDataToEditor(),e.element.wysiwygFrame.scrollTop=0,e.element.code.style.display="none",e.element.wysiwygFrame.style.display="block",this._variable._codeOriginCssText=this._variable._codeOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/,"display: none"),this._variable._wysiwygOriginCssText=this._variable._wysiwygOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/,"display: block"),"auto"!==l.height||l.codeMirrorEditor||(e.element.code.style.height="0px"),this._variable.isCodeView=!1,this._variable.isFullScreen||(this._notHideToolbar=!1,/balloon|balloon-always/i.test(l.mode)&&(e.element._arrow.style.display="",this._isInline=!1,this._isBalloon=!0,u._hideToolbar())),this.nativeFocus(),r.removeClass(this._styleCommandMap.codeView,"active"),this.history.push(!1)):(this._setEditorDataToCodeView(),this._variable._codeOriginCssText=this._variable._codeOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/,"display: block"),this._variable._wysiwygOriginCssText=this._variable._wysiwygOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/,"display: none"),"auto"!==l.height||l.codeMirrorEditor||(e.element.code.style.height=e.element.code.scrollHeight>0?e.element.code.scrollHeight+"px":"auto"),l.codeMirrorEditor&&l.codeMirrorEditor.refresh(),this._variable.isCodeView=!0,this._variable.isFullScreen||(this._notHideToolbar=!0,this._isBalloon&&(e.element._arrow.style.display="none",e.element.toolbar.style.left="",this._isInline=!0,this._isBalloon=!1,u._showToolbarInline())),this._variable._range=null,e.element.code.focus(),r.addClass(this._styleCommandMap.codeView,"active")),this._checkPlaceholder(),"function"==typeof h.toggleCodeView&&h.toggleCodeView(this._variable.isCodeView,this)},_setCodeDataToEditor:function(){const t=this._getCodeView();if(l.fullPage){const e=this._parser.parseFromString(t,"text/html"),n=e.head.children;for(let t=0,i=n.length;t<i;t++)/^script$/i.test(n[t].tagName)&&(e.head.removeChild(n[t]),t--,i--);this._wd.head.innerHTML=e.head.innerHTML,this._wd.body.innerHTML=this.convertContentsForEditor(e.body.innerHTML);const i=e.body.attributes;for(let e=0,t=i.length;e<t;e++)"contenteditable"!==i[e].name&&this._wd.body.setAttribute(i[e].name,i[e].value);if(!r.hasClass(this._wd.body,"sun-editor-editable")){const e=l._editableClass.split(" ");for(let t=0;t<e.length;t++)r.addClass(this._wd.body,l._editableClass[t])}}else e.element.wysiwyg.innerHTML=t.length>0?this.convertContentsForEditor(t):"<"+l.defaultTag+"><br></"+l.defaultTag+">"},_setEditorDataToCodeView:function(){const t=this.convertHTMLForCodeView(e.element.wysiwyg);let n="";if(l.fullPage){const e=r.getAttributesToString(this._wd.body,null);n="<!DOCTYPE html>\n<html>\n"+this._wd.head.outerHTML.replace(/>(?!\n)/g,">\n")+"<body "+e+">\n"+t+"</body>\n</html>"}else n=t;e.element.code.style.display="block",e.element.wysiwygFrame.style.display="none",this._setCodeView(n)},toggleFullScreen:function(t){const n=e.element.topArea,i=e.element.toolbar,o=e.element.editorArea,d=e.element.wysiwygFrame,g=e.element.code,p=this._variable;this.controllersOff(),p.isFullScreen?(p.isFullScreen=!1,d.style.cssText=p._wysiwygOriginCssText,g.style.cssText=p._codeOriginCssText,i.style.cssText="",o.style.cssText=p._editorAreaOriginCssText,n.style.cssText=p._originCssText,s.body.style.overflow=p._bodyOverflow,l.toolbarContainer&&l.toolbarContainer.appendChild(i),l.stickyToolbar>-1&&r.removeClass(i,"se-toolbar-sticky"),p._fullScreenAttrs.sticky&&!l.toolbarContainer&&(p._fullScreenAttrs.sticky=!1,e.element._stickyDummy.style.display="block",r.addClass(i,"se-toolbar-sticky")),this._isInline=p._fullScreenAttrs.inline,this._isBalloon=p._fullScreenAttrs.balloon,this._isInline&&u._showToolbarInline(),l.toolbarContainer&&r.removeClass(i,"se-toolbar-balloon"),u.onScroll_window(),r.changeElement(t.firstElementChild,c.expansion),e.element.topArea.style.marginTop="",r.removeClass(this._styleCommandMap.fullScreen,"active")):(p.isFullScreen=!0,p._fullScreenAttrs.inline=this._isInline,p._fullScreenAttrs.balloon=this._isBalloon,(this._isInline||this._isBalloon)&&(this._isInline=!1,this._isBalloon=!1),l.toolbarContainer&&e.element.relative.insertBefore(i,o),n.style.position="fixed",n.style.top="0",n.style.left="0",n.style.width="100%",n.style.maxWidth="100%",n.style.height="100%",n.style.zIndex="2147483647",""!==e.element._stickyDummy.style.display&&(p._fullScreenAttrs.sticky=!0,e.element._stickyDummy.style.display="none",r.removeClass(i,"se-toolbar-sticky")),p._bodyOverflow=s.body.style.overflow,s.body.style.overflow="hidden",p._editorAreaOriginCssText=o.style.cssText,p._wysiwygOriginCssText=d.style.cssText,p._codeOriginCssText=g.style.cssText,o.style.cssText=i.style.cssText="",d.style.cssText=(d.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/)||[""])[0],g.style.cssText=(g.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/)||[""])[0],i.style.width=d.style.height=g.style.height="100%",i.style.position="relative",i.style.display="block",p.innerHeight_fullScreen=a.innerHeight-i.offsetHeight,o.style.height=p.innerHeight_fullScreen-l.fullScreenOffset+"px",r.changeElement(t.firstElementChild,c.reduction),l.iframe&&"auto"===l.height&&(o.style.overflow="auto",this._iframeAutoHeight()),e.element.topArea.style.marginTop=l.fullScreenOffset+"px",r.addClass(this._styleCommandMap.fullScreen,"active")),"function"==typeof h.toggleFullScreen&&h.toggleFullScreen(this._variable.isFullScreen,this)},print:function(){const e=r.createElement("IFRAME");e.style.display="none",s.body.appendChild(e);const t=r.getIframeDocument(e),n=this.getContents(!0),i=this._wd;if(l.iframe){const e=l.fullPage?r.getAttributesToString(i.body,["contenteditable"]):'class="'+l._editableClass+'"';t.write("<!DOCTYPE html><html><head>"+i.head.innerHTML+"</head><body "+e+">"+n+"</body></html>")}else{const e=s.head.getElementsByTagName("link"),i=s.head.getElementsByTagName("style");let o="";for(let t=0,n=e.length;t<n;t++)o+=e[t].outerHTML;for(let e=0,t=i.length;e<t;e++)o+=i[e].outerHTML;t.write("<!DOCTYPE html><html><head>"+o+'</head><body class="'+l._editableClass+'">'+n+"</body></html>")}this.showLoading(),a.setTimeout((function(){try{if(e.focus(),r.isIE_Edge||s.documentMode||a.StyleMedia)try{e.contentWindow.document.execCommand("print",!1,null)}catch(t){e.contentWindow.print()}else e.contentWindow.print()}catch(e){throw Error("[SUNEDITOR.core.print.fail] error: "+e)}finally{d.closeLoading(),r.removeItem(e)}}),1e3)},preview:function(){d.submenuOff(),d.containerOff(),d.controllersOff();const t=l.previewTemplate?l.previewTemplate.replace(/\{\{\s*contents\s*\}\}/i,this.getContents(!0)):this.getContents(!0),n=a.open("","_blank");n.mimeType="text/html";e.element.wysiwygFrame.offsetWidth;const o=this._wd;if(l.iframe){const e=l.fullPage?r.getAttributesToString(o.body,["contenteditable"]):'class="'+l._editableClass+'"';n.document.write("<!DOCTYPE html><html><head>"+o.head.innerHTML+"<style>body {overflow:auto !important; margin: 10px auto !important; height:auto !important;}</style></head><body "+e+">"+t+"</body></html>")}else{const e=s.head.getElementsByTagName("link"),o=s.head.getElementsByTagName("style");let a="";for(let t=0,n=e.length;t<n;t++)a+=e[t].outerHTML;for(let e=0,t=o.length;e<t;e++)a+=o[e].outerHTML;n.document.write('<!DOCTYPE html><html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>'+i.toolbar.preview+"</title>"+a+'</head><body class="'+l._editableClass+'" style="margin:10px auto !important; height:auto !important;">'+t+"</body></html>")}},setContents:function(t){this.removeRange();const n=null==t?"":this.convertContentsForEditor(t);if(this._resetComponents(),this._variable.isCodeView){const e=this.convertHTMLForCodeView(n);this._setCodeView(e)}else e.element.wysiwyg.innerHTML=n,this.history.push(!1)},setIframeContents:function(e){if(!l.iframe)return!1;e.head&&(this._wd.head.innerHTML=e.head.replace(/<script[\s\S]*>[\s\S]*<\/script>/gi,"")),e.body&&(this._wd.body.innerHTML=this.convertContentsForEditor(e.body))},getContents:function(t){const n=e.element.wysiwyg.innerHTML,i=r.createElement("DIV");i.innerHTML=n;const o=r.getListChildren(i,(function(e){return/FIGCAPTION/i.test(e.nodeName)}));for(let e=0,t=o.length;e<t;e++)o[e].removeAttribute("contenteditable");if(l.fullPage&&!t){const e=r.getAttributesToString(this._wd.body,["contenteditable"]);return"<!DOCTYPE html><html>"+this._wd.head.outerHTML+"<body "+e+">"+i.innerHTML+"</body></html>"}return i.innerHTML},_makeLine:function(e,t){const n=l.defaultTag;if(1===e.nodeType)return r._disallowedTags(e)?"":!t||r.isFormatElement(e)||r.isRangeFormatElement(e)||r.isComponent(e)||r.isMedia(e)||r.isAnchor(e)&&r.isMedia(e.firstElementChild)?e.outerHTML:"<"+n+">"+e.outerHTML+"</"+n+">";if(3===e.nodeType){if(!t)return e.textContent;const i=e.textContent.split(/\n/g);let l="";for(let e,t=0,o=i.length;t<o;t++)e=i[t].trim(),e.length>0&&(l+="<"+n+">"+e+"</"+n+">");return l}return 8===e.nodeType&&this._allowHTMLComments?"\x3c!--"+e.textContent.trim()+"--\x3e":""},_tagConvertor:function(e){if(!this._disallowedTextTagsRegExp)return e;const t=l._textTagsMap;return e.replace(this._disallowedTextTagsRegExp,(function(e,n,i){return n+("string"==typeof t[i]?t[i]:i)}))},_deleteDisallowedTags:function(e){return e.replace(/\n/g,"").replace(/<(script|style)[\s\S]*>[\s\S]*<\/(script|style)>/gi,"").replace(/<[a-z0-9]+\:[a-z0-9]+[^>^\/]*>[^>]*<\/[a-z0-9]+\:[a-z0-9]+>/gi,"").replace(this.editorTagsWhitelistRegExp,"")},cleanHTML:function(e,t){e=this._deleteDisallowedTags(e).replace(/(<[a-zA-Z0-9]+)[^>]*(?=>)/g,function(e,t){if(/^<[a-z0-9]+\:[a-z0-9]+/i.test(e))return e;let n=null;const i=this._attributesTagsWhitelist[t.match(/(?!<)[a-zA-Z0-9]+/)[0].toLowerCase()];if(n=i?e.match(i):e.match(this._attributesWhitelistRegExp),/<span/i.test(t)&&(!n||!/style=/i.test(n.toString()))){const t=e.match(/style\s*=\s*"[^"]*"/);t&&(n||(n=[]),n.push(t[0]))}if(/<a\b/i.test(t)){const t=e.match(/id\s*=\s*"[^"]*"/);t&&(n||(n=[]),n.push(t[0]))}if(n)for(let e=0,i=n.length;e<i;e++)/^class="(?!(__se__|se-|katex))/.test(n[e])||(t+=" "+n[e]);return t}.bind(this));const n=s.createRange().createContextualFragment(e);try{r._consistencyCheckOfHTML(n,this._htmlCheckWhitelistRegExp,l.allowStyles)}catch(e){console.warn("[SUNEDITOR.cleanHTML.consistencyCheck.fail] "+e)}if(this.managedTagsInfo&&this.managedTagsInfo.query){const e=n.querySelectorAll(this.managedTagsInfo.query);for(let t,n,i=0,l=e.length;i<l;i++){n=[].slice.call(e[i].classList);for(let l=0,o=n.length;l<o;l++)if(t=this.managedTagsInfo.map[n[l]],t){t(e[i]);break}}}const i=n.childNodes;let o="",a=!1;for(let e,t=0,n=i.length;t<n;t++)if(e=i[t],1===e.nodeType&&!r.isTextStyleElement(e)&&!r.isBreak(e)&&!r._disallowedTags(e)){a=!0;break}for(let e=0,t=i.length;e<t;e++)o+=this._makeLine(i[e],a);return o=r.htmlRemoveWhiteSpace(o),this._tagConvertor(o?t?o.replace("string"==typeof t?r.createTagsWhitelist(t):t,""):o:e)},convertContentsForEditor:function(e){e=this._deleteDisallowedTags(e).replace(/(<[a-zA-Z0-9]+)[^>]*(?=>)/g,function(e,t){if(/^<[a-z0-9]+\:[a-z0-9]+/i.test(e))return e;let n=null;const i=this._attributesTagsWhitelist[t.match(/(?!<)[a-zA-Z0-9]+/)[0].toLowerCase()];if(n=i?e.match(i):e.match(this._attributesWhitelistRegExp),/<span/i.test(t)&&(!n||!/style=/i.test(n.toString()))){const t=e.match(/style\s*=\s*"[^"]*"/);t&&(n||(n=[]),n.push(t[0]))}if(/<a\b/i.test(t)){const t=e.match(/id\s*=\s*"[^"]*"/);t&&(n||(n=[]),n.push(t[0]))}if(n)for(let e=0,i=n.length;e<i;e++)t+=" "+n[e];return t}.bind(this));const t=s.createRange().createContextualFragment(this._deleteDisallowedTags(e));try{r._consistencyCheckOfHTML(t,this._htmlCheckWhitelistRegExp,l.allowStyles)}catch(e){console.warn("[SUNEDITOR.convertContentsForEditor.consistencyCheck.fail] "+e)}if(this.managedTagsInfo&&this.managedTagsInfo.query){const e=t.querySelectorAll(this.managedTagsInfo.query);for(let t,n,i=0,l=e.length;i<l;i++){n=[].slice.call(e[i].classList);for(let l=0,o=n.length;l<o;l++)if(t=this.managedTagsInfo.map[n[l]],t){t(e[i]);break}}}const n=t.childNodes;let i="";for(let e=0,t=n.length;e<t;e++)i+=this._makeLine(n[e],!0);return 0===i.length?"<"+l.defaultTag+"><br></"+l.defaultTag+">":(i=r.htmlRemoveWhiteSpace(i),this._tagConvertor(i))},convertHTMLForCodeView:function(e){let t="";const n=a.RegExp,i=new n("^(BLOCKQUOTE|PRE|TABLE|THEAD|TBODY|TR|TH|TD|OL|UL|IMG|IFRAME|VIDEO|AUDIO|FIGURE|FIGCAPTION|HR|BR|CANVAS|SELECT)$","i"),l=r.isFormatElement.bind(r),o="string"==typeof e?s.createRange().createContextualFragment(e):e;let c=1*this._variable.codeIndent;return c=c>0?new a.Array(c+1).join(" "):"",function e(o,s,a){const d=o.childNodes,u=i.test(o.nodeName),h=u?s:"";for(let g,p,m,f=0,_=d.length;f<_;f++){if(g=d[f],m=i.test(g.nodeName),p=m?"\n":"",a=!l(g)||u||/^(TH|TD)$/i.test(o.nodeName)?"":"\n",8===g.nodeType){t+="\n\x3c!-- "+g.textContent.trim()+" --\x3e"+p;continue}if(3===g.nodeType){t+=r._HTMLConvertor(/^\n+$/.test(g.data)?"":g.data);continue}if(0===g.childNodes.length){t+=(/^HR$/i.test(g.nodeName)?"\n":"")+h+g.outerHTML+p;continue}g.innerHTML=g.innerHTML;const _=g.nodeName.toLowerCase();t+=(a||(u?"":p))+(h||m?s:"")+g.outerHTML.match(n("<"+_+"[^>]*>","i"))[0]+p,e(g,s+c,""),t+=(m?s:"")+"</"+_+">"+(a||p||u||/^(TH|TD)$/i.test(g.nodeName)?"\n":"")}}(o,"","\n"),t.trim()+"\n"},addDocEvent:function(e,t,n){s.addEventListener(e,t,n),l.iframe&&this._wd.addEventListener(e,t)},removeDocEvent:function(e,t){s.removeEventListener(e,t),l.iframe&&this._wd.removeEventListener(e,t)},_charCount:function(e){const t=l.maxCharCount,n=l.charCounterType;let i=0;if(e&&(i=this.getCharLength(e,n)),this._setCharCount(),t>0){let e=!1;const l=h.getCharCount(n);if(l>t){if(e=!0,i>0){this._editorRange();const e=this.getRange(),n=e.endOffset-1,i=this.getSelectionNode().textContent,o=e.endOffset-(l-t);this.getSelectionNode().textContent=i.slice(0,o<0?0:o)+i.slice(e.endOffset,i.length),this.setRange(e.endContainer,n,e.endContainer,n)}}else l+i>t&&(e=!0);if(e&&(this._callCounterBlink(),i>0))return!1}return!0},checkCharCount:function(e,t){if(l.maxCharCount){const n=t||l.charCounterType,i=this.getCharLength("string"==typeof e?e:this._charTypeHTML?e.outerHTML:e.textContent,n);if(i>0&&i+h.getCharCount(n)>l.maxCharCount)return this._callCounterBlink(),!1}return!0},getCharLength:function(e,t){return/byte/.test(t)?r.getByteLength(e):e.length},_setCharCount:function(){e.element.charCounter&&a.setTimeout((function(){e.element.charCounter.textContent=h.getCharCount(l.charCounterType)}))},_callCounterBlink:function(){const t=e.element.charWrapper;t&&!r.hasClass(t,"se-blink")&&(r.addClass(t,"se-blink"),a.setTimeout((function(){r.removeClass(t,"se-blink")}),600))},_checkComponents:function(){for(let e=0,t=this._fileInfoPluginsCheck.length;e<t;e++)this._fileInfoPluginsCheck[e]()},_resetComponents:function(){for(let e=0,t=this._fileInfoPluginsReset.length;e<t;e++)this._fileInfoPluginsReset[e]()},_setCodeView:function(t){l.codeMirrorEditor?l.codeMirrorEditor.getDoc().setValue(t):e.element.code.value=t},_getCodeView:function(){return l.codeMirrorEditor?l.codeMirrorEditor.getDoc().getValue():e.element.code.value},_init:function(i,o){const c=a.RegExp;if(this._ww=l.iframe?e.element.wysiwygFrame.contentWindow:a,this._wd=s,this._charTypeHTML="byte-html"===l.charCounterType,!l.iframe&&"function"==typeof a.ShadowRoot){let t=e.element.wysiwygFrame;for(;t;){if(t.shadowRoot){this._shadowRoot=t.shadowRoot;break}if(t instanceof a.ShadowRoot){this._shadowRoot=t;break}t=t.parentNode}}const d=a.Object.keys(l._textTagsMap),u=l.addTagsWhitelist?l.addTagsWhitelist.split("|").filter((function(e){return/b|i|ins|s|strike/i.test(e)})):[];for(let e=0;e<u.length;e++)d.splice(d.indexOf(u[e].toLowerCase()),1);this._disallowedTextTagsRegExp=0===d.length?null:new c("(<\\/?)("+d.join("|")+")\\b\\s*(?:[^>^<]+)?\\s*(?=>)","gi");const h="contenteditable|colspan|rowspan|target|href|src|class|type|controls|data-format|data-size|data-file-size|data-file-name|data-origin|data-align|data-image-link|data-rotate|data-proportion|data-percentage|origin-size|data-exp|data-font-size";this._allowHTMLComments=l._editorTagsWhitelist.indexOf("//")>-1,this._htmlCheckWhitelistRegExp=new c("^("+l._editorTagsWhitelist.replace("|//","")+")$","i"),this.editorTagsWhitelistRegExp=r.createTagsWhitelist(l._editorTagsWhitelist.replace("|//","|\x3c!--|--\x3e")),this.pasteTagsWhitelistRegExp=r.createTagsWhitelist(l.pasteTagsWhitelist);const g=l.attributesWhitelist,p={};let m="";if(g)for(let e in g)r.hasOwn(g,e)&&("all"===e?m=g[e]+"|":p[e]=new c("((?:"+g[e]+"|"+h+')s*=s*"[^"]*")',"ig"));this._attributesWhitelistRegExp=new c("((?:"+m+h+')s*=s*"[^"]*")',"ig"),this._attributesTagsWhitelist=p,this._isInline=/inline/i.test(l.mode),this._isBalloon=/balloon|balloon-always/i.test(l.mode),this._isBalloonAlways=/balloon-always/i.test(l.mode),this._cachingButtons(),this._fileInfoPluginsCheck=[],this._fileInfoPluginsReset=[],this.managedTagsInfo={query:"",map:{}};const f=[];this.activePlugins=[],this._fileManager.tags=[],this._fileManager.pluginMap={};let _,b,v=[];for(let e in n)if(r.hasOwn(n,e)){if(_=n[e],b=t[e],_.active&&b&&this.callPlugin(e,null,b),"function"==typeof _.checkFileInfo&&"function"==typeof _.resetFileInfo&&(this.callPlugin(e,null,b),this._fileInfoPluginsCheck.push(_.checkFileInfo.bind(this)),this._fileInfoPluginsReset.push(_.resetFileInfo.bind(this))),a.Array.isArray(_.fileTags)){const t=_.fileTags;this.callPlugin(e,null,b),this._fileManager.tags=this._fileManager.tags.concat(t),v.push(e);for(let n=0,i=t.length;n<i;n++)this._fileManager.pluginMap[t[n].toLowerCase()]=e}if(_.managedTags){const e=_.managedTags();f.push("."+e.className),this.managedTagsInfo.map[e.className]=e.method.bind(this)}}this.managedTagsInfo.query=f.toString(),this._fileManager.queryString=this._fileManager.tags.join(","),this._fileManager.regExp=new c("^("+this._fileManager.tags.join("|")+")$","i"),this._fileManager.pluginRegExp=new c("^("+(0===v.length?"undefined":v.join("|"))+")$","i"),this._variable._originCssText=e.element.topArea.style.cssText,this._placeholder=e.element.placeholder,this._lineBreaker=e.element.lineBreaker,this._lineBreakerButton=this._lineBreaker.querySelector("button"),this.history=function(e,t){const n=e._w,i=e.util,l=e.options.historyStackDelayTime;let o=e.context.element,s=e.context.tool.undo,a=e.context.tool.redo,r=null,c=0,d=[];function u(){const n=d[c];o.wysiwyg.innerHTML=n.contents,e.setRange(i.getNodeFromPath(n.s.path,o.wysiwyg),n.s.offset,i.getNodeFromPath(n.e.path,o.wysiwyg),n.e.offset),e.focus(),0===c?(s&&s.setAttribute("disabled",!0),a&&a.removeAttribute("disabled")):c===d.length-1?(s&&s.removeAttribute("disabled"),a&&a.setAttribute("disabled",!0)):(s&&s.removeAttribute("disabled"),a&&a.removeAttribute("disabled")),e.controllersOff(),e._checkComponents(),e._setCharCount(),e._resourcesStateChange(),t()}function h(){e._checkComponents();const n=e.getContents(!0);if(!n||d[c]&&n===d[c].contents)return;c++;const l=e._variable._range;d.length>c&&(d=d.slice(0,c),a&&a.setAttribute("disabled",!0)),d[c]=l?{contents:n,s:{path:i.getNodePath(l.startContainer,null,null),offset:l.startOffset},e:{path:i.getNodePath(l.endContainer,null,null),offset:l.endOffset}}:{contents:n,s:{path:[0,0],offset:[0,0]},e:{path:0,offset:0}},1===c&&s&&s.removeAttribute("disabled"),e._setCharCount(),t()}return{stack:d,push:function(t){n.setTimeout(e._resourcesStateChange.bind(e));const i="number"==typeof t?t>0?t:0:t?l:0;i&&!r||(n.clearTimeout(r),i)?r=n.setTimeout((function(){n.clearTimeout(r),r=null,h()}),i):h()},undo:function(){c>0&&(c--,u())},redo:function(){d.length-1>c&&(c++,u())},go:function(e){c=e<0?d.length-1:e,u()},reset:function(n){s&&s.setAttribute("disabled",!0),a&&a.setAttribute("disabled",!0),e.context.tool.save&&e.context.tool.save.setAttribute("disabled",!0),d.splice(0),c=0,d[c]={contents:e.getContents(!0),s:{path:[0,0],offset:0},e:{path:[0,0],offset:0}},n||t()},_resetCachingButton:function(){o=e.context.element,s=e.context.tool.undo,a=e.context.tool.redo,0===c?(s&&s.setAttribute("disabled",!0),a&&c===d.length-1&&a.setAttribute("disabled",!0),e.context.tool.save&&e.context.tool.save.setAttribute("disabled",!0)):c===d.length-1&&a&&a.setAttribute("disabled",!0)},_destroy:function(){r&&n.clearTimeout(r),d=null}}}(this,this._onChange_historyStack.bind(this)),this.addModule([B]),l.iframe&&(this._wd=e.element.wysiwygFrame.contentDocument,e.element.wysiwyg=this._wd.body,l._editorStyles.editor&&(e.element.wysiwyg.style.cssText=l._editorStyles.editor),"auto"===l.height&&(this._iframeAuto=this._wd.body)),this._initWysiwygArea(i,o)},_cachingButtons:function(){this.codeViewDisabledButtons=e.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-code-view-enabled"])'),this.resizingDisabledButtons=e.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-resizing-enabled"])');const t=e.tool;this.commandMap={SUB:t.subscript,SUP:t.superscript,OUTDENT:t.outdent,INDENT:t.indent},this.commandMap[l.textTags.bold.toUpperCase()]=t.bold,this.commandMap[l.textTags.underline.toUpperCase()]=t.underline,this.commandMap[l.textTags.italic.toUpperCase()]=t.italic,this.commandMap[l.textTags.strike.toUpperCase()]=t.strike,this._styleCommandMap={fullScreen:t.fullScreen,showBlocks:t.showBlocks,codeView:t.codeView}},_initWysiwygArea:function(t,n){e.element.wysiwyg.innerHTML=t?n:this.convertContentsForEditor("string"==typeof n?n:e.element.originElement.value)},_resourcesStateChange:function(){this._iframeAutoHeight(),this._checkPlaceholder()},_onChange_historyStack:function(){u._applyTagEffects(),e.tool.save&&e.tool.save.removeAttribute("disabled"),h.onChange&&h.onChange(this.getContents(!0),this)},_iframeAutoHeight:function(){this._iframeAuto&&a.setTimeout((function(){e.element.wysiwygFrame.style.height=d._iframeAuto.offsetHeight+"px"}))},_checkPlaceholder:function(){if(this._placeholder){if(this._variable.isCodeView)return void(this._placeholder.style.display="none");const t=e.element.wysiwyg;!r.onlyZeroWidthSpace(t.textContent)||t.querySelector(".se-component, pre, blockquote, hr, li, table, img, iframe, video")||(t.innerText.match(/\n/g)||"").length>1?this._placeholder.style.display="none":this._placeholder.style.display="block"}},_setDefaultFormat:function(e){if(this._fileManager.pluginRegExp.test(this.currentControllerName))return;const t=this.getRange(),n=t.commonAncestorContainer,i=t.startContainer,o=r.getRangeFormatElement(n,null);let s,a,c;const d=r.getParentElement(n,r.isComponent);if((!d||r.isTable(d))&&(!r.isRangeFormatElement(i)&&!r.isWysiwygDiv(i)||!r.isComponent(i.childNodes[t.startOffset]))){if(o)return c=r.createElement(e||l.defaultTag),c.innerHTML=o.innerHTML,0===c.childNodes.length&&(c.innerHTML=r.zeroWidthSpace),o.innerHTML=c.outerHTML,c=o.firstChild,s=r.getEdgeChildNodes(c,null).sc,s||(s=r.createTextNode(r.zeroWidthSpace),c.insertBefore(s,c.firstChild)),a=s.textContent.length,void this.setRange(s,a,s,a);if(r.isRangeFormatElement(n)&&n.childNodes.length<=1){let e=null;return 1===n.childNodes.length&&r.isBreak(n.firstChild)?e=n.firstChild:(e=r.createTextNode(r.zeroWidthSpace),n.appendChild(e)),void this.setRange(e,1,e,1)}if(this.execCommand("formatBlock",!1,e||l.defaultTag),s=r.getEdgeChildNodes(n,n),s=s?s.ec:n,c=r.getFormatElement(s,null),!c)return this.removeRange(),void this._editorRange();if(r.isBreak(c.nextSibling)&&r.removeItem(c.nextSibling),r.isBreak(c.previousSibling)&&r.removeItem(c.previousSibling),r.isBreak(s)){const e=r.createTextNode(r.zeroWidthSpace);s.parentNode.insertBefore(e,s),s=e}this.effectNode=null,this.nativeFocus()}},_setOptionsInit:function(t,n){this.context=e=L(t.originElement,this._getConstructed(t),l),this._componentsInfoReset=!0,this._editorInit(!0,n)},_editorInit:function(t,n){this._init(t,n),u._addEvent(),this._setCharCount(),u._offStickyToolbar(),u.onResize_window(),e.element.toolbar.style.visibility="",this._checkComponents(),this._componentsInfoInit=!1,this._componentsInfoReset=!1,this.history.reset(!0),this._resourcesStateChange(),a.setTimeout((function(){"function"==typeof h.onload&&h.onload(d,t)}))},_getConstructed:function(e){return{_top:e.topArea,_relative:e.relative,_toolBar:e.toolbar,_menuTray:e._menuTray,_editorArea:e.editorArea,_wysiwygArea:e.wysiwygFrame,_codeArea:e.code,_placeholder:e.placeholder,_resizingBar:e.resizingBar,_navigation:e.navigation,_charCounter:e.charCounter,_charWrapper:e.charWrapper,_loading:e.loading,_lineBreaker:e.lineBreaker,_lineBreaker_t:e.lineBreaker_t,_lineBreaker_b:e.lineBreaker_b,_resizeBack:e.resizeBackground,_stickyDummy:e._stickyDummy,_arrow:e._arrow}}},u={_IEisComposing:!1,_lineBreakerBind:null,_responsiveCurrentSize:"default",_responsiveButtonSize:null,_responsiveButtons:null,_directionKeyCode:new a.RegExp("^(8|13|3[2-9]|40|46)$"),_nonTextKeyCode:new a.RegExp("^(8|13|1[6-9]|20|27|3[3-9]|40|45|46|11[2-9]|12[0-3]|144|145)$"),_historyIgnoreKeyCode:new a.RegExp("^(1[6-9]|20|27|3[3-9]|40|45|11[2-9]|12[0-3]|144|145)$"),_onButtonsCheck:new a.RegExp("^("+a.Object.keys(l._textTagsMap).join("|")+")$","i"),_frontZeroWidthReg:new a.RegExp(r.zeroWidthSpace+"+",""),_keyCodeShortcut:{65:"A",66:"B",83:"S",85:"U",73:"I",89:"Y",90:"Z",219:"[",221:"]"},_shortcutCommand:function(e,t){let n=null;switch(u._keyCodeShortcut[e]){case"A":n="selectAll";break;case"B":-1===l.shortcutsDisable.indexOf("bold")&&(n="bold");break;case"S":t&&-1===l.shortcutsDisable.indexOf("strike")?n="strike":t||-1!==l.shortcutsDisable.indexOf("save")||(n="save");break;case"U":-1===l.shortcutsDisable.indexOf("underline")&&(n="underline");break;case"I":-1===l.shortcutsDisable.indexOf("italic")&&(n="italic");break;case"Z":-1===l.shortcutsDisable.indexOf("undo")&&(n=t?"redo":"undo");break;case"Y":-1===l.shortcutsDisable.indexOf("undo")&&(n="redo");break;case"[":-1===l.shortcutsDisable.indexOf("indent")&&(n=l.rtl?"indent":"outdent");break;case"]":-1===l.shortcutsDisable.indexOf("indent")&&(n=l.rtl?"outdent":"indent")}return!!n&&(d.commandHandler(d.commandMap[n],n),!0)},_applyTagEffects:function(){let t=d.getSelectionNode();if(t===d.effectNode)return;d.effectNode=t;const i=l.rtl?"marginRight":"marginLeft",o=d.commandMap,s=this._onButtonsCheck,a=[],c=[],u=d.activePlugins,h=u.length;let g="";for(;t.firstChild;)t=t.firstChild;for(let e=t;!r.isWysiwygDiv(e)&&e;e=e.parentNode)if(1===e.nodeType&&!r.isBreak(e)){g=e.nodeName.toUpperCase(),c.push(g);for(let t,i=0;i<h;i++)t=u[i],-1===a.indexOf(t)&&n[t].active.call(d,e)&&a.push(t);r.isFormatElement(e)?(-1===a.indexOf("OUTDENT")&&o.OUTDENT&&(r.isListCell(e)||e.style[i]&&r.getNumber(e.style[i],0)>0)&&(a.push("OUTDENT"),o.OUTDENT.removeAttribute("disabled")),-1===a.indexOf("INDENT")&&o.INDENT&&r.isListCell(e)&&!e.previousElementSibling&&(a.push("INDENT"),o.INDENT.setAttribute("disabled",!0))):s.test(g)&&(a.push(g),r.addClass(o[g],"active"))}for(let e in o)a.indexOf(e)>-1||!r.hasOwn(o,e)||(u.indexOf(e)>-1?n[e].active.call(d,null):o.OUTDENT&&/^OUTDENT$/i.test(e)?o.OUTDENT.setAttribute("disabled",!0):o.INDENT&&/^INDENT$/i.test(e)?o.INDENT.removeAttribute("disabled"):r.removeClass(o[e],"active"));d._variable.currentNodes=c.reverse(),d._variable.currentNodesMap=a,l.showPathLabel&&(e.element.navigation.textContent=d._variable.currentNodes.join(" > "))},_cancelCaptionEdit:function(){this.setAttribute("contenteditable",!1),this.removeEventListener("blur",u._cancelCaptionEdit)},_buttonsEventHandler:function(e){let t=e.target;if(d._bindControllersOff&&e.stopPropagation(),/^(input|textarea|select|option)$/i.test(t.nodeName)?d._antiBlur=!1:e.preventDefault(),r.getParentElement(t,".se-submenu"))e.stopPropagation(),d._notHideToolbar=!0;else{let n=t.getAttribute("data-command"),i=t.className;for(;!n&&!/se-menu-list/.test(i)&&!/sun-editor-common/.test(i);)t=t.parentNode,n=t.getAttribute("data-command"),i=t.className;n!==d._submenuName&&n!==d._containerName||e.stopPropagation()}},onClick_toolbar:function(e){let t=e.target,n=t.getAttribute("data-display"),i=t.getAttribute("data-command"),l=t.className;for(;t.parentNode&&!i&&!/se-menu-list/.test(l)&&!/se-toolbar/.test(l);)t=t.parentNode,i=t.getAttribute("data-command"),n=t.getAttribute("data-display"),l=t.className;(i||n)&&(t.disabled||(d.hasFocus||d.nativeFocus(),d._variable.isCodeView||d._editorRange(),d.actionCall(i,n,t)))},onMouseDown_wysiwyg:function(t){if(r.isNonEditable(e.element.wysiwyg))return;const n=r.getParentElement(t.target,r.isCell);if(n){const e=d.plugins.table;e&&n!==e._fixedCell&&!e._shift&&d.callPlugin("table",(function(){e.onTableCellMultiSelect.call(d,n,!1)}),null)}d._isBalloon&&u._hideToolbar(),/FIGURE/i.test(t.target.nodeName)&&t.preventDefault(),"function"==typeof h.onMouseDown&&h.onMouseDown(t,d)},onClick_wysiwyg:function(t){const n=t.target;if(r.isNonEditable(e.element.wysiwyg))return;const i=d.getFileComponent(n);if(i)return t.preventDefault(),void d.selectComponent(i.target,i.pluginName);const o=r.getParentElement(n,"FIGCAPTION");if(r.isNonEditable(o)&&(t.preventDefault(),o.setAttribute("contenteditable",!0),o.focus(),d._isInline&&!d._inlineToolbarAttr.isShow)){u._showToolbarInline();const e=function(){u._hideToolbar(),o.removeEventListener("blur",e)};o.addEventListener("blur",e)}a.setTimeout(d._editorRange.bind(d)),d._editorRange();const s=d.getSelectionNode(),c=r.getFormatElement(s,null),g=r.getRangeFormatElement(s,null);if(c&&c!==g||r.isNonEditable(n)||r.isList(g))u._applyTagEffects();else{const e=d.getRange();if(r.getFormatElement(e.startContainer)===r.getFormatElement(e.endContainer)){if(r.isList(g)){const e=r.createElement("LI"),t=s.nextElementSibling;e.appendChild(s),g.insertBefore(e,t)}else r.isWysiwygDiv(s)||r.isComponent(s)||r.isTable(s)&&!r.isCell(s)||d._setDefaultFormat(r.isRangeFormatElement(g)?"DIV":l.defaultTag);t.preventDefault(),d.focus()}}d._isBalloon&&a.setTimeout(u._toggleToolbarBalloon),"function"==typeof h.onClick&&h.onClick(t,d)},_balloonDelay:null,_showToolbarBalloonDelay:function(){u._balloonDelay&&a.clearTimeout(u._balloonDelay),u._balloonDelay=a.setTimeout(function(){a.clearTimeout(this._balloonDelay),this._balloonDelay=null,this._showToolbarBalloon()}.bind(u),350)},_toggleToolbarBalloon:function(){d._editorRange();const e=d.getRange();d._bindControllersOff||!d._isBalloonAlways&&e.collapsed?u._hideToolbar():u._showToolbarBalloon(e)},_showToolbarBalloon:function(t){if(!d._isBalloon)return;const n=t||d.getRange(),i=e.element.toolbar,o=e.element.topArea,s=d.getSelection();let c;if(d._isBalloonAlways&&n.collapsed)c=!0;else if(s.focusNode===s.anchorNode)c=s.focusOffset<s.anchorOffset;else{const e=r.getListChildNodes(n.commonAncestorContainer,null);c=r.getArrayIndex(e,s.focusNode)<r.getArrayIndex(e,s.anchorNode)}let h=n.getClientRects();h=h[c?0:h.length-1];let g=0,p=0,m=o;for(;m;)g+=m.scrollLeft,p+=m.scrollTop,m=m.parentElement;const f=o.offsetWidth,_=u._getEditorOffsets(null),b=_.top,v=_.left;if(i.style.top="-10000px",i.style.visibility="hidden",i.style.display="block",!h){const t=d.getSelectionNode();if(r.isFormatElement(t)){const e=r.createTextNode(r.zeroWidthSpace);d.insertNode(e,null,!1),d.setRange(e,1,e,1),d._editorRange(),h=d.getRange().getClientRects(),h=h[c?0:h.length-1]}if(!h){const n=r.getOffset(t,e.element.wysiwygFrame);h={left:n.left,top:n.top,right:n.left,bottom:n.top+t.offsetHeight,noText:!0},g=0,p=0}c=!0}const y=a.Math.round(e.element._arrow.offsetWidth/2),C=i.offsetWidth,w=i.offsetHeight,x=/iframe/i.test(e.element.wysiwygFrame.nodeName)?e.element.wysiwygFrame.getClientRects()[0]:null;if(x&&(h={left:h.left+x.left,top:h.top+x.top,right:h.right+x.right-x.width,bottom:h.bottom+x.bottom-x.height}),u._setToolbarOffset(c,h,i,v,f,g,p,b,y),C===i.offsetWidth&&w===i.offsetHeight||u._setToolbarOffset(c,h,i,v,f,g,p,b,y),l.toolbarContainer){const e=o.parentElement;let t=l.toolbarContainer,n=t.offsetLeft,s=t.offsetTop;for(;!t.parentElement.contains(e)||!/^(BODY|HTML)$/i.test(t.parentElement.nodeName);)t=t.offsetParent,n+=t.offsetLeft,s+=t.offsetTop;i.style.left=i.offsetLeft-n+o.offsetLeft+"px",i.style.top=i.offsetTop-s+o.offsetTop+"px"}i.style.visibility=""},_setToolbarOffset:function(t,n,i,l,o,c,d,h,g){const p=i.offsetWidth,m=n.noText&&!t?0:i.offsetHeight,f=(t?n.left:n.right)-l-p/2+c,_=f+p-o;let b=(t?n.top-m-g:n.bottom+g)-(n.noText?0:h)+d,v=f<0?1:_<0?f:f-_-1-1,y=!1;const C=b+(t?u._getEditorOffsets(null).top:i.offsetHeight-e.element.wysiwyg.offsetHeight);!t&&C>0&&u._getPageBottomSpace()<C?(t=!0,y=!0):t&&s.documentElement.offsetTop>C&&(t=!1,y=!0),y&&(b=(t?n.top-m-g:n.bottom+g)-(n.noText?0:h)+d),i.style.left=a.Math.floor(v)+"px",i.style.top=a.Math.floor(b)+"px",t?(r.removeClass(e.element._arrow,"se-arrow-up"),r.addClass(e.element._arrow,"se-arrow-down"),e.element._arrow.style.top=m+"px"):(r.removeClass(e.element._arrow,"se-arrow-down"),r.addClass(e.element._arrow,"se-arrow-up"),e.element._arrow.style.top=-g+"px");const w=a.Math.floor(p/2+(f-v));e.element._arrow.style.left=(w+g>i.offsetWidth?i.offsetWidth-g:w<g?g:w)+"px"},_showToolbarInline:function(){if(!d._isInline)return;const t=e.element.toolbar;l.toolbarContainer?t.style.position="relative":t.style.position="absolute",t.style.visibility="hidden",t.style.display="block",d._inlineToolbarAttr.width=t.style.width=l.toolbarWidth,d._inlineToolbarAttr.top=t.style.top=(l.toolbarContainer?0:-1-t.offsetHeight)+"px","function"==typeof h.showInline&&h.showInline(t,e,d),u.onScroll_window(),d._inlineToolbarAttr.isShow=!0,t.style.visibility=""},_hideToolbar:function(){d._notHideToolbar||d._variable.isFullScreen||(e.element.toolbar.style.display="none",d._inlineToolbarAttr.isShow=!1)},onInput_wysiwyg:function(e){d._editorRange();const t=(null===e.data?"":void 0===e.data?" ":e.data)||"";d._charCount(t)||(e.preventDefault(),e.stopPropagation()),d.history.push(!0),"function"==typeof h.onInput&&h.onInput(e,d)},_isUneditableNode:function(e,t){const n=t?e.startContainer:e.endContainer,i=t?e.startOffset:e.endOffset,l=t?"previousSibling":"nextSibling";let o;return 1===n.nodeType?(o=u._isUneditableNode_getSibling(n.childNodes[i],l,n),o&&1===o.nodeType&&"false"===o.getAttribute("contenteditable")):(o=u._isUneditableNode_getSibling(n,l,n),d.isEdgePoint(n,i,t?"front":"end")&&o&&1===o.nodeType&&"false"===o.getAttribute("contenteditable"))},_isUneditableNode_getSibling:function(e,t,n){if(!e)return null;let i=e[t];if(!i){if(i=r.getFormatElement(n),i=i?i[t]:null,!i||r.isComponent(i))return null;i="previousSibling"===t?i.firstElementChild:i.lastElementChild}return i},_onShortcutKey:!1,onKeyDown_wysiwyg:function(t){const n=t.keyCode,i=t.shiftKey,o=t.ctrlKey||t.metaKey||91===n||92===n||224===n,s=t.altKey;if(u._IEisComposing=229===n,d.submenuOff(),d._isBalloon&&u._hideToolbar(),o&&u._shortcutCommand(n,i))return u._onShortcutKey=!0,t.preventDefault(),t.stopPropagation(),!1;u._onShortcutKey&&(u._onShortcutKey=!1);let c=d.getSelectionNode();const g=d.getRange(),p=!g.collapsed||g.startContainer!==g.endContainer,m=d._fileManager.pluginRegExp.test(d.currentControllerName)?d.currentControllerName:"";let f=r.getFormatElement(c,null)||c,_=r.getRangeFormatElement(f,null);switch(n){case 8:if(!p&&m){t.preventDefault(),t.stopPropagation(),d.plugins[m].destroy.call(d);break}if(p&&u._hardDelete()){t.preventDefault(),t.stopPropagation();break}if(!r.isFormatElement(f)&&!e.element.wysiwyg.firstElementChild&&!r.isComponent(c))return t.preventDefault(),t.stopPropagation(),d._setDefaultFormat(l.defaultTag),!1;if(!p&&!f.previousElementSibling&&0===g.startOffset&&!c.previousSibling&&!r.isListCell(f)&&r.isFormatElement(f)&&(!r.isFreeFormatElement(f)||r.isClosureFreeFormatElement(f))){if(r.isClosureRangeFormatElement(f.parentNode))return t.preventDefault(),t.stopPropagation(),!1;if(r.isWysiwygDiv(f.parentNode)&&f.childNodes.length<=1&&(!f.firstChild||r.onlyZeroWidthSpace(f.textContent))){if(t.preventDefault(),t.stopPropagation(),f.nodeName.toUpperCase()===l.defaultTag.toUpperCase()){f.innerHTML="<br>";const e=f.attributes;for(;e[0];)f.removeAttribute(e[0].name)}else{const e=r.createElement(l.defaultTag);e.innerHTML="<br>",f.parentElement.replaceChild(e,f)}return d.nativeFocus(),!1}}if(f&&g.startContainer===g.endContainer&&3===c.nodeType&&!r.isFormatElement(c.parentNode)&&(g.collapsed?1===c.textContent.length:g.endOffset-g.startOffset===c.textContent.length)){t.preventDefault();let e=null,n=c.parentNode.previousSibling;const i=c.parentNode.nextSibling;n||(i?(n=i,e=0):(n=r.createElement("BR"),f.appendChild(n))),c.textContent="",r.removeItemAllParents(c,null,f),e="number"==typeof e?e:3===n.nodeType?n.textContent.length:1,d.setRange(n,e,n,e);break}if(u._isUneditableNode(g,!0)){t.preventDefault(),t.stopPropagation();break}const n=g.commonAncestorContainer;if(f=r.getFormatElement(g.startContainer,null),_=r.getRangeFormatElement(f,null),_&&f&&!r.isCell(_)&&!/^FIGCAPTION$/i.test(_.nodeName)){if(r.isListCell(f)&&r.isList(_)&&(r.isListCell(_.parentNode)||f.previousElementSibling)&&(c===f||3===c.nodeType&&(!c.previousSibling||r.isList(c.previousSibling)))&&(r.getFormatElement(g.startContainer,null)!==r.getFormatElement(g.endContainer,null)?_.contains(g.startContainer):0===g.startOffset&&g.collapsed)){if(g.startContainer!==g.endContainer)t.preventDefault(),d.removeNode(),3===g.startContainer.nodeType&&d.setRange(g.startContainer,g.startContainer.textContent.length,g.startContainer,g.startContainer.textContent.length),d.history.push(!0);else{let e=f.previousElementSibling||_.parentNode;if(r.isListCell(e)){t.preventDefault();let n=e;if(!e.contains(f)&&r.isListCell(n)&&r.isList(n.lastElementChild)){for(n=n.lastElementChild.lastElementChild;r.isListCell(n)&&r.isList(n.lastElementChild);)n=n.lastElementChild&&n.lastElementChild.lastElementChild;e=n}let i=e===_.parentNode?_.previousSibling:e.lastChild;i||(i=r.createTextNode(r.zeroWidthSpace),_.parentNode.insertBefore(i,_.parentNode.firstChild));const l=3===i.nodeType?i.textContent.length:1,o=f.childNodes;let s=i,a=o[0];for(;a=o[0];)e.insertBefore(a,s.nextSibling),s=a;r.removeItem(f),0===_.children.length&&r.removeItem(_),d.setRange(i,l,i,l),d.history.push(!0)}}break}if(!p&&0===g.startOffset){let e=!0,i=n;for(;i&&i!==_&&!r.isWysiwygDiv(i);){if(i.previousSibling&&(1===i.previousSibling.nodeType||!r.onlyZeroWidthSpace(i.previousSibling.textContent.trim()))){e=!1;break}i=i.parentNode}if(e&&_.parentNode){t.preventDefault(),d.detachRangeFormatElement(_,r.isListCell(f)?[f]:null,null,!1,!1),d.history.push(!0);break}}}if(!p&&f&&(0===g.startOffset||c===f&&f.childNodes[g.startOffset])){const e=c===f?f.childNodes[g.startOffset]:c,i=f.previousSibling,l=(3===n.nodeType||r.isBreak(n))&&!n.previousSibling&&0===g.startOffset;if(!e.previousSibling&&(r.isComponent(n.previousSibling)||l&&r.isComponent(i))){const e=d.getFileComponent(i);e?(t.preventDefault(),t.stopPropagation(),0===f.textContent.length&&r.removeItem(f),!1===d.selectComponent(e.target,e.pluginName)&&d.blur()):r.isComponent(i)&&(t.preventDefault(),t.stopPropagation(),r.removeItem(i));break}if(r.isNonEditable(e.previousSibling)){t.preventDefault(),t.stopPropagation(),r.removeItem(e.previousSibling);break}}break;case 46:if(m){t.preventDefault(),t.stopPropagation(),d.plugins[m].destroy.call(d);break}if(p&&u._hardDelete()){t.preventDefault(),t.stopPropagation();break}if(u._isUneditableNode(g,!1)){t.preventDefault(),t.stopPropagation();break}if((r.isFormatElement(c)||null===c.nextSibling||r.onlyZeroWidthSpace(c.nextSibling)&&null===c.nextSibling.nextSibling)&&g.startOffset===c.textContent.length){let e=f.nextElementSibling;if(!e){t.preventDefault();break}if(r.isComponent(e)){if(t.preventDefault(),r.onlyZeroWidthSpace(f)&&(r.removeItem(f),r.isTable(e))){let t=r.getChildElement(e,r.isCell,!1);t=t.firstElementChild||t,d.setRange(t,0,t,0);break}const n=d.getFileComponent(e);n?(t.stopPropagation(),!1===d.selectComponent(n.target,n.pluginName)&&d.blur()):r.isComponent(e)&&(t.stopPropagation(),r.removeItem(e));break}}if(!p&&(d.isEdgePoint(g.endContainer,g.endOffset)||c===f&&f.childNodes[g.startOffset])){const e=c===f?f.childNodes[g.startOffset]:c;if(r.isNonEditable(e.nextSibling)){t.preventDefault(),t.stopPropagation(),r.removeItem(e.nextSibling);break}}if(f=r.getFormatElement(g.startContainer,null),_=r.getRangeFormatElement(f,null),r.isListCell(f)&&r.isList(_)&&(c===f||3===c.nodeType&&(!c.nextSibling||r.isList(c.nextSibling))&&(r.getFormatElement(g.startContainer,null)!==r.getFormatElement(g.endContainer,null)?_.contains(g.endContainer):g.endOffset===c.textContent.length&&g.collapsed))){g.startContainer!==g.endContainer&&d.removeNode();let e=r.getArrayItem(f.children,r.isList,!1);if(e=e||f.nextElementSibling||_.parentNode.nextElementSibling,e&&(r.isList(e)||r.getArrayItem(e.children,r.isList,!1))){let n,i;if(t.preventDefault(),r.isList(e)){const t=e.firstElementChild;for(i=t.childNodes,n=i[0];i[0];)f.insertBefore(i[0],e);r.removeItem(t)}else{for(n=e.firstChild,i=e.childNodes;i[0];)f.appendChild(i[0]);r.removeItem(e)}d.setRange(n,0,n,0),d.history.push(!0)}break}break;case 9:if(m||l.tabDisable)break;if(t.preventDefault(),o||s||r.isWysiwygDiv(c))break;const b=!g.collapsed||d.isEdgePoint(g.startContainer,g.startOffset),v=d.getSelectedElements(null);c=d.getSelectionNode();const y=[];let C=[],w=r.isListCell(v[0]),x=r.isListCell(v[v.length-1]),E={sc:g.startContainer,so:g.startOffset,ec:g.endContainer,eo:g.endOffset};for(let e,t=0,n=v.length;t<n;t++)if(e=v[t],r.isListCell(e)){if(!e.previousElementSibling&&!i)continue;y.push(e)}else C.push(e);if(y.length>0&&b&&d.plugins.list)E=d.plugins.list.editInsideList.call(d,i,y);else{const e=r.getParentElement(c,r.isCell);if(e&&b){const t=r.getParentElement(e,"table"),n=r.getListChildren(t,r.isCell);let l=i?r.prevIdx(n,e):r.nextIdx(n,e);l!==n.length||i||(l=0),-1===l&&i&&(l=n.length-1);let o=n[l];if(!o)break;o=o.firstElementChild||o,d.setRange(o,0,o,0);break}C=C.concat(y),w=x=null}if(C.length>0)if(i){const e=C.length-1;for(let t,n=0;n<=e;n++){t=C[n].childNodes;for(let e,n=0,i=t.length;n<i&&(e=t[n],e);n++)if(!r.onlyZeroWidthSpace(e)){/^\s{1,4}$/.test(e.textContent)?r.removeItem(e):/^\s{1,4}/.test(e.textContent)&&(e.textContent=e.textContent.replace(/^\s{1,4}/,""));break}}const t=r.getChildElement(C[0],"text",!1),n=r.getChildElement(C[e],"text",!0);!w&&t&&(E.sc=t,E.so=0),!x&&n&&(E.ec=n,E.eo=n.textContent.length)}else{const e=r.createTextNode(new a.Array(d._variable.tabSize+1).join(" "));if(1===C.length){const t=d.insertNode(e,null,!0);if(!t)return!1;w||(E.sc=e,E.so=t.endOffset),x||(E.ec=e,E.eo=t.endOffset)}else{const t=C.length-1;for(let n,i=0;i<=t;i++)n=C[i].firstChild,n&&(r.isBreak(n)?C[i].insertBefore(e.cloneNode(!1),n):n.textContent=e.textContent+n.textContent);const n=r.getChildElement(C[0],"text",!1),i=r.getChildElement(C[t],"text",!0);!w&&n&&(E.sc=n,E.so=0),!x&&i&&(E.ec=i,E.eo=i.textContent.length)}}d.setRange(E.sc,E.so,E.ec,E.eo),d.history.push(!1);break;case 13:const S=r.getFreeFormatElement(c,null);if(d._charTypeHTML){let e="";if(e=!i&&S||i?"<br>":"<"+f.nodeName+"><br></"+f.nodeName+">",!d.checkCharCount(e,"byte-html"))return t.preventDefault(),!1}if(!i&&/^H[1-6]$/i.test(f.nodeName)&&d.isEdgeFormat(g.endContainer,g.endOffset,"end")){t.preventDefault();const e=d.appendFormatTag(f,l.defaultTag);d.setRange(e,1,e,1);break}if(!i&&S){t.preventDefault();const e=c===S,n=d.getSelection(),i=c.childNodes,l=n.focusOffset,o=c.previousElementSibling,s=c.nextSibling;if(!r.isClosureFreeFormatElement(S)&&i&&(e&&g.collapsed&&i.length-1<=l+1&&r.isBreak(i[l])&&(!i[l+1]||(!i[l+2]||r.onlyZeroWidthSpace(i[l+2].textContent))&&3===i[l+1].nodeType&&r.onlyZeroWidthSpace(i[l+1].textContent))&&l>0&&r.isBreak(i[l-1])||!e&&r.onlyZeroWidthSpace(c.textContent)&&r.isBreak(o)&&(r.isBreak(o.previousSibling)||!r.onlyZeroWidthSpace(o.previousSibling.textContent))&&(!s||!r.isBreak(s)&&r.onlyZeroWidthSpace(s.textContent)))){e?r.removeItem(i[l-1]):r.removeItem(c);const t=d.appendFormatTag(S,r.isFormatElement(S.nextElementSibling)?S.nextElementSibling:null);r.copyFormatAttributes(t,S),d.setRange(t,1,t,1);break}if(e){h.insertHTML(g.collapsed&&r.isBreak(g.startContainer.childNodes[g.startOffset-1])?"<br>":"<br><br>",!0,!1);let e=n.focusNode;const t=n.focusOffset;S===e&&(e=e.childNodes[t-l>1?t-1:t]),d.setRange(e,1,e,1)}else{const e=n.focusNode.nextSibling,t=r.createElement("BR");d.insertNode(t,null,!1);const i=t.previousSibling,l=t.nextSibling;r.isBreak(e)||r.isBreak(i)||l&&!r.onlyZeroWidthSpace(l)?d.setRange(l,0,l,0):(t.parentNode.insertBefore(t.cloneNode(!1),t),d.setRange(t,1,t,1))}u._onShortcutKey=!0;break}if(p)break;if(_&&f&&!r.isCell(_)&&!/^FIGCAPTION$/i.test(_.nodeName)){const e=d.getRange();if(d.isEdgePoint(e.endContainer,e.endOffset)&&r.isList(c.nextSibling)){t.preventDefault();const e=r.createElement("LI"),n=r.createElement("BR");e.appendChild(n),f.parentNode.insertBefore(e,f.nextElementSibling),e.appendChild(c.nextSibling),d.setRange(n,1,n,1);break}if((3!==e.commonAncestorContainer.nodeType||!e.commonAncestorContainer.nextElementSibling)&&r.onlyZeroWidthSpace(f.innerText.trim())){t.preventDefault();let e=null;if(r.isListCell(_.parentNode)){if(_=f.parentNode.parentNode.parentNode,e=r.splitElement(f,null,r.getElementDepth(f)-2),!e){const t=r.createElement("LI");t.innerHTML="<br>",_.insertBefore(t,e),e=t}}else{const t=r.isCell(_.parentNode)?"DIV":r.isList(_.parentNode)?"LI":r.isFormatElement(_.nextElementSibling)?_.nextElementSibling.nodeName:r.isFormatElement(_.previousElementSibling)?_.previousElementSibling.nodeName:l.defaultTag;e=r.createElement(t);const n=d.detachRangeFormatElement(_,[f],null,!0,!0);n.cc.insertBefore(e,n.ec)}e.innerHTML="<br>",r.copyFormatAttributes(e,f),r.removeItemAllParents(f,null,null),d.setRange(e,1,e,1);break}}if(_&&r.getParentElement(_,"FIGCAPTION")&&r.getParentElement(_,r.isList)&&(t.preventDefault(),f=d.appendFormatTag(f,null),d.setRange(f,0,f,0)),m){t.preventDefault(),t.stopPropagation();const n=e[m],i=n._container,o=i.previousElementSibling||i.nextElementSibling;let s=null;r.isListCell(i.parentNode)?s=r.createElement("BR"):(s=r.createElement(r.isFormatElement(o)?o.nodeName:l.defaultTag),s.innerHTML="<br>"),i.parentNode.insertBefore(s,i),d.callPlugin(m,(function(){!1===d.selectComponent(n._element,m)&&d.blur()}),null)}break;case 27:if(m)return t.preventDefault(),t.stopPropagation(),d.controllersOff(),!1}if(i&&16===n){t.preventDefault(),t.stopPropagation();const e=d.plugins.table;if(e&&!e._shift&&!e._ref){const t=r.getParentElement(f,r.isCell);if(t)return void e.onTableCellMultiSelect.call(d,t,!0)}}else if(i&&(r.isOSX_IOS?s:o)&&32===n){t.preventDefault(),t.stopPropagation();const e=d.insertNode(r.createTextNode(" "));if(e&&e.container)return void d.setRange(e.container,e.endOffset,e.container,e.endOffset)}if(!(o||s||p||u._nonTextKeyCode.test(n))&&g.collapsed&&g.startContainer===g.endContainer&&r.isBreak(g.commonAncestorContainer)){const e=r.createTextNode(r.zeroWidthSpace);d.insertNode(e,null,!1),d.setRange(e,1,e,1)}"function"==typeof h.onKeyDown&&h.onKeyDown(t,d)},onKeyUp_wysiwyg:function(e){if(u._onShortcutKey)return;d._editorRange();const t=d.getRange(),n=e.keyCode,i=e.ctrlKey||e.metaKey||91===n||92===n||224===n,o=e.altKey;let s=d.getSelectionNode();if(d._isBalloon&&(d._isBalloonAlways&&27!==n||!t.collapsed)){if(!d._isBalloonAlways)return void u._showToolbarBalloon();27!==n&&u._showToolbarBalloonDelay()}if(8===n&&r.isWysiwygDiv(s)&&""===s.textContent&&0===s.children.length){e.preventDefault(),e.stopPropagation(),s.innerHTML="";const t=r.createElement(r.isFormatElement(d._variable.currentNodes[0])?d._variable.currentNodes[0]:l.defaultTag);return t.innerHTML="<br>",s.appendChild(t),d.setRange(t,0,t,0),u._applyTagEffects(),void d.history.push(!1)}const a=r.getFormatElement(s,null),c=r.getRangeFormatElement(s,null);(a||!t.collapsed)&&a!==c||r.isComponent(s)||r.isList(s)||(d._setDefaultFormat(r.isRangeFormatElement(c)?"DIV":l.defaultTag),s=d.getSelectionNode()),u._directionKeyCode.test(n)&&u._applyTagEffects();if(!i&&!o&&!u._nonTextKeyCode.test(n)&&3===s.nodeType&&r.zeroWidthRegExp.test(s.textContent)&&!(void 0!==e.isComposing?e.isComposing:u._IEisComposing)){let e=t.startOffset,n=t.endOffset;const i=(s.textContent.substring(0,n).match(u._frontZeroWidthReg)||"").length;e=t.startOffset-i,n=t.endOffset-i,s.textContent=s.textContent.replace(r.zeroWidthRegExp,""),d.setRange(s,e<0?0:e,s,n<0?0:n)}d._charCount(""),d.history.push(!0),"function"==typeof h.onKeyUp&&h.onKeyUp(e,d)},onScroll_wysiwyg:function(e){d.controllersOff(),d._isBalloon&&u._hideToolbar(),"function"==typeof h.onScroll&&h.onScroll(e,d)},onFocus_wysiwyg:function(e){d._antiBlur||(d.hasFocus=!0,d._isInline&&u._showToolbarInline(),"function"==typeof h.onFocus&&h.onFocus(e,d))},onBlur_wysiwyg:function(t){if(d._antiBlur||d._variable.isCodeView)return;d.hasFocus=!1,d.controllersOff(),(d._isInline||d._isBalloon)&&u._hideToolbar(),"function"==typeof h.onBlur&&h.onBlur(t,d);const i=d.commandMap,o=d.activePlugins;for(let e in i)r.hasOwn(i,e)&&(o.indexOf(e)>-1?n[e].active.call(d,null):i.OUTDENT&&/^OUTDENT$/i.test(e)?i.OUTDENT.setAttribute("disabled",!0):i.INDENT&&/^INDENT$/i.test(e)?i.INDENT.removeAttribute("disabled"):r.removeClass(i[e],"active"));d._variable.currentNodes=[],d._variable.currentNodesMap=[],l.showPathLabel&&(e.element.navigation.textContent="")},onMouseDown_resizingBar:function(t){t.stopPropagation(),d.submenuOff(),d.controllersOff(),d._variable.resizeClientY=t.clientY,e.element.resizeBackground.style.display="block",s.addEventListener("mousemove",u._resize_editor),s.addEventListener("mouseup",(function t(){e.element.resizeBackground.style.display="none",s.removeEventListener("mousemove",u._resize_editor),s.removeEventListener("mouseup",t)}))},_resize_editor:function(t){const n=e.element.editorArea.offsetHeight+(t.clientY-d._variable.resizeClientY);e.element.wysiwygFrame.style.height=e.element.code.style.height=(n<d._variable.minResizingSize?d._variable.minResizingSize:n)+"px",d._variable.resizeClientY=t.clientY},onResize_window:function(){d.controllersOff();const t=u._responsiveButtonSize;if(t){const n=e.element.toolbar.offsetWidth;let i="default";for(let e=1,l=t.length;e<l;e++)if(n<t[e]){i=t[e]+"";break}u._responsiveCurrentSize!==i&&(u._responsiveCurrentSize=i,h.setToolbarButtons(u._responsiveButtons[i]))}if(0!==e.element.toolbar.offsetWidth){if(e.fileBrowser&&"block"===e.fileBrowser.area.style.display&&(e.fileBrowser.body.style.maxHeight=a.innerHeight-e.fileBrowser.header.offsetHeight-50+"px"),d.submenuActiveButton&&d.submenu&&d._setMenuPosition(d.submenuActiveButton,d.submenu),d._variable.isFullScreen)return d._variable.innerHeight_fullScreen+=a.innerHeight-e.element.toolbar.offsetHeight-d._variable.innerHeight_fullScreen,void(e.element.editorArea.style.height=d._variable.innerHeight_fullScreen+"px");d._variable.isCodeView&&d._isInline?u._showToolbarInline():(d._iframeAutoHeight(),d._sticky&&(e.element.toolbar.style.width=e.element.topArea.offsetWidth-2+"px",u.onScroll_window()))}},onScroll_window:function(){if(d._variable.isFullScreen||0===e.element.toolbar.offsetWidth||l.stickyToolbar<0)return;const t=e.element,n=t.editorArea.offsetHeight,i=(this.scrollY||s.documentElement.scrollTop)+l.stickyToolbar,o=u._getEditorOffsets(l.toolbarContainer).top-(d._isInline?t.toolbar.offsetHeight:0);i<o?u._offStickyToolbar():i+d._variable.minResizingSize>=n+o?(d._sticky||u._onStickyToolbar(),t.toolbar.style.top=n+o+l.stickyToolbar-i-d._variable.minResizingSize+"px"):i>=o&&u._onStickyToolbar()},_getEditorOffsets:function(t){let n=t||e.element.topArea,i=0,l=0,o=0;for(;n;)i+=n.offsetTop,l+=n.offsetLeft,o+=n.scrollTop,n=n.offsetParent;return{top:i,left:l,scroll:o}},_getPageBottomSpace:function(){return s.documentElement.scrollHeight-(u._getEditorOffsets(null).top+e.element.topArea.offsetHeight)},_onStickyToolbar:function(){const t=e.element;d._isInline||l.toolbarContainer||(t._stickyDummy.style.height=t.toolbar.offsetHeight+"px",t._stickyDummy.style.display="block"),t.toolbar.style.top=l.stickyToolbar+"px",t.toolbar.style.width=d._isInline?d._inlineToolbarAttr.width:t.toolbar.offsetWidth+"px",r.addClass(t.toolbar,"se-toolbar-sticky"),d._sticky=!0},_offStickyToolbar:function(){const t=e.element;t._stickyDummy.style.display="none",t.toolbar.style.top=d._isInline?d._inlineToolbarAttr.top:"",t.toolbar.style.width=d._isInline?d._inlineToolbarAttr.width:"",t.editorArea.style.marginTop="",r.removeClass(t.toolbar,"se-toolbar-sticky"),d._sticky=!1},_codeViewAutoHeight:function(){e.element.code.style.height=e.element.code.scrollHeight+"px"},_hardDelete:function(){const e=d.getRange(),t=e.startContainer,n=e.endContainer,i=r.getRangeFormatElement(t),l=r.getRangeFormatElement(n),o=r.isCell(i),s=r.isCell(l);if((o&&!i.previousElementSibling&&!i.parentElement.previousElementSibling||s&&!l.nextElementSibling&&!l.parentElement.nextElementSibling)&&i!==l)if(o){if(s)return r.removeItem(r.getParentElement(i,r.isComponent)),d.nativeFocus(),!0;r.removeItem(r.getParentElement(i,r.isComponent))}else r.removeItem(r.getParentElement(l,r.isComponent));const a=1===t.nodeType?r.getParentElement(t,".se-component"):null,c=1===n.nodeType?r.getParentElement(n,".se-component"):null;return a&&r.removeItem(a),c&&r.removeItem(c),!1},onPaste_wysiwyg:function(e){const t=r.isIE?a.clipboardData:e.clipboardData;return!t||u._dataTransferAction("paste",e,t)},_setClipboardComponent:function(e,t,n){e.preventDefault(),e.stopPropagation(),n.setData("text/html",t.component.outerHTML)},onCopy_wysiwyg:function(e){const t=r.isIE?a.clipboardData:e.clipboardData;if("function"==typeof h.onCopy&&!h.onCopy(e,t,d))return e.preventDefault(),e.stopPropagation(),!1;const n=d.currentFileComponentInfo;n&&!r.isIE&&(u._setClipboardComponent(e,n,t),r.addClass(n.component,"se-component-copy"),a.setTimeout((function(){r.removeClass(n.component,"se-component-copy")}),150))},onCut_wysiwyg:function(e){const t=r.isIE?a.clipboardData:e.clipboardData;if("function"==typeof h.onCut&&!h.onCut(e,t,d))return e.preventDefault(),e.stopPropagation(),!1;const n=d.currentFileComponentInfo;n&&!r.isIE&&(u._setClipboardComponent(e,n,t),r.removeItem(n.component),d.controllersOff()),a.setTimeout((function(){d.history.push(!1)}))},onDrop_wysiwyg:function(e){const t=e.dataTransfer;return!t||(r.isIE?(e.preventDefault(),e.stopPropagation(),!1):(d.removeNode(),u._setDropLocationSelection(e),u._dataTransferAction("drop",e,t)))},_setDropLocationSelection:function(e){if(e.rangeParent)d.setRange(e.rangeParent,e.rangeOffset,e.rangeParent,e.rangeOffset);else if(d._wd.caretRangeFromPoint){const t=d._wd.caretRangeFromPoint(e.clientX,e.clientY);d.setRange(t.startContainer,t.startOffset,t.endContainer,t.endOffset)}else{const e=d.getRange();d.setRange(e.startContainer,e.startOffset,e.endContainer,e.endOffset)}},_dataTransferAction:function(t,n,i){let l,o;if(r.isIE){l=i.getData("Text");const s=d.getRange(),c=r.createElement("DIV"),h={sc:s.startContainer,so:s.startOffset,ec:s.endContainer,eo:s.endOffset};return c.setAttribute("contenteditable",!0),c.style.cssText="position:absolute; top:0; left:0; width:1px; height:1px; overflow:hidden;",e.element.relative.appendChild(c),c.focus(),a.setTimeout((function(){o=c.innerHTML,r.removeItem(c),d.setRange(h.sc,h.so,h.ec,h.eo),u._setClipboardData(t,n,l,o,i)})),!0}if(l=i.getData("text/plain"),o=i.getData("text/html")||l,!1===u._setClipboardData(t,n,l,o,i))return n.preventDefault(),n.stopPropagation(),!1},_setClipboardData:function(e,t,n,i,l){const o=/class=["']*Mso(Normal|List)/i.test(i)||/content=["']*Word.Document/i.test(i)||/content=["']*OneNote.File/i.test(i)||/content=["']*Excel.Sheet/i.test(i);o?(i=i.replace(/\n/g," "),n=n.replace(/\n/g," ")):n=n.replace(/\n/g,""),i=d.cleanHTML(i,d.pasteTagsWhitelistRegExp);const s=d._charCount(d._charTypeHTML?i:n);if("paste"===e&&"function"==typeof h.onPaste){const e=h.onPaste(t,i,s,d);if(!e)return!1;"string"==typeof e&&(i=e)}if("drop"===e&&"function"==typeof h.onDrop){const e=h.onDrop(t,i,s,d);if(!e)return!1;"string"==typeof e&&(i=e)}const a=l.files;return a.length>0&&!o?(/^image/.test(a[0].type)&&d.plugins.image&&h.insertImage(a),!1):!!s&&(i?(h.insertHTML(i,!0,!1),!1):void 0)},onMouseMove_wysiwyg:function(t){if(d.isDisabled)return;const n=r.getParentElement(t.target,r.isComponent),i=d._lineBreaker.style;if(n&&!d.currentControllerName){const o=e.element;let s=0,a=o.wysiwyg;do{s+=a.scrollTop,a=a.parentElement}while(a&&!/^(BODY|HTML)$/i.test(a.nodeName));const c=o.wysiwyg.scrollTop,h=u._getEditorOffsets(null),g=r.getOffset(n,o.wysiwygFrame).top+c,p=t.pageY+s+(l.iframe&&!l.toolbarContainer?o.toolbar.offsetHeight:0),m=g+(l.iframe?s:h.top),f=r.isListCell(n.parentNode);let _="",b="";if((f?!n.previousSibling:!r.isFormatElement(n.previousElementSibling))&&p<m+20)b=g,_="t";else{if((f?n.nextSibling:r.isFormatElement(n.nextElementSibling))||!(p>m+n.offsetHeight-20))return void(i.display="none");b=g+n.offsetHeight,_="b"}d._variable._lineBreakComp=n,d._variable._lineBreakDir=_,i.top=b-c+"px",d._lineBreakerButton.style.left=r.getOffset(n).left+n.offsetWidth/2-15+"px",i.display="block"}else"none"!==i.display&&(i.display="none")},_onMouseDown_lineBreak:function(e){e.preventDefault()},_onLineBreak:function(e){e.preventDefault();const t=d._variable._lineBreakComp,n=this?this:d._variable._lineBreakDir,i=r.isListCell(t.parentNode),o=r.createElement(i?"BR":r.isCell(t.parentNode)?"DIV":l.defaultTag);if(i||(o.innerHTML="<br>"),d._charTypeHTML&&!d.checkCharCount(o.outerHTML,"byte-html"))return;t.parentNode.insertBefore(o,"t"===n?t:t.nextSibling),d._lineBreaker.style.display="none",d._variable._lineBreakComp=null;const s=i?o:o.firstChild;d.setRange(s,1,s,1),d.history.push(!1)},_addEvent:function(){const t=l.iframe?d._ww:e.element.wysiwyg;e.element.toolbar.addEventListener("mousedown",u._buttonsEventHandler,!1),e.element._menuTray.addEventListener("mousedown",u._buttonsEventHandler,!1),e.element.toolbar.addEventListener("click",u.onClick_toolbar,!1),t.addEventListener("mousedown",u.onMouseDown_wysiwyg,!1),t.addEventListener("click",u.onClick_wysiwyg,!1),t.addEventListener(r.isIE?"textinput":"input",u.onInput_wysiwyg,!1),t.addEventListener("keydown",u.onKeyDown_wysiwyg,!1),t.addEventListener("keyup",u.onKeyUp_wysiwyg,!1),t.addEventListener("paste",u.onPaste_wysiwyg,!1),t.addEventListener("copy",u.onCopy_wysiwyg,!1),t.addEventListener("cut",u.onCut_wysiwyg,!1),t.addEventListener("drop",u.onDrop_wysiwyg,!1),t.addEventListener("scroll",u.onScroll_wysiwyg,!1),t.addEventListener("focus",u.onFocus_wysiwyg,!1),t.addEventListener("blur",u.onBlur_wysiwyg,!1),u._lineBreakerBind={a:u._onLineBreak.bind(""),t:u._onLineBreak.bind("t"),b:u._onLineBreak.bind("b")},t.addEventListener("mousemove",u.onMouseMove_wysiwyg,!1),d._lineBreakerButton.addEventListener("mousedown",u._onMouseDown_lineBreak,!1),d._lineBreakerButton.addEventListener("click",u._lineBreakerBind.a,!1),e.element.lineBreaker_t.addEventListener("mousedown",u._lineBreakerBind.t,!1),e.element.lineBreaker_b.addEventListener("mousedown",u._lineBreakerBind.b,!1),d.plugins.table&&t.addEventListener("touchstart",u.onMouseDown_wysiwyg,{passive:!0,useCapture:!1}),"auto"!==l.height||l.codeMirrorEditor||(e.element.code.addEventListener("keydown",u._codeViewAutoHeight,!1),e.element.code.addEventListener("keyup",u._codeViewAutoHeight,!1),e.element.code.addEventListener("paste",u._codeViewAutoHeight,!1)),e.element.resizingBar&&(/\d+/.test(l.height)?e.element.resizingBar.addEventListener("mousedown",u.onMouseDown_resizingBar,!1):r.addClass(e.element.resizingBar,"se-resizing-none")),u._setResponsiveToolbar(),a.removeEventListener("resize",u.onResize_window),a.removeEventListener("scroll",u.onScroll_window),a.addEventListener("resize",u.onResize_window,!1),l.stickyToolbar>-1&&a.addEventListener("scroll",u.onScroll_window,!1)},_removeEvent:function(){const t=l.iframe?d._ww:e.element.wysiwyg;e.element.toolbar.removeEventListener("mousedown",u._buttonsEventHandler),e.element._menuTray.removeEventListener("mousedown",u._buttonsEventHandler),e.element.toolbar.removeEventListener("click",u.onClick_toolbar),t.removeEventListener("mousedown",u.onMouseDown_wysiwyg),t.removeEventListener("click",u.onClick_wysiwyg),t.removeEventListener(r.isIE?"textinput":"input",u.onInput_wysiwyg),t.removeEventListener("keydown",u.onKeyDown_wysiwyg),t.removeEventListener("keyup",u.onKeyUp_wysiwyg),t.removeEventListener("paste",u.onPaste_wysiwyg),t.removeEventListener("copy",u.onCopy_wysiwyg),t.removeEventListener("cut",u.onCut_wysiwyg),t.removeEventListener("drop",u.onDrop_wysiwyg),t.removeEventListener("scroll",u.onScroll_wysiwyg),t.removeEventListener("mousemove",u.onMouseMove_wysiwyg),d._lineBreakerButton.removeEventListener("mousedown",u._onMouseDown_lineBreak),d._lineBreakerButton.removeEventListener("click",u._lineBreakerBind.a),e.element.lineBreaker_t.removeEventListener("mousedown",u._lineBreakerBind.t),e.element.lineBreaker_b.removeEventListener("mousedown",u._lineBreakerBind.b),u._lineBreakerBind=null,t.removeEventListener("touchstart",u.onMouseDown_wysiwyg,{passive:!0,useCapture:!1}),t.removeEventListener("focus",u.onFocus_wysiwyg),t.removeEventListener("blur",u.onBlur_wysiwyg),e.element.code.removeEventListener("keydown",u._codeViewAutoHeight),e.element.code.removeEventListener("keyup",u._codeViewAutoHeight),e.element.code.removeEventListener("paste",u._codeViewAutoHeight),e.element.resizingBar&&e.element.resizingBar.removeEventListener("mousedown",u.onMouseDown_resizingBar),a.removeEventListener("resize",u.onResize_window),a.removeEventListener("scroll",u.onScroll_window)},_setResponsiveToolbar:function(){if(0===o.length)return void(o=null);u._responsiveCurrentSize="default";const e=u._responsiveButtonSize=[],t=u._responsiveButtons={default:o[0]};for(let n,i,l=1,s=o.length;l<s;l++)i=o[l],n=1*i[0],e.push(n),t[n]=i[1];e.sort((function(e,t){return e-t})).unshift("default")}},h={core:d,util:r,onload:null,onScroll:null,onMouseDown:null,onClick:null,onInput:null,onKeyDown:null,onKeyUp:null,onCopy:null,onCut:null,onFocus:null,onBlur:null,onChange:null,onDrop:null,onPaste:null,showInline:null,showController:null,toggleCodeView:null,toggleFullScreen:null,imageUploadHandler:null,videoUploadHandler:null,audioUploadHandler:null,onImageUploadBefore:null,onVideoUploadBefore:null,onAudioUploadBefore:null,onImageUpload:null,onVideoUpload:null,onAudioUpload:null,onImageUploadError:null,onVideoUploadError:null,onAudioUploadError:null,setToolbarButtons:function(i){d.submenuOff(),d.containerOff();const a=k._createToolBar(s,i,d.plugins,l);o=a.responsiveButtons,d._moreLayerActiveButton=null,u._setResponsiveToolbar(),e.element.toolbar.replaceChild(a._buttonTray,e.element._buttonTray);const c=L(e.element.originElement,d._getConstructed(e.element),l);e.element=c.element,e.tool=c.tool,l.iframe&&(e.element.wysiwyg=d._wd.body),d._cachingButtons(),d.history._resetCachingButton(),d.activePlugins=[];const h=t;let g,p,m;t=a.pluginCallButtons;for(let e in t)r.hasOwn(t,e)&&(g=n[e],p=t[e],g.active&&p&&(m=h[e],d.callPlugin(e,null,m||p),m&&(p.parentElement.replaceChild(m,p),t[e]=m)));d.hasFocus&&u._applyTagEffects(),d._variable.isCodeView&&r.addClass(d._styleCommandMap.codeView,"active"),d._variable.isFullScreen&&r.addClass(d._styleCommandMap.fullScreen,"active"),r.hasClass(e.element.wysiwyg,"se-show-block")&&r.addClass(d._styleCommandMap.showBlocks,"active")},setOptions:function(s){u._removeEvent(),d._resetComponents(),r.removeClass(d._styleCommandMap.showBlocks,"active"),r.removeClass(d._styleCommandMap.codeView,"active"),d._variable.isCodeView=!1,d._iframeAuto=null,d.plugins=s.plugins||d.plugins;const c=[l,s].reduce((function(e,t){for(let n in t)if(r.hasOwn(t,n))if("plugins"===n&&t[n]&&e[n]){let i=e[n],l=t[n];i=i.length?i:a.Object.keys(i).map((function(e){return i[e]})),l=l.length?l:a.Object.keys(l).map((function(e){return l[e]})),e[n]=l.filter((function(e){return-1===i.indexOf(e)})).concat(i)}else e[n]=t[n];return e}),{}),h=e.element,g=h.wysiwyg.innerHTML,p=k._setOptions(c,e,l);p.callButtons&&(t=p.callButtons,d.initPlugins={}),p.plugins&&(d.plugins=n=p.plugins),0===h._menuTray.children.length&&(this._menuTray={}),o=p.toolbar.responsiveButtons,d.options=l=c,d.lang=i=l.lang,l.iframe&&h.wysiwygFrame.addEventListener("load",(function(){r._setIframeDocument(this,l),d._setOptionsInit(h,g)})),h.editorArea.appendChild(h.wysiwygFrame),l.iframe||d._setOptionsInit(h,g)},setDefaultStyle:function(t){const n=l._editorStyles=r._setDefaultOptionStyle(l,t),i=e.element;i.topArea.style.cssText=n.top,i.code.style.cssText=l._editorStyles.frame,i.code.style.display="none","auto"===l.height?i.code.style.overflow="hidden":i.code.style.overflow="",l.iframe?(i.wysiwygFrame.style.cssText=n.frame,i.wysiwyg.style.cssText=n.editor):i.wysiwygFrame.style.cssText=n.frame+n.editor},noticeOpen:function(e){d.notice.open.call(d,e)},noticeClose:function(){d.notice.close.call(d)},save:function(){e.element.originElement.value=d.getContents(!1)},getContext:function(){return e},getContents:function(e){return d.getContents(e)},getText:function(){return e.element.wysiwyg.textContent},getCharCount:function(t){return t="string"==typeof t?t:l.charCounterType,d.getCharLength(d._charTypeHTML?e.element.wysiwyg.innerHTML:e.element.wysiwyg.textContent,t)},getImagesInfo:function(){return e.image?e.image._infoList:[]},getFilesInfo:function(t){return e[t]?e[t]._infoList:[]},insertImage:function(e){d.plugins.image&&e&&(d.initPlugins.image?d.plugins.image.submitAction.call(d,e):d.callPlugin("image",d.plugins.image.submitAction.bind(d,e),null),d.focus())},insertHTML:function(e,t,n,i){if("string"==typeof e){t||(e=d.cleanHTML(e,null));try{const t=s.createRange().createContextualFragment(e).childNodes;if(n){const e=d._charTypeHTML?"outerHTML":"textContent";let n="";for(let i=0,l=t.length;i<l;i++)n+=t[i][e];if(!d.checkCharCount(n,null))return}let l,o,a,r;for(;l=t[0];)a=d.insertNode(l,o,!1),o=a.container||a,r||(r=a);const c=3===o.nodeType?a.endOffset||o.textContent.length:o.childNodes.length;i?d.setRange(r.container||r,r.startOffset||0,o,c):d.setRange(o,c,o,c)}catch(t){d.execCommand("insertHTML",!1,e)}}else if(r.isComponent(e))d.insertComponent(e,!1,n,!1);else{let t=null;(r.isFormatElement(e)||r.isMedia(e))&&(t=r.getFormatElement(d.getSelectionNode(),null)),d.insertNode(e,t,n)}d.effectNode=null,d.focus(),d.history.push(!1)},setContents:function(e){d.setContents(e)},appendContents:function(t){const n=d.convertContentsForEditor(t);if(d._variable.isCodeView)d._setCodeView(d._getCodeView()+"\n"+d.convertHTMLForCodeView(n));else{const t=r.createElement("DIV");t.innerHTML=n;const i=e.element.wysiwyg,l=t.children;for(let e=0,t=l.length;e<t;e++)i.appendChild(l[e])}d.history.push(!1)},disabled:function(){e.tool.cover.style.display="block",e.element.wysiwyg.setAttribute("contenteditable",!1),d.isDisabled=!0,l.codeMirrorEditor?l.codeMirrorEditor.setOption("readOnly",!0):e.element.code.setAttribute("disabled","disabled")},enabled:function(){e.tool.cover.style.display="none",e.element.wysiwyg.setAttribute("contenteditable",!0),d.isDisabled=!1,l.codeMirrorEditor?l.codeMirrorEditor.setOption("readOnly",!1):e.element.code.removeAttribute("disabled")},show:function(){const t=e.element.topArea.style;"none"===t.display&&(t.display=l.display)},hide:function(){e.element.topArea.style.display="none"},destroy:function(){d.submenuOff(),d.containerOff(),d.controllersOff(),d.notice&&d.notice.close.call(d),d.modalForm&&d.plugins.dialog.close.call(d),d.history._destroy(),u._removeEvent(),r.removeItem(e.element.toolbar),r.removeItem(e.element.topArea);for(let e in d)r.hasOwn(d,e)&&delete d[e];for(let e in u)r.hasOwn(u,e)&&delete u[e];for(let t in e)r.hasOwn(e,t)&&delete e[t];for(let e in t)r.hasOwn(t,e)&&delete t[e];for(let e in this)r.hasOwn(this,e)&&delete this[e]},toolbar:{disabled:function(){e.tool.cover.style.display="block"},enabled:function(){e.tool.cover.style.display="none"},show:function(){d._isInline?u._showToolbarInline():(e.element.toolbar.style.display="",e.element._stickyDummy.style.display="")},hide:function(){d._isInline?u._hideToolbar():(e.element.toolbar.style.display="none",e.element._stickyDummy.style.display="none")}}};d.functions=h,d.options=l;let g=e.element,p=g.originElement,m=g.topArea;return p.style.display="none",m.style.display="block",l.iframe&&g.wysiwygFrame.addEventListener("load",(function(){r._setIframeDocument(this,l),d._editorInit(!1,l.value),l.value=null})),"object"==typeof p.nextElementSibling?p.parentNode.insertBefore(m,p.nextElementSibling):p.parentNode.appendChild(m),g.editorArea.appendChild(g.wysiwygFrame),g=p=m=null,l.iframe||(d._editorInit(!1,l.value),l.value=null),h}(L(i,l.constructed,l.options),l.pluginCallButtons,l.plugins,l.options.lang,t,l._responsiveButtons)}};Object.defineProperty(window,"SUNEDITOR",{enumerable:!0,writable:!1,configurable:!1,value:A.init({plugins:w})})},ZED3:function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={name:"component",set_container:function(e,t){const n=this.util.createElement("DIV");return n.className="se-component "+t,n.setAttribute("contenteditable",!1),n.appendChild(e),n},set_cover:function(e){const t=this.util.createElement("FIGURE");return t.appendChild(e),t},create_caption:function(){const e=this.util.createElement("FIGCAPTION");return e.setAttribute("contenteditable",!0),e.innerHTML="<div>"+this.lang.dialogBox.caption+"</div>",e}};return void 0===t&&(e.SUNEDITOR_MODULES||Object.defineProperty(e,"SUNEDITOR_MODULES",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_MODULES,"component",{enumerable:!0,writable:!1,configurable:!1,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_MODULES a window with a document");return l(e)}:l(i)},ee5k:function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={name:"resizing",add:function(e){const t=e.icons,n=e.context;n.resizing={_resizeClientX:0,_resizeClientY:0,_resize_plugin:"",_resize_w:0,_resize_h:0,_origin_w:0,_origin_h:0,_rotateVertical:!1,_resize_direction:"",_move_path:null,_isChange:!1,alignIcons:{basic:t.align_justify,left:t.align_left,right:t.align_right,center:t.align_center}};let i=this.setController_resize(e);n.resizing.resizeContainer=i,n.resizing.resizeDiv=i.querySelector(".se-modal-resize"),n.resizing.resizeDot=i.querySelector(".se-resize-dot"),n.resizing.resizeDisplay=i.querySelector(".se-resize-display");let l=this.setController_button(e);n.resizing.resizeButton=l;let o=n.resizing.resizeHandles=n.resizing.resizeDot.querySelectorAll("span");n.resizing.resizeButtonGroup=l.querySelector("._se_resizing_btn_group"),n.resizing.rotationButtons=l.querySelectorAll("._se_resizing_btn_group ._se_rotation"),n.resizing.percentageButtons=l.querySelectorAll("._se_resizing_btn_group ._se_percentage"),n.resizing.alignMenu=l.querySelector(".se-resizing-align-list"),n.resizing.alignMenuList=n.resizing.alignMenu.querySelectorAll("button"),n.resizing.alignButton=l.querySelector("._se_resizing_align_button"),n.resizing.autoSizeButton=l.querySelector("._se_resizing_btn_group ._se_auto_size"),n.resizing.captionButton=l.querySelector("._se_resizing_caption_button"),i.addEventListener("mousedown",(function(e){e.preventDefault()})),o[0].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[1].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[2].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[3].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[4].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[5].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[6].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),o[7].addEventListener("mousedown",this.onMouseDown_resize_handle.bind(e)),l.addEventListener("click",this.onClick_resizeButton.bind(e)),n.element.relative.appendChild(i),n.element.relative.appendChild(l),i=null,l=null,o=null},setController_resize:function(e){const t=e.util.createElement("DIV");return t.className="se-controller se-resizing-container",t.style.display="none",t.innerHTML='<div class="se-modal-resize"></div><div class="se-resize-dot"><span class="tl"></span><span class="tr"></span><span class="bl"></span><span class="br"></span><span class="lw"></span><span class="th"></span><span class="rw"></span><span class="bh"></span><div class="se-resize-display"></div></div>',t},setController_button:function(e){const t=e.lang,n=e.icons,i=e.util.createElement("DIV");return i.className="se-controller se-controller-resizing",i.innerHTML='<div class="se-arrow se-arrow-up"></div><div class="se-btn-group _se_resizing_btn_group"><button type="button" data-command="percent" data-value="1" class="se-tooltip _se_percentage"><span>100%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.resize100+'</span></span></button><button type="button" data-command="percent" data-value="0.75" class="se-tooltip _se_percentage"><span>75%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.resize75+'</span></span></button><button type="button" data-command="percent" data-value="0.5" class="se-tooltip _se_percentage"><span>50%</span><span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.resize50+'</span></span></button><button type="button" data-command="auto" class="se-btn se-tooltip _se_auto_size">'+n.auto_size+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.autoSize+'</span></span></button><button type="button" data-command="rotate" data-value="-90" class="se-btn se-tooltip _se_rotation">'+n.rotate_left+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.rotateLeft+'</span></span></button><button type="button" data-command="rotate" data-value="90" class="se-btn se-tooltip _se_rotation">'+n.rotate_right+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.rotateRight+'</span></span></button></div><div class="se-btn-group" style="padding-top: 0;"><button type="button" data-command="mirror" data-value="h" class="se-btn se-tooltip">'+n.mirror_horizontal+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.mirrorHorizontal+'</span></span></button><button type="button" data-command="mirror" data-value="v" class="se-btn se-tooltip">'+n.mirror_vertical+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.mirrorVertical+'</span></span></button><button type="button" data-command="onalign" class="se-btn se-tooltip _se_resizing_align_button">'+n.align_justify+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.toolbar.align+'</span></span></button><div class="se-btn-group-sub sun-editor-common se-list-layer se-resizing-align-list"><div class="se-list-inner"><ul class="se-list-basic"><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="basic">'+n.align_justify+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.basic+'</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="left">'+n.align_left+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.left+'</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="center">'+n.align_center+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.center+'</span></span></button></li><li><button type="button" class="se-btn-list se-tooltip" data-command="align" data-value="right">'+n.align_right+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.right+'</span></span></button></li></ul></div></div><button type="button" data-command="caption" class="se-btn se-tooltip _se_resizing_caption_button">'+n.caption+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.caption+'</span></span></button><button type="button" data-command="revert" class="se-btn se-tooltip">'+n.revert+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.dialogBox.revertButton+'</span></span></button><button type="button" data-command="update" class="se-btn se-tooltip">'+n.modify+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.edit+'</span></span></button><button type="button" data-command="delete" class="se-btn se-tooltip">'+n.delete+'<span class="se-tooltip-inner"><span class="se-tooltip-text">'+t.controller.remove+"</span></span></button></div>",i},_module_getSizeX:function(e,t,n,i){return t||(t=e._element),n||(n=e._cover),i||(i=e._container),t?/%$/.test(t.style.width)?(i&&this.util.getNumber(i.style.width,2)||100)+"%":t.style.width:""},_module_getSizeY:function(e,t,n,i){return t||(t=e._element),n||(n=e._cover),i||(i=e._container),i&&n?this.util.getNumber(n.style.paddingBottom,0)>0&&!this.context.resizing._rotateVertical?n.style.height:/%$/.test(t.style.height)&&/%$/.test(t.style.width)?(i&&this.util.getNumber(i.style.height,2)||100)+"%":t.style.height:t&&t.style.height||""},_module_setModifyInputSize:function(e,t){const n=e._onlyPercentage&&this.context.resizing._rotateVertical;e.proportion.checked=e._proportionChecked="false"!==e._element.getAttribute("data-proportion");let i=n?"":this.plugins.resizing._module_getSizeX.call(this,e);if(i===e._defaultSizeX&&(i=""),e._onlyPercentage&&(i=this.util.getNumber(i,2)),e.inputX.value=i,t.setInputSize.call(this,"x"),!e._onlyPercentage){let t=n?"":this.plugins.resizing._module_getSizeY.call(this,e);t===e._defaultSizeY&&(t=""),e._onlyPercentage&&(t=this.util.getNumber(t,2)),e.inputY.value=t}e.inputX.disabled=!!n,e.inputY.disabled=!!n,e.proportion.disabled=!!n,t.setRatio.call(this)},_module_setInputSize:function(e,t){if(e._onlyPercentage)"x"===t&&e.inputX.value>100&&(e.inputX.value=100);else if(e.proportion.checked&&e._ratio&&/\d/.test(e.inputX.value)&&/\d/.test(e.inputY.value)){const n=e.inputX.value.replace(/\d+|\./g,"")||e.sizeUnit,i=e.inputY.value.replace(/\d+|\./g,"")||e.sizeUnit;if(n!==i)return;const l="%"===n?2:0;"x"===t?e.inputY.value=this.util.getNumber(e._ratioY*this.util.getNumber(e.inputX.value,l),l)+i:e.inputX.value=this.util.getNumber(e._ratioX*this.util.getNumber(e.inputY.value,l),l)+n}},_module_setRatio:function(e){const t=e.inputX.value,n=e.inputY.value;if(e.proportion.checked&&/\d+/.test(t)&&/\d+/.test(n)){if((t.replace(/\d+|\./g,"")||e.sizeUnit)!==(n.replace(/\d+|\./g,"")||e.sizeUnit))e._ratio=!1;else if(!e._ratio){const i=this.util.getNumber(t,0),l=this.util.getNumber(n,0);e._ratio=!0,e._ratioX=i/l,e._ratioY=l/i}}else e._ratio=!1},_module_sizeRevert:function(e){e._onlyPercentage?e.inputX.value=e._origin_w>100?100:e._origin_w:(e.inputX.value=e._origin_w,e.inputY.value=e._origin_h)},_module_saveCurrentSize:function(e){const t=this.plugins.resizing._module_getSizeX.call(this,e),n=this.plugins.resizing._module_getSizeY.call(this,e);e._element.setAttribute("data-size",t+","+n),e._videoRatio&&(e._videoRatio=n)},call_controller_resize:function(e,t){const n=this.context.resizing,i=this.context[t];n._resize_plugin=t;const l=n.resizeContainer,o=n.resizeDiv,s=this.util.getOffset(e,this.context.element.wysiwygFrame),a=n._rotateVertical=/^(90|270)$/.test(Math.abs(e.getAttribute("data-rotate")).toString()),r=a?e.offsetHeight:e.offsetWidth,c=a?e.offsetWidth:e.offsetHeight,d=s.top,u=s.left-this.context.element.wysiwygFrame.scrollLeft;l.style.top=d+"px",l.style.left=u+"px",l.style.width=r+"px",l.style.height=c+"px",o.style.top="0px",o.style.left="0px",o.style.width=r+"px",o.style.height=c+"px";let h=e.getAttribute("data-align")||"basic";h="none"===h?"basic":h;const g=this.util.getParentElement(e,this.util.isComponent),p=this.util.getParentElement(e,"FIGURE"),m=this.plugins.resizing._module_getSizeX.call(this,i,e,p,g)||"auto",f=i._onlyPercentage&&"image"===t?"":", "+(this.plugins.resizing._module_getSizeY.call(this,i,e,p,g)||"auto");this.util.changeTxt(n.resizeDisplay,this.lang.dialogBox[h]+" ("+m+f+")"),n.resizeButtonGroup.style.display=i._resizing?"":"none";const _=!i._resizing||i._resizeDotHide||i._onlyPercentage?"none":"flex",b=n.resizeHandles;for(let e=0,t=b.length;e<t;e++)b[e].style.display=_;if(i._resizing){const e=n.rotationButtons;e[0].style.display=e[1].style.display=i._rotation?"":"none"}const v=n.alignMenuList;this.util.changeElement(n.alignButton.firstElementChild,n.alignIcons[h]);for(let e=0,t=v.length;e<t;e++)v[e].getAttribute("data-value")===h?this.util.addClass(v[e],"on"):this.util.removeClass(v[e],"on");const y=n.percentageButtons,C=/%$/.test(e.style.width)&&/%$/.test(g.style.width)?this.util.getNumber(g.style.width,0)/100+"":"";for(let e=0,t=y.length;e<t;e++)y[e].getAttribute("data-value")===C?this.util.addClass(y[e],"active"):this.util.removeClass(y[e],"active");i._captionShow?(n.captionButton.style.display="",this.util.getChildElement(e.parentNode,"figcaption")?(this.util.addClass(n.captionButton,"active"),i._captionChecked=!0):(this.util.removeClass(n.captionButton,"active"),i._captionChecked=!1)):n.captionButton.style.display="none",this.util.setDisabledButtons(!0,this.resizingDisabledButtons),l.style.display="block";const w={left:0,top:50};this.options.iframe&&(w.left-=this.context.element.wysiwygFrame.parentElement.offsetLeft,w.top-=this.context.element.wysiwygFrame.parentElement.offsetTop),this.setControllerPosition(n.resizeButton,l,"bottom",w),this.controllersOn(l,n.resizeButton,this.util.setDisabledButtons.bind(this,!1,this.resizingDisabledButtons),e,t),n._resize_w=r,n._resize_h=c;const x=(e.getAttribute("origin-size")||"").split(",");return n._origin_w=x[0]||e.naturalWidth,n._origin_h=x[1]||e.naturalHeight,{w:r,h:c,t:d,l:u}},_closeAlignMenu:null,openAlignMenu:function(){const e=this.context.resizing.alignButton;this.util.addClass(e,"on"),this.context.resizing.alignMenu.style.top=e.offsetTop+e.offsetHeight+"px",this.context.resizing.alignMenu.style.left=e.offsetLeft-e.offsetWidth/2+"px",this.context.resizing.alignMenu.style.display="block",this.plugins.resizing._closeAlignMenu=function(){this.util.removeClass(this.context.resizing.alignButton,"on"),this.context.resizing.alignMenu.style.display="none",this.removeDocEvent("click",this.plugins.resizing._closeAlignMenu),this.plugins.resizing._closeAlignMenu=null}.bind(this),this.addDocEvent("click",this.plugins.resizing._closeAlignMenu)},onClick_resizeButton:function(e){e.stopPropagation();const t=e.target,n=t.getAttribute("data-command")||t.parentNode.getAttribute("data-command");if(!n)return;const i=t.getAttribute("data-value")||t.parentNode.getAttribute("data-value"),l=this.context.resizing._resize_plugin,o=this.context[l],s=o._element,a=this.plugins[l];if(e.preventDefault(),"function"!=typeof this.plugins.resizing._closeAlignMenu||(this.plugins.resizing._closeAlignMenu(),"onalign"!==n)){switch(n){case"auto":this.plugins.resizing.resetTransform.call(this,s),a.setAutoSize.call(this),this.selectComponent(s,l);break;case"percent":let e=this.plugins.resizing._module_getSizeY.call(this,o);if(this.context.resizing._rotateVertical){const t=s.getAttribute("data-percentage");t&&(e=t.split(",")[1])}this.plugins.resizing.resetTransform.call(this,s),a.setPercentSize.call(this,100*i,null!==this.util.getNumber(e,0)&&/%$/.test(e)?e:""),this.selectComponent(s,l);break;case"mirror":const t=s.getAttribute("data-rotate")||"0";let n=s.getAttribute("data-rotateX")||"",r=s.getAttribute("data-rotateY")||"";"h"===i&&!this.context.resizing._rotateVertical||"v"===i&&this.context.resizing._rotateVertical?r=r?"":"180":n=n?"":"180",s.setAttribute("data-rotateX",n),s.setAttribute("data-rotateY",r),this.plugins.resizing._setTransForm(s,t,n,r);break;case"rotate":const c=this.context.resizing,d=1*s.getAttribute("data-rotate")+1*i,u=this._w.Math.abs(d)>=360?0:d;s.setAttribute("data-rotate",u),c._rotateVertical=/^(90|270)$/.test(this._w.Math.abs(u).toString()),this.plugins.resizing.setTransformSize.call(this,s,null,null),this.selectComponent(s,l);break;case"onalign":return void this.plugins.resizing.openAlignMenu.call(this);case"align":const h="basic"===i?"none":i;a.setAlign.call(this,h,null,null,null),this.selectComponent(s,l);break;case"caption":const g=!o._captionChecked;if(a.openModify.call(this,!0),o._captionChecked=o.captionCheckEl.checked=g,a.update_image.call(this,!1,!1,!1),g){const e=this.util.getChildElement(o._caption,(function(e){return 3===e.nodeType}));e?this.setRange(e,0,e,e.textContent.length):o._caption.focus(),this.controllersOff()}else this.selectComponent(s,l),a.openModify.call(this,!0);break;case"revert":a.setOriginSize.call(this),this.selectComponent(s,l);break;case"update":a.openModify.call(this),this.controllersOff();break;case"delete":a.destroy.call(this)}this.history.push(!1)}},resetTransform:function(e){const t=(e.getAttribute("data-size")||e.getAttribute("data-origin")||"").split(",");this.context.resizing._rotateVertical=!1,e.style.maxWidth="",e.style.transform="",e.style.transformOrigin="",e.setAttribute("data-rotate",""),e.setAttribute("data-rotateX",""),e.setAttribute("data-rotateY",""),this.plugins[this.context.resizing._resize_plugin].setSize.call(this,t[0]?t[0]:"auto",t[1]?t[1]:"",!0)},setTransformSize:function(e,t,n){let i=e.getAttribute("data-percentage");const l=this.context.resizing._rotateVertical,o=1*e.getAttribute("data-rotate");let s="";if(i&&!l)i=i.split(","),"auto"===i[0]&&"auto"===i[1]?this.plugins[this.context.resizing._resize_plugin].setAutoSize.call(this):this.plugins[this.context.resizing._resize_plugin].setPercentSize.call(this,i[0],i[1]);else{const i=this.util.getParentElement(e,"FIGURE"),a=t||e.offsetWidth,r=n||e.offsetHeight,c=(l?r:a)+"px",d=(l?a:r)+"px";if(this.plugins[this.context.resizing._resize_plugin].cancelPercentAttr.call(this),this.plugins[this.context.resizing._resize_plugin].setSize.call(this,a+"px",r+"px",!0),i.style.width=c,i.style.height=this.context[this.context.resizing._resize_plugin]._caption?"":d,l){let e=a/2+"px "+a/2+"px 0",t=r/2+"px "+r/2+"px 0";s=90===o||-270===o?t:e}}e.style.transformOrigin=s,this.plugins.resizing._setTransForm(e,o.toString(),e.getAttribute("data-rotateX")||"",e.getAttribute("data-rotateY")||""),e.style.maxWidth=l?"none":"",this.plugins.resizing.setCaptionPosition.call(this,e)},_setTransForm:function(e,t,n,i){let l=(e.offsetWidth-e.offsetHeight)*(/-/.test(t)?1:-1),o="";if(/[1-9]/.test(t)&&(n||i))switch(o=n?"Y":"X",t){case"90":o=n&&i?"X":i?o:"";break;case"270":l*=-1,o=n&&i?"Y":n?o:"";break;case"-90":o=n&&i?"Y":n?o:"";break;case"-270":l*=-1,o=n&&i?"X":i?o:"";break;default:o=""}t%180==0&&(e.style.maxWidth=""),e.style.transform="rotate("+t+"deg)"+(n?" rotateX("+n+"deg)":"")+(i?" rotateY("+i+"deg)":"")+(o?" translate"+o+"("+l+"px)":"")},setCaptionPosition:function(e){const t=this.util.getChildElement(this.util.getParentElement(e,"FIGURE"),"FIGCAPTION");t&&(t.style.marginTop=(this.context.resizing._rotateVertical?e.offsetWidth-e.offsetHeight:0)+"px")},onMouseDown_resize_handle:function(e){e.stopPropagation(),e.preventDefault();const t=this.context.resizing,n=t._resize_direction=e.target.classList[0];t._resizeClientX=e.clientX,t._resizeClientY=e.clientY,this.context.element.resizeBackground.style.display="block",t.resizeButton.style.display="none",t.resizeDiv.style.float=/l/.test(n)?"right":/r/.test(n)?"left":"none";const i=function(e){if("keydown"===e.type&&27!==e.keyCode)return;const o=t._isChange;t._isChange=!1,this.removeDocEvent("mousemove",l),this.removeDocEvent("mouseup",i),this.removeDocEvent("keydown",i),"keydown"===e.type?(this.controllersOff(),this.context.element.resizeBackground.style.display="none",this.plugins[this.context.resizing._resize_plugin].init.call(this)):(this.plugins.resizing.cancel_controller_resize.call(this,n),o&&this.history.push(!1))}.bind(this),l=this.plugins.resizing.resizing_element.bind(this,t,n,this.context[t._resize_plugin]);this.addDocEvent("mousemove",l),this.addDocEvent("mouseup",i),this.addDocEvent("keydown",i)},resizing_element:function(e,t,n,i){const l=i.clientX,o=i.clientY;let s=n._element_w,a=n._element_h;const r=n._element_w+(/r/.test(t)?l-e._resizeClientX:e._resizeClientX-l),c=n._element_h+(/b/.test(t)?o-e._resizeClientY:e._resizeClientY-o),d=n._element_h/n._element_w*r;/t/.test(t)&&(e.resizeDiv.style.top=n._element_h-(/h/.test(t)?c:d)+"px"),/l/.test(t)&&(e.resizeDiv.style.left=n._element_w-r+"px"),/r|l/.test(t)&&(e.resizeDiv.style.width=r+"px",s=r),/^(t|b)[^h]$/.test(t)?(e.resizeDiv.style.height=d+"px",a=d):/^(t|b)h$/.test(t)&&(e.resizeDiv.style.height=c+"px",a=c),e._resize_w=s,e._resize_h=a,this.util.changeTxt(e.resizeDisplay,this._w.Math.round(s)+" x "+this._w.Math.round(a)),e._isChange=!0},cancel_controller_resize:function(e){const t=this.context.resizing._rotateVertical;this.controllersOff(),this.context.element.resizeBackground.style.display="none";let n=this._w.Math.round(t?this.context.resizing._resize_h:this.context.resizing._resize_w),i=this._w.Math.round(t?this.context.resizing._resize_w:this.context.resizing._resize_h);if(!t&&!/%$/.test(n)){const e=16,t=this.context.element.wysiwygFrame.clientWidth-2*e-2;this.util.getNumber(n,0)>t&&(i=this._w.Math.round(i/n*t),n=t)}const l=this.context.resizing._resize_plugin;this.plugins[l].setSize.call(this,n,i,!1,e),this.selectComponent(this.context[l]._element,l)}};return void 0===t&&(e.SUNEDITOR_MODULES||Object.defineProperty(e,"SUNEDITOR_MODULES",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_MODULES,"resizing",{enumerable:!0,writable:!1,configurable:!1,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_MODULES a window with a document");return l(e)}:l(i)},"gjS+":function(e,t,n){"use strict";var i,l;i="undefined"!=typeof window?window:this,l=function(e,t){const n={name:"fileManager",_xmlHttp:null,upload:function(e,t,n,i,l){this.showLoading();const o=this.plugins.fileManager,s=o._xmlHttp=this.util.getXMLHttpRequest();if(s.onreadystatechange=o._callBackUpload.bind(this,s,i,l),s.open("post",e,!0),null!==t&&"object"==typeof t&&this._w.Object.keys(t).length>0)for(let e in t)s.setRequestHeader(e,t[e]);s.send(n)},_callBackUpload:function(e,t,n){if(4===e.readyState)if(200===e.status)try{t(e)}catch(e){throw Error('[SUNEDITOR.fileManager.upload.callBack.fail] cause : "'+e.message+'"')}finally{this.closeLoading()}else{this.closeLoading();const t=e.responseText?JSON.parse(e.responseText):e;if("function"!=typeof n||n("",t,this)){const n="[SUNEDITOR.fileManager.upload.serverException] status: "+e.status+", response: "+(t.errorMessage||e.responseText);throw this.functions.noticeOpen(n),Error(n)}}},checkInfo:function(e,t,n,i,l){let o=[];for(let e=0,n=t.length;e<n;e++)o=o.concat([].slice.call(this.context.element.wysiwyg.getElementsByTagName(t[e])));const s=this.context[e],a=s._infoList,r=this.plugins.fileManager.setInfo.bind(this);if(o.length===a.length){if(this._componentsInfoReset){for(let t=0,i=o.length;t<i;t++)r(e,o[t],n,null,l);return}{let e=!1;for(let t,n=0,i=a.length;n<i;n++)if(t=a[n],0===o.filter((function(e){return t.src===e.src&&t.index.toString()===e.getAttribute("data-index")})).length){e=!0;break}if(!e)return}}const c=l?this.context.resizing._resize_plugin:"";l&&(this.context.resizing._resize_plugin=e);const d=[],u=[];for(let e=0,t=a.length;e<t;e++)u[e]=a[e].index;for(let t,a=0,c=o.length;a<c;a++)t=o[a],this.util.getParentElement(t,this.util.isMediaComponent)&&/FIGURE/i.test(t.parentElement.nodeName)?!t.getAttribute("data-index")||u.indexOf(1*t.getAttribute("data-index"))<0?(d.push(s._infoIndex),t.removeAttribute("data-index"),r(e,t,n,null,l)):d.push(1*t.getAttribute("data-index")):(d.push(s._infoIndex),i(t));for(let e,t=0;t<a.length;t++)e=a[t].index,d.indexOf(e)>-1||(a.splice(t,1),"function"==typeof n&&n(null,e,"delete",null,0,this),t--);l&&(this.context.resizing._resize_plugin=c)},setInfo:function(e,t,n,i,l){const o=l?this.context.resizing._resize_plugin:"";l&&(this.context.resizing._resize_plugin=e);const s=this.plugins[e],a=this.context[e],r=a._infoList;let c=t.getAttribute("data-index"),d=null,u="";if(i||(i={name:t.getAttribute("data-file-name")||("string"==typeof t.src?t.src.split("/").pop():""),size:t.getAttribute("data-file-size")||0}),!c||this._componentsInfoInit)u="create",c=a._infoIndex++,t.setAttribute("data-index",c),t.setAttribute("data-file-name",i.name),t.setAttribute("data-file-size",i.size),d={src:t.src,index:1*c,name:i.name,size:i.size},r.push(d);else{u="update",c*=1;for(let e=0,t=r.length;e<t;e++)if(c===r[e].index){d=r[e];break}d||(c=a._infoIndex++,d={index:c},r.push(d)),d.src=t.src,d.name=t.getAttribute("data-file-name"),d.size=1*t.getAttribute("data-file-size")}if(d.element=t,d.delete=s.destroy.bind(this,t),d.select=function(e){e.scrollIntoView(!0),this._w.setTimeout(s.select.bind(this,e))}.bind(this,t),l){if(!t.getAttribute("origin-size")&&t.naturalWidth&&t.setAttribute("origin-size",t.naturalWidth+","+t.naturalHeight),!t.getAttribute("data-origin")){const e=this.util.getParentElement(t,this.util.isMediaComponent),n=this.util.getParentElement(t,"FIGURE"),i=this.plugins.resizing._module_getSizeX.call(this,a,t,n,e),l=this.plugins.resizing._module_getSizeY.call(this,a,t,n,e);t.setAttribute("data-origin",i+","+l),t.setAttribute("data-size",i+","+l)}if(!t.style.width){const e=(t.getAttribute("data-size")||t.getAttribute("data-origin")||"").split(",");s.onModifyMode.call(this,t,null),s.applySize.call(this,e[0],e[1])}this.context.resizing._resize_plugin=o}"function"==typeof n&&n(t,c,u,d,--a._uploadFileLength<0?0:a._uploadFileLength,this)},deleteInfo:function(e,t,n){if(t>=0){const i=this.context[e]._infoList;for(let e=0,l=i.length;e<l;e++)if(t===i[e].index)return i.splice(e,1),void("function"==typeof n&&n(null,t,"delete",null,0,this))}},resetInfo:function(e,t){const n=this.context[e];if("function"==typeof t){const e=n._infoList;for(let n=0,i=e.length;n<i;n++)t(null,e[n].index,"delete",null,0,this)}n._infoList=[],n._infoIndex=0}};return void 0===t&&(e.SUNEDITOR_MODULES||Object.defineProperty(e,"SUNEDITOR_MODULES",{enumerable:!0,writable:!1,configurable:!1,value:{}}),Object.defineProperty(e.SUNEDITOR_MODULES,"fileManager",{enumerable:!0,writable:!1,configurable:!1,value:n})),n},"object"==typeof e.exports?e.exports=i.document?l(i,!0):function(e){if(!e.document)throw new Error("SUNEDITOR_MODULES a window with a document");return l(e)}:l(i)}});
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9kaWFsb2cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9maWxlQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGFuZy9lbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9tb2R1bGVzL19jb2xvclBpY2tlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2ZvbnRDb2xvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2hpbGl0ZUNvbG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL2xpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL2ltYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL2RpYWxvZy92aWRlby5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9kaWFsb2cvYXVkaW8uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL21hdGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvY29tbWFuZC9ibG9ja3F1b3RlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvYWxpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS9mb250LmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvZm9udFNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS9ob3Jpem9udGFsUnVsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS90YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2Zvcm1hdEJsb2NrLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvbGluZUhlaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L3BhcmFncmFwaFN0eWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvdGV4dFN0eWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL2ZpbGVCcm93c2VyL2ltYWdlR2FsbGVyeS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2RlZmF1bHRJY29ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpYi9jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9fbm90aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9zdW5lZGl0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpYi9jb3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9saWIvaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VuZWRpdG9yX2J1aWxkLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvcmVzaXppbmcuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9maWxlTWFuYWdlci5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImdsb2JhbCIsImZhY3RvcnkiLCJ3aW5kb3ciLCJ0aGlzIiwibm9HbG9iYWwiLCJkaWFsb2ciLCJhZGQiLCJjb3JlIiwiY29udGV4dCIsImtpbmQiLCJ1cGRhdGVNb2RhbCIsIl9jbG9zZVNpZ25hbCIsImRpYWxvZ19kaXYiLCJ1dGlsIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImRpYWxvZ19iYWNrIiwic3R5bGUiLCJkaXNwbGF5IiwiZGlhbG9nX2FyZWEiLCJhcHBlbmRDaGlsZCIsIm1vZGFsQXJlYSIsImJhY2siLCJtb2RhbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfb25Nb3VzZURvd25fZGlhbG9nIiwiX29uQ2xpY2tfZGlhbG9nIiwiZWxlbWVudCIsInJlbGF0aXZlIiwiZSIsInRlc3QiLCJ0YXJnZXQiLCJzdG9wUHJvcGFnYXRpb24iLCJnZXRBdHRyaWJ1dGUiLCJwbHVnaW5zIiwiY2xvc2UiLCJvcGVuIiwidXBkYXRlIiwibW9kYWxGb3JtIiwiX2JpbmRDbG9zZSIsIl9kIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImtleUNvZGUiLCJvcHRpb25zIiwicG9wdXBEaXNwbGF5IiwicG9zaXRpb24iLCJmb2N1c0VsZW1lbnQiLCJvbiIsImZvY3VzIiwiaW5pdCIsIlNVTkVESVRPUl9NT0RVTEVTIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJkb2N1bWVudCIsInciLCJFcnJvciIsImZpbGVCcm93c2VyIiwiX3htbEh0dHAiLCJfbG9hZGluZyIsImFyZWEiLCJoZWFkZXIiLCJ0YWdBcmVhIiwiYm9keSIsImxpc3QiLCJ0YWdFbGVtZW50cyIsIml0ZW1zIiwic2VsZWN0ZWRUYWdzIiwic2VsZWN0b3JIYW5kbGVyIiwiY29udGV4dFBsdWdpbiIsImNvbHVtblNpemUiLCJicm93c2VyX2RpdiIsImNvbnRlbnQiLCJpbm5lckhUTUwiLCJzZXRfYnJvd3NlciIsInF1ZXJ5U2VsZWN0b3IiLCJ0aXRsZUFyZWEiLCJvbkNsaWNrVGFnIiwib25DbGlja0ZpbGUiLCJfb25Nb3VzZURvd25fYnJvd3NlciIsIl9vbkNsaWNrX2Jyb3dzZXIiLCJsYW5nIiwiZGlhbG9nQm94IiwiaWNvbnMiLCJjYW5jZWwiLCJwbHVnaW5OYW1lIiwiZmlsZUJyb3dzZXJDb250ZXh0IiwicGx1Z2luQ29udGV4dCIsImxpc3RDbGFzc05hbWUiLCJsaXN0Q2xhc3MiLCJoYXNDbGFzcyIsInRleHRDb250ZW50IiwidGl0bGUiLCJfZHJhd0ZpbGVMaXN0IiwidXJsIiwiZmlsZUJyb3dzZXJQbHVnaW4iLCJhYm9ydCIsInNob3dCcm93c2VyTG9hZGluZyIsImNsb3NlQnJvd3NlckxvYWRpbmciLCJ4bWxIdHRwIiwiZ2V0WE1MSHR0cFJlcXVlc3QiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfY2FsbEJhY2tHZXQiLCJzZW5kIiwicmVhZHlTdGF0ZSIsInN0YXR1cyIsIl9kcmF3TGlzdEl0ZW0iLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJyZXN1bHQiLCJtZXNzYWdlIiwibWF4SGVpZ2h0IiwiX3ciLCJpbm5lckhlaWdodCIsIm9mZnNldEhlaWdodCIsInJlcyIsImVyciIsImVycm9yTWVzc2FnZSIsIl90YWdzIiwibGVuIiwibGVuZ3RoIiwic3BsaXRTaXplIiwiTWF0aCIsInJvdW5kIiwiZHJhd0l0ZW1IYW5kbGVyIiwiaXRlbVRlbXBsYXRlSGFuZGxlciIsInRhZ3NIVE1MIiwibGlzdEhUTUwiLCJjb2x1bW5zIiwiaXRlbSIsInRhZ3MiLCJ0YWciLCJzcGxpdCIsIm1hcCIsInYiLCJ0cmltIiwidExlbiIsImluZGV4T2YiLCJwdXNoIiwicXVlcnlTZWxlY3RvckFsbCIsImlzQW5jaG9yIiwidGFnTmFtZSIsInNlbGVjdFRhZyIsInNUYWdJbmRleCIsInNwbGljZSIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJmaWx0ZXIiLCJzb21lIiwicHJldmVudERlZmF1bHQiLCJsaXN0RWwiLCJjb21tYW5kIiwicGFyZW50Tm9kZSIsImhhbmRsZXIiLCJjb2RlIiwidG9vbGJhciIsImRlZmF1bHQiLCJzYXZlIiwiZm9udCIsImZvcm1hdHMiLCJmb250U2l6ZSIsImJvbGQiLCJ1bmRlcmxpbmUiLCJpdGFsaWMiLCJzdHJpa2UiLCJzdWJzY3JpcHQiLCJzdXBlcnNjcmlwdCIsInJlbW92ZUZvcm1hdCIsImZvbnRDb2xvciIsImhpbGl0ZUNvbG9yIiwiaW5kZW50Iiwib3V0ZGVudCIsImFsaWduIiwiYWxpZ25MZWZ0IiwiYWxpZ25SaWdodCIsImFsaWduQ2VudGVyIiwiYWxpZ25KdXN0aWZ5Iiwib3JkZXJMaXN0IiwidW5vcmRlckxpc3QiLCJob3Jpem9udGFsUnVsZSIsImhyX3NvbGlkIiwiaHJfZG90dGVkIiwiaHJfZGFzaGVkIiwidGFibGUiLCJsaW5rIiwibWF0aCIsImltYWdlIiwidmlkZW8iLCJhdWRpbyIsImZ1bGxTY3JlZW4iLCJzaG93QmxvY2tzIiwiY29kZVZpZXciLCJ1bmRvIiwicmVkbyIsInByZXZpZXciLCJwcmludCIsInRhZ19wIiwidGFnX2RpdiIsInRhZ19oIiwidGFnX2Jsb2NrcXVvdGUiLCJ0YWdfcHJlIiwidGVtcGxhdGUiLCJsaW5lSGVpZ2h0IiwicGFyYWdyYXBoU3R5bGUiLCJ0ZXh0U3R5bGUiLCJpbWFnZUdhbGxlcnkiLCJtZW50aW9uIiwibGlua0JveCIsInRleHQiLCJuZXdXaW5kb3dDaGVjayIsImJvb2ttYXJrIiwibWF0aEJveCIsImlucHV0TGFiZWwiLCJmb250U2l6ZUxhYmVsIiwicHJldmlld0xhYmVsIiwiaW1hZ2VCb3giLCJmaWxlIiwiYWx0VGV4dCIsInZpZGVvQm94IiwiYXVkaW9Cb3giLCJicm93c2VyIiwic2VhcmNoIiwiY2FwdGlvbiIsInN1Ym1pdEJ1dHRvbiIsInJldmVydEJ1dHRvbiIsInByb3BvcnRpb24iLCJiYXNpYyIsImxlZnQiLCJyaWdodCIsImNlbnRlciIsIndpZHRoIiwiaGVpZ2h0Iiwic2l6ZSIsInJhdGlvIiwiY29udHJvbGxlciIsImVkaXQiLCJ1bmxpbmsiLCJyZW1vdmUiLCJpbnNlcnRSb3dBYm92ZSIsImluc2VydFJvd0JlbG93IiwiZGVsZXRlUm93IiwiaW5zZXJ0Q29sdW1uQmVmb3JlIiwiaW5zZXJ0Q29sdW1uQWZ0ZXIiLCJkZWxldGVDb2x1bW4iLCJmaXhlZENvbHVtbldpZHRoIiwicmVzaXplMTAwIiwicmVzaXplNzUiLCJyZXNpemU1MCIsInJlc2l6ZTI1IiwiYXV0b1NpemUiLCJtaXJyb3JIb3Jpem9udGFsIiwibWlycm9yVmVydGljYWwiLCJyb3RhdGVMZWZ0Iiwicm90YXRlUmlnaHQiLCJtYXhTaXplIiwibWluU2l6ZSIsInRhYmxlSGVhZGVyIiwibWVyZ2VDZWxscyIsInNwbGl0Q2VsbHMiLCJIb3Jpem9udGFsU3BsaXQiLCJWZXJ0aWNhbFNwbGl0IiwibWVudSIsInNwYWNlZCIsImJvcmRlcmVkIiwibmVvbiIsInRyYW5zbHVjZW50Iiwic2hhZG93IiwiU1VORURJVE9SX0xBTkciLCJjb2xvclBpY2tlciIsImNvbG9yTGlzdEhUTUwiLCJfY29sb3JJbnB1dCIsIl9kZWZhdWx0Q29sb3IiLCJfc3R5bGVQcm9wZXJ0eSIsIl9jdXJyZW50Q29sb3IiLCJfY29sb3JMaXN0IiwibGlzdERpdiIsImNyZWF0ZUNvbG9yTGlzdCIsIl9tYWtlQ29sb3JMaXN0IiwibWFrZUNvbG9yIiwib3B0aW9uIiwiY29sb3JMaXN0IiwiY29sb3JBcnIiLCJjb2xvciIsImNoZWNrZWQiLCJlcmFzZSIsIm5vZGUiLCJmaWxsQ29sb3IiLCJnZXRDb2xvckluTm9kZSIsImlzSGV4Q29sb3IiLCJyZ2IyaGV4IiwidG9Mb3dlckNhc2UiLCJzZXRJbnB1dFRleHQiLCJjb2xvck5hbWUyaGV4Iiwic2V0Q3VycmVudENvbG9yIiwiaGV4Q29sb3JTdHIiLCJib3JkZXJDb2xvciIsImZpbmRDb2xvciIsInN0eWxlUHJvcGVydHkiLCJpc1d5c2l3eWdEaXYiLCJub2RlVHlwZSIsInN0ciIsInJnYiIsInJnYk1hdGNoIiwibWF0Y2giLCJwYXJzZUludCIsInRvU3RyaW5nIiwic2xpY2UiLCJjb2xvck5hbWUiLCJ0ZW1wIiwiY29sb3JzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImEiLCJyZW1vdmVJdGVtIiwic3Vic3RyIiwidGFyZ2V0RWxlbWVudCIsImFkZE1vZHVsZSIsInByZXZpZXdFbCIsImNvbG9ySW5wdXQiLCJzZXRTdWJtZW51Iiwib25DaGFuZ2VJbnB1dCIsInN1Ym1pdCIsInBpY2t1cCIsImluaXRNZW51VGFyZ2V0IiwiY29sb3JBcmVhIiwiY29udGV4dFBpY2tlciIsImNvbnRleHRGb250Q29sb3IiLCJnZXRTZWxlY3Rpb25Ob2RlIiwiYXBwbHlDb2xvciIsIm5vZGVDaGFuZ2UiLCJzdWJtZW51T2ZmIiwibmV3Tm9kZSIsImNvbnRleHRIaWxpdGVDb2xvciIsImJhY2tncm91bmRDb2xvciIsInRlbXBsYXRlRGl2IiwidGVtcGxhdGVMaXN0IiwidGVtcGxhdGVzIiwiaHRtbCIsInNldENvbnRlbnRzIiwibGlua05ld1dpbmRvd0NoZWNrIiwibGlua0FuY2hvclRleHQiLCJfbGlua0FuY2hvciIsIl9saW5rVmFsdWUiLCJsaW5rX2RpYWxvZyIsInNldERpYWxvZyIsImJvb2ttYXJrQnV0dG9uIiwicmVsIiwibGlua1JlbCIsImxpbmtfY29udHJvbGxlciIsInNldENvbnRyb2xsZXJfTGlua0J1dHRvbiIsImxpbmtDb250cm9sbGVyIiwib25DbGlja19saW5rQ29udHJvbGxlciIsIl9vbkxpbmtQcmV2aWV3IiwibGlua1Byb3RvY29sIiwib25DbGlja19ib29rbWFya0J1dHRvbiIsInByb3RvY29sIiwibGlua19idG4iLCJkZWxldGUiLCJjdXJyZW50Q29udHJvbGxlck5hbWUiLCJsaW5rSFRUUCIsIl91cGRhdGVBbmNob3IiLCJhbmNob3IiLCJhbHQiLCJ0YXJnZXRFbCIsInJlbEVsIiwiaWQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJocmVmIiwic2VsZWN0ZWRJbmRleCIsInNob3dMb2FkaW5nIiwic3VibWl0QWN0aW9uIiwiY29udGV4dExpbmsiLCJhbmNob3JUZXh0IiwidGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwic2V0UmFuZ2UiLCJvQSIsInNlbGVjdGVkRm9ybWF0cyIsImdldFNlbGVjdGVkRWxlbWVudHMiLCJvRm9ybWF0Iiwibm9kZU5hbWUiLCJpbnNlcnROb2RlIiwiY2xvc2VMb2FkaW5nIiwiaGlzdG9yeSIsImFjdGl2ZSIsImNvbnRyb2xsZXJBcnJheSIsImNhbGxfY29udHJvbGxlciIsImNvbnRyb2xsZXJzT2ZmIiwiZ2V0U2VsZWN0aW9uIiwic2VsZWN0aW9uQVRhZyIsImVkaXRMaW5rIiwibGlua0J0biIsInNldENvbnRyb2xsZXJQb3NpdGlvbiIsInRvcCIsImNvbnRyb2xsZXJzT24iLCJzYyIsImdldENoaWxkRWxlbWVudCIsImN1cnJlbnQiLCJlYyIsImNvbXBvbmVudCIsInJlc2l6aW5nIiwiZmlsZU1hbmFnZXIiLCJjb250ZXh0SW1hZ2UiLCJfaW5mb0xpc3QiLCJfaW5mb0luZGV4IiwiX3VwbG9hZEZpbGVMZW5ndGgiLCJzaXplVW5pdCIsIl9pbWFnZVNpemVVbml0IiwiX2FsdFRleHQiLCJfbGlua0VsZW1lbnQiLCJfYWxpZ24iLCJfZmxvYXRDbGFzc1JlZ0V4cCIsIl92X2xpbmsiLCJfdl9zcmMiLCJzdmdEZWZhdWx0U2l6ZSIsImJhc2U2NFJlbmRlckluZGV4IiwiX2VsZW1lbnQiLCJfY292ZXIiLCJfY29udGFpbmVyIiwiaW5wdXRYIiwiaW5wdXRZIiwiX2VsZW1lbnRfdyIsIl9lbGVtZW50X2giLCJfZWxlbWVudF9sIiwiX2VsZW1lbnRfdCIsIl9kZWZhdWx0U2l6ZVgiLCJfZGVmYXVsdFNpemVZIiwiX29yaWdpbl93IiwiaW1hZ2VXaWR0aCIsIl9vcmlnaW5faCIsImltYWdlSGVpZ2h0IiwiX3Byb3BvcnRpb25DaGVja2VkIiwiX3Jlc2l6aW5nIiwiaW1hZ2VSZXNpemluZyIsIl9yZXNpemVEb3RIaWRlIiwiaW1hZ2VIZWlnaHRTaG93IiwiX3JvdGF0aW9uIiwiaW1hZ2VSb3RhdGlvbiIsIl9vbmx5UGVyY2VudGFnZSIsImltYWdlU2l6ZU9ubHlQZXJjZW50YWdlIiwiX3JhdGlvIiwiX3JhdGlvWCIsIl9yYXRpb1kiLCJfY2FwdGlvblNob3ciLCJfY2FwdGlvbkNoZWNrZWQiLCJfY2FwdGlvbiIsImNhcHRpb25DaGVja0VsIiwiaW1hZ2VfZGlhbG9nIiwiaW1nSW5wdXRGaWxlIiwiaW1nVXJsRmlsZSIsImltZ0xpbmsiLCJpbWdMaW5rTmV3V2luZG93Q2hlY2siLCJwcmV2aWV3TGluayIsInByZXZpZXdTcmMiLCJvcGVuVGFiIiwiX3JlbW92ZVNlbGVjdGVkRmlsZXMiLCJfZmlsZUlucHV0Q2hhbmdlIiwiaW1hZ2VHYWxsZXJ5QnV0dG9uIiwiX29wZW5HYWxsZXJ5Iiwic2V0SW5wdXRTaXplIiwic2V0UmF0aW8iLCJzaXplUmV2ZXJ0IiwiaW1hZ2VGaWxlSW5wdXQiLCJpbWFnZUFjY2VwdCIsImltYWdlTXVsdGlwbGVGaWxlIiwiaW1hZ2VVcmxJbnB1dCIsImltYWdlR2FsbGVyeVVybCIsImltYWdlX2dhbGxlcnkiLCJvbmx5UGVyY2VudGFnZSIsIm9ubHlQZXJjZW50RGlzcGxheSIsImhlaWdodERpc3BsYXkiLCJyZXZlcnQiLCJzZXRBdHRyaWJ1dGUiLCJ0ZXh0RGVjb3JhdGlvbiIsInVybElucHV0IiwiY2FsbFBsdWdpbiIsIl9zZXRVcmxJbnB1dCIsInNyYyIsImZpbGVUYWdzIiwic2VsZWN0Iiwib25Nb2RpZnlNb2RlIiwiY2FsbF9jb250cm9sbGVyX3Jlc2l6ZSIsImRlc3Ryb3kiLCJpbWFnZUVsIiwiaW1hZ2VDb250YWluZXIiLCJnZXRQYXJlbnRFbGVtZW50IiwiaXNNZWRpYUNvbXBvbmVudCIsImRhdGFJbmRleCIsImZvY3VzRWwiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZW1wdHlEaXYiLCJ3eXNpd3lnIiwicmVtb3ZlSXRlbUFsbFBhcmVudHMiLCJmb2N1c0VkZ2UiLCJkZWxldGVJbmZvIiwiZnVuY3Rpb25zIiwib25JbWFnZVVwbG9hZCIsInRhYk5hbWUiLCJ0YWJDb250ZW50IiwidGFiTGlua3MiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW1hZ2VQbHVnaW4iLCJ1cGRhdGVfaW1hZ2UiLCJmaWxlcyIsIm9uUmVuZGVyX2ltZ1VybCIsImVycm9yIiwiZmlsZUxpc3QiLCJmaWxlU2l6ZSIsInR5cGUiLCJsaW1pdFNpemUiLCJpbWFnZVVwbG9hZFNpemVMaW1pdCIsImluZm9TaXplIiwiaW1hZ2VzSW5mbyIsIm9uSW1hZ2VVcGxvYWRFcnJvciIsIm5vdGljZU9wZW4iLCJpbmZvIiwibGlua1ZhbHVlIiwibGlua05ld1dpbmRvdyIsImlucHV0V2lkdGgiLCJpbnB1dEhlaWdodCIsImlzVXBkYXRlIiwib25JbWFnZVVwbG9hZEJlZm9yZSIsImRhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJyZWdpc3RlciIsInVwbG9hZCIsInJlc3BvbnNlIiwiaW1hZ2VVcGxvYWRVcmwiLCJmaWxlc0xlbiIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJpbWFnZVVwbG9hZEhlYWRlciIsImNhbGxCYWNrX2ltZ1VwbG9hZCIsInNldHVwX3JlYWRlciIsImltYWdlVXBsb2FkSGFuZGxlciIsInVwZGF0ZV9zcmMiLCJjcmVhdGVfaW1hZ2UiLCJpbWdMaW5rVmFsdWUiLCJ3RmlsZVJlYWRlciIsIkZpbGVSZWFkZXIiLCJmaWxlc1N0YWNrIiwicmVhZGVyIiwib25sb2FkIiwidXBkYXRlRWxlbWVudCIsImluZGV4Iiwib25SZW5kZXJfaW1nQmFzZTY0IiwicmVhZEFzRGF0YVVSTCIsInVwZGF0ZU1ldGhvZCIsImNyZWF0ZU1ldGhvZCIsInBvcCIsIm9uUmVuZGVyX2xpbmsiLCJpbWdUYWciLCJ4eSIsIl9tb2R1bGVfc2V0SW5wdXRTaXplIiwiX21vZHVsZV9zZXRSYXRpbyIsImNoZWNrRmlsZUluZm8iLCJtb2RpZnlIYW5kbGVyIiwib3Blbk1vZGlmeSIsImNoZWNrSW5mbyIsInJlc2V0RmlsZUluZm8iLCJyZXNldEluZm8iLCJfcmVzaXplX3BsdWdpbiIsIm9JbWciLCJjb3ZlciIsInNldF9jb3ZlciIsImNvbnRhaW5lciIsInNldF9jb250YWluZXIiLCJjcmVhdGVfY2FwdGlvbiIsImFwcGx5U2l6ZSIsInNldEFsaWduIiwiX2ltYWdlX2NyZWF0ZV9vbmxvYWQiLCJpbnNlcnRDb21wb25lbnQiLCJzZXRJbmZvIiwib2Zmc2V0V2lkdGgiLCJzZWxlY3RDb21wb25lbnQiLCJvcGVuQ29udHJvbGxlciIsIm5vdEhpc3RvcnlQdXNoIiwiY2hhbmdlU2l6ZSIsImlzTmV3Q29udGFpbmVyIiwiY2xvbmVOb2RlIiwieCIsImlzTnVtYmVyIiwieSIsIm1vZGlmaWVkQ2FwdGlvbiIsImNvbnRhaW5zIiwibmV3RWwiLCJpbnNlcnRCZWZvcmUiLCJpbWFnZUVsZW1lbnQiLCJyZW1vdmVDaGlsZCIsImV4aXN0RWxlbWVudCIsImlzUmFuZ2VGb3JtYXRFbGVtZW50IiwiZ2V0Rm9ybWF0RWxlbWVudCIsImlzRm9ybWF0RWxlbWVudCIsInJlcGxhY2VDaGlsZCIsIl9yb3RhdGVWZXJ0aWNhbCIsInJlc2V0VHJhbnNmb3JtIiwic2V0VHJhbnNmb3JtU2l6ZSIsImdldE51bWJlciIsInNldFRpbWVvdXQiLCJmbG9hdCIsImgiLCJ1c2VyU2l6ZSIsIm5vdE9wZW4iLCJfbW9kdWxlX3NldE1vZGlmeUlucHV0U2l6ZSIsInNldFBlcmNlbnRTaXplIiwic2V0U2l6ZSIsInNldEF1dG9TaXplIiwiX21vZHVsZV9zaXplUmV2ZXJ0Iiwibm90UmVzZXRQZXJjZW50YWdlIiwiZGlyZWN0aW9uIiwib25seVciLCJjYW5jZWxQZXJjZW50QXR0ciIsIl9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplIiwibWF4V2lkdGgiLCJzZXRPcmlnaW5TaXplIiwib3JpZ2luU2l6ZSIsImhlaWdodFBlcmNlbnRhZ2UiLCJzZXRDYXB0aW9uUG9zaXRpb24iLCJtYXJnaW4iLCJtaW5XaWR0aCIsImNvbnRleHRWaWRlbyIsIl92aWRlb1NpemVVbml0IiwiX3lvdXR1YmVRdWVyeSIsInlvdXR1YmVRdWVyeSIsIl92aWRlb1JhdGlvIiwidmlkZW9SYXRpbyIsIl9kZWZhdWx0UmF0aW8iLCJ2aWRlb1dpZHRoIiwidmlkZW9IZWlnaHQiLCJ2aWRlb1Jlc2l6aW5nIiwidmlkZW9IZWlnaHRTaG93IiwidmlkZW9Sb3RhdGlvbiIsInZpZGVvU2l6ZU9ubHlQZXJjZW50YWdlIiwidmlkZW9fZGlhbG9nIiwidmlkZW9JbnB1dEZpbGUiLCJ2aWRlb1VybEZpbGUiLCJ2aWRlb1JhdGlvT3B0aW9uIiwic2V0VmlkZW9SYXRpbyIsInZpZGVvRmlsZUlucHV0IiwidmlkZW9BY2NlcHQiLCJ2aWRlb011bHRpcGxlRmlsZSIsInZpZGVvVXJsSW5wdXQiLCJyYXRpb0xpc3QiLCJ2aWRlb1JhdGlvTGlzdCIsInJhdGlvRGlzcGxheSIsInZpZGVvUmF0aW9TaG93Iiwib25seVdpZHRoRGlzcGxheSIsIl9zZXRUYWdBdHRycyIsImF0dHJzIiwidmlkZW9UYWdBdHRycyIsImhhc093biIsImNyZWF0ZVZpZGVvVGFnIiwidmlkZW9UYWciLCJfc2V0SWZyYW1lQXR0cnMiLCJmcmFtZUJvcmRlciIsImFsbG93RnVsbHNjcmVlbiIsInZpZGVvSWZyYW1lQXR0cnMiLCJjcmVhdGVJZnJhbWVUYWciLCJpZnJhbWVUYWciLCJmcmFtZSIsIm9uVmlkZW9VcGxvYWQiLCJkaXNhYmxlZCIsInNldFZpZGVvUmF0aW9TZWxlY3QiLCJwbGFjZWhvbGRlciIsInZpZGVvUGx1Z2luIiwic2V0dXBfdXJsIiwidmlkZW9VcGxvYWRTaXplTGltaXQiLCJ2aWRlb3NJbmZvIiwib25WaWRlb1VwbG9hZEVycm9yIiwib25WaWRlb1VwbG9hZEJlZm9yZSIsInZpZGVvVXBsb2FkVXJsIiwidmlkZW9VcGxvYWRIZWFkZXIiLCJjYWxsQmFja192aWRlb1VwbG9hZCIsInZpZGVvVXBsb2FkSGFuZGxlciIsImNyZWF0ZV92aWRlbyIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInJlcGxhY2UiLCJzcGxpdFVybCIsImVuZHNXaXRoIiwibGFzdEluZGV4T2YiLCJvRnJhbWUiLCJpc1lvdXR1YmUiLCJpc1ZpbWVvIiwibmV3VGFnIiwiaW5wdXRVcGRhdGUiLCJfbW9kdWxlX2dldFNpemVYIiwiX21vZHVsZV9nZXRTaXplWSIsImlzUGVyY2VudCIsImNoYW5nZWQiLCJfdXBkYXRlX3ZpZGVvQ292ZXIiLCJmaWdjYXB0aW9uIiwib3JpZ2luIiwicmF0aW9TZWxlY3RlZCIsInJhdGlvT3B0aW9ucyIsInNlbGVjdGVkIiwib25seUgiLCJwYWRkaW5nQm90dG9tIiwiZGF0YVNpemUiLCJjb250ZXh0QXVkaW8iLCJ0YXJnZXRTZWxlY3QiLCJhdWRpb1dpZHRoIiwiYXVkaW9IZWlnaHQiLCJhdWRpb19kaWFsb2ciLCJhdWRpb0lucHV0RmlsZSIsImF1ZGlvVXJsRmlsZSIsImF1ZGlvX2NvbnRyb2xsZXIiLCJzZXRDb250cm9sbGVyIiwib25DbGlja19jb250cm9sbGVyIiwiYXVkaW9GaWxlSW5wdXQiLCJhdWRpb0FjY2VwdCIsImF1ZGlvTXVsdGlwbGVGaWxlIiwiYXVkaW9VcmxJbnB1dCIsIl9jcmVhdGVBdWRpb1RhZyIsIm9BdWRpbyIsImNzc1RleHQiLCJhdWRpb1RhZ0F0dHJzIiwiaXNDb21wb25lbnQiLCJvbkF1ZGlvVXBsb2FkIiwidXBkYXRlQ292ZXIiLCJzZXR1cFVybCIsImF1ZGlvVXBsb2FkU2l6ZUxpbWl0IiwiYXVkaW9zSW5mbyIsIm9uQXVkaW9VcGxvYWRFcnJvciIsIm9uQXVkaW9VcGxvYWRCZWZvcmUiLCJhdWRpb1VwbG9hZFVybCIsImF1ZGlvVXBsb2FkSGVhZGVyIiwiY2FsbEJhY2tfdXBsb2FkIiwiYXVkaW9VcGxvYWRIYW5kbGVyIiwiY3JlYXRlX2F1ZGlvIiwic2VsZWN0aW9uVGFnIiwib25Db250cm9sbGVyT2ZmIiwicHJldmlld0VsZW1lbnQiLCJmb250U2l6ZUVsZW1lbnQiLCJfbWF0aEV4cCIsIm1hdGhfZGlhbG9nIiwiX3JlbmRlck1hdGhFeHAiLCJtYXRoX2NvbnRyb2xsZXIiLCJzZXRDb250cm9sbGVyX01hdGhCdXR0b24iLCJtYXRoQ29udHJvbGxlciIsIm9uQ2xpY2tfbWF0aENvbnRyb2xsZXIiLCJtYXRoX2J0biIsIm1hbmFnZWRUYWdzIiwibWV0aG9kIiwiZG9tIiwiY3JlYXRlUmFuZ2UiLCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiLCJfcmVuZGVyZXIiLCJIVE1MRGVjb2RlciIsImV4cCIsImthdGV4IiwicmVuZGVyVG9TdHJpbmciLCJjb250ZXh0TWF0aCIsIm1hdGhFeHAiLCJrYXRleEVsIiwiSFRNTEVuY29kZXIiLCJjb250YWluZXJFbCIsImVtcHR5IiwiY3JlYXRlVGV4dE5vZGUiLCJ6ZXJvV2lkdGhTcGFjZSIsIm5leHRTaWJsaW5nIiwibWF0aFRhZyIsIm1hdGhCdG4iLCJibG9ja3F1b3RlIiwidGFyZ2V0QnV0dG9uIiwiYWN0aW9uIiwiY3VycmVudEJsb2NrcXVvdGUiLCJkZXRhY2hSYW5nZUZvcm1hdEVsZW1lbnQiLCJhcHBseVJhbmdlRm9ybWF0RWxlbWVudCIsIl9hbGlnbkxpc3QiLCJjdXJyZW50QWxpZ24iLCJkZWZhdWx0RGlyIiwicnRsIiwianVzdGlmeSIsImFsaWduX2p1c3RpZnkiLCJhbGlnbl9sZWZ0IiwiYWxpZ25fcmlnaHQiLCJhbGlnbl9jZW50ZXIiLCJsaXN0VWwiLCJsZWZ0RGlyIiwibGVmdE1lbnUiLCJyaWdodE1lbnUiLCJhbGlnbkNvbnRleHQiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInRleHRBbGlnbiIsImNoYW5nZUVsZW1lbnQiLCJhbGlnbkxpc3QiLCJzZWxlY3RlZEZvcm1zdHMiLCJzZXRTdHlsZSIsImVmZmVjdE5vZGUiLCJ0YXJnZXRUZXh0IiwidGFyZ2V0VG9vbHRpcCIsIl9mb250TGlzdCIsImN1cnJlbnRGb250IiwiZm9udExpc3QiLCJ0b29sdGlwIiwiZm9udEZhbWlseSIsInNlbGVjdEZvbnQiLCJjaGFuZ2VUeHQiLCJmb250Q29udGV4dCIsIl9zaXplTGlzdCIsImN1cnJlbnRTaXplIiwic2l6ZUxpc3QiLCJ1bml0IiwiZm9udFNpemVVbml0IiwiZm9udFNpemVDb250ZXh0IiwiaG9yaXpvbnRhbFJ1bGVQaWNrIiwiYXBwZW5kSHIiLCJvSHIiLCJvTm9kZSIsIl9saXN0IiwiY3VycmVudExpc3QiLCJidWxsZXRzIiwibGlzdF9idWxsZXRzIiwibnVtYmVyIiwibGlzdF9udW1iZXIiLCJidXR0b24iLCJpY29uIiwiaXNMaXN0IiwibGlzdENvbnRleHQiLCJlZGl0TGlzdCIsInNlbGVjdGVkQ2VsbHMiLCJkZXRhY2giLCJyYW5nZSIsImdldFJhbmdlIiwiZ2V0U2VsZWN0ZWRFbGVtZW50c0FuZENvbXBvbmVudHMiLCJnZXRSYW5nZV9hZGRMaW5lIiwic29ydEJ5RGVwdGgiLCJmaXJzdFNlbCIsImxhc3RTZWwiLCJ0b3BFbCIsImlzTGlzdENlbGwiLCJib3R0b21FbCIsIm9yaWdpblJhbmdlIiwic3RhcnRDb250YWluZXIiLCJzbyIsInN0YXJ0T2Zmc2V0IiwiZW5kQ29udGFpbmVyIiwiZW8iLCJlbmRPZmZzZXQiLCJpc1JlbW92ZSIsImdldFJhbmdlRm9ybWF0RWxlbWVudCIsInRvVXBwZXJDYXNlIiwidG9wRWxQYXJlbnQiLCJib3R0b21FbFBhcmVudCIsIm1lcmdlVG9wIiwibWVyZ2VCb3R0b20iLCJmaXJzdExpc3QiLCJsYXN0TGlzdCIsInRvcE51bWJlciIsImJvdHRvbU51bWJlciIsInBhc3NDb21wb25lbnQiLCJuZXdDZWxsIiwiZlRhZyIsImlzQ2VsbCIsIm5leHQiLCJvcmlnaW5QYXJlbnQiLCJuZXh0UGFyZW50IiwicGFyZW50VGFnIiwic2libGluZ1RhZyIsInJhbmdlVGFnIiwiX2lzSWdub3JlTm9kZUNoYW5nZSIsImNvcHlGb3JtYXRBdHRyaWJ1dGVzIiwiaXNIUiIsIm91dGVySFRNTCIsImZDaGlsZHJlbiIsImNoaWxkcmVuIiwiZ2V0RWxlbWVudERlcHRoIiwiaiIsImN1cnJlbnRGb3JtYXQiLCJyYW5nZUFyciIsInRlbXBMaXN0IiwiX2RldGFjaE5lc3RlZCIsImYiLCJjZWxscyIsImZpcnN0IiwibGFzdCIsIm9yaWdpbkxpc3QiLCJzaWJsaW5nIiwiY0xlbiIsIm5ld0xpc3QiLCJnZXRQb3NpdGlvbkluZGV4IiwibWVyZ2VTYW1lVGFncyIsImVkZ2UiLCJnZXRFZGdlQ2hpbGROb2RlcyIsImNjIiwiZWRpdEluc2lkZUxpc3QiLCJjZWxsc0xlbiIsImVsIiwibGFzdENlbGwiLCJpbm5lckxpc3QiLCJwcmV2Iiwibm9kZVBhdGgiLCJzbCIsIl9pbnNpZWRMaXN0IiwiZ2V0Tm9kZUZyb21QYXRoIiwiaW5zZXJ0UHJldiIsImdldE5vZGVQYXRoIiwiZmlyc3RDaGlsZCIsInNsUGF0aCIsImxhc3RFbGVtZW50Q2hpbGQiLCJtZXJnZU5lc3RlZFRhZ3MiLCJjb250ZXh0VGFibGUiLCJfdGRFbGVtZW50IiwiX3RyRWxlbWVudCIsIl90ckVsZW1lbnRzIiwiX3RhYmxlWFkiLCJfbWF4V2lkdGgiLCJfZml4ZWRDb2x1bW4iLCJfcnRsIiwiY2VsbENvbnRyb2xsZXJUb3AiLCJ0YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24iLCJyZXNpemVUZXh0IiwiaGVhZGVyQnV0dG9uIiwibWVyZ2VCdXR0b24iLCJzcGxpdEJ1dHRvbiIsInNwbGl0TWVudSIsIm1heFRleHQiLCJtaW5UZXh0IiwiX3BoeXNpY2FsX2NlbGxDbnQiLCJfbG9naWNhbF9jZWxsQ250IiwiX3Jvd0NudCIsIl9yb3dJbmRleCIsIl9waHlzaWNhbF9jZWxsSW5kZXgiLCJfbG9naWNhbF9jZWxsSW5kZXgiLCJfY3VycmVudF9jb2xTcGFuIiwiX2N1cnJlbnRfcm93U3BhbiIsImV4cGFuc2lvbiIsInJlZHVjdGlvbiIsInRhYmxlUGlja2VyIiwidGFibGVIaWdobGlnaHQiLCJ0YWJsZVVuSGlnaGxpZ2h0IiwidGFibGVEaXNwbGF5IiwidGFibGVDb250cm9sbGVyIiwic2V0Q29udHJvbGxlcl90YWJsZSIsInJlc2l6ZUJ1dHRvbiIsImNvbHVtbkZpeGVkQnV0dG9uIiwicmVzaXplRGl2Iiwic2V0Q29udHJvbGxlcl90YWJsZUVkaXRvciIsImluc2VydFJvd0Fib3ZlQnV0dG9uIiwiaW5zZXJ0Um93QmVsb3dCdXR0b24iLCJvbk1vdXNlTW92ZV90YWJsZVBpY2tlciIsImFwcGVuZFRhYmxlIiwib25DbGlja190YWJsZUNvbnRyb2xsZXIiLCJ0YWJsZVJlc2l6ZSIsImZpeGVkX2NvbHVtbl93aWR0aCIsInRhYmxlX2hlYWRlciIsImluc2VydF9yb3dfYWJvdmUiLCJpbnNlcnRfcm93X2JlbG93IiwiZGVsZXRlX3JvdyIsIm1lcmdlX2NlbGwiLCJpbnNlcnRfY29sdW1uX2xlZnQiLCJpbnNlcnRfY29sdW1uX3JpZ2h0IiwiZGVsZXRlX2NvbHVtbiIsInNwbGl0X2NlbGwiLCJvVGFibGUiLCJjcmVhdGVDZWxscyIsInRhYmxlSFRNTCIsImZpcnN0VGQiLCJyZXNldF90YWJsZV9waWNrZXIiLCJjbnQiLCJyZXR1cm5FbGVtZW50IiwiY2VsbCIsImNlbGxzSFRNTCIsImNlaWwiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImhpZ2hsaWdodCIsInVuSGlnaGxpZ2h0IiwidGFibGVQbHVnaW4iLCJfcmVtb3ZlRXZlbnRzIiwiX3NlbGVjdGVkVGFibGUiLCJfdG9nZ2xlRWRpdG9yIiwiX3NoaWZ0IiwiX3NlbGVjdGVkQ2VsbHMiLCJfcmVmIiwiX2ZpeGVkQ2VsbCIsIl9zZWxlY3RlZENlbGwiLCJfZml4ZWRDZWxsTmFtZSIsImNhbGxfY29udHJvbGxlcl90YWJsZUVkaXQiLCJ0ZEVsZW1lbnQiLCJpc0NvbGxhcHNlZCIsInRhYmxlRWxlbWVudCIsInRhYmxlTGF5b3V0Iiwic2V0VGFibGVTdHlsZSIsInNldFBvc2l0aW9uQ29udHJvbGxlclRvcCIsInNldFBvc2l0aW9uQ29udHJvbGxlckRpdiIsInJlc2V0Iiwic2V0Q2VsbEluZm8iLCJyb3dzIiwiY2VsbEluZGV4IiwiY2VsbENudCIsImNvbFNwYW4iLCJyb3dJbmRleCIsInJvd1NwYW4iLCJyb3dTcGFuQXJyIiwic3BhbkluZGV4IiwiY3MiLCJycyIsImxvZ2NhbEluZGV4IiwiYXJyIiwicm93IiwiY29uY2F0Iiwic29ydCIsImIiLCJlZGl0VGFibGUiLCJpc1JvdyIsInRhYmxlQXR0ciIsInBvc2l0aW9uQ2VsbCIsImVkaXRSb3ciLCJyZW1vdmVDZWxscyIsImZpcnN0Um93IiwicmlnaHRDZWxsIiwiZWRpdENlbGwiLCJwb3NpdGlvblJlc2V0RWxlbWVudCIsInVwIiwib3JpZ2luUm93SW5kZXgiLCJzaWduIiwic3BhbkNlbGxzIiwic3BhbkNlbGwiLCJzaGlmdCIsImluc2VydFJvdyIsInBhc3NDZWxsIiwicmVtb3ZlQ2VsbCIsInJlbW92ZVNwYW5BcnIiLCJpbnNlcnRJbmRleCIsImFwcGx5U3BhbiIsImNlbGxDb2xTcGFuIiwicmVtb3ZlSW5kZXgiLCJnZXRPdmVybGFwUmFuZ2VBdEluZGV4IiwicmVtb3ZlRmlyc3QiLCJyZW1vdmVFbmQiLCJyTGVuIiwiZ2V0QXJyYXlJbmRleCIsInJvd1NwYW5DZWxsIiwiX2Nsb3NlU3BsaXRNZW51Iiwib3BlblNwbGl0TWVudSIsInJlbW92ZURvY0V2ZW50IiwiYWRkRG9jRXZlbnQiLCJ2ZXJ0aWNhbCIsImN1cnJlbnRDZWxsIiwiY3VycmVudFJvdyIsImN1cnJlbnRDb2xTcGFuIiwiZmxvb3IiLCJjdXJyZW50Um93U3BhbiIsIm5ld1Jvd1NwYW4iLCJuZXh0Um93SW5kZXgiLCJuZXh0Um93IiwibmV4dENlbGxzIiwibmV3Um93IiwicGh5c2ljYWxJbmRleCIsInJlZiIsIm1lcmdlQ2VsbCIsImVtcHR5Um93Rmlyc3QiLCJlbXB0eVJvd0xhc3QiLCJjZSIsInJlIiwibWVyZ2VIVE1MIiwiY2giLCJvbmx5WmVyb1dpZHRoU3BhY2UiLCJyb3dJbmRleEZpcnN0Iiwicm93SW5kZXhMYXN0IiwicmVtb3ZlUm93cyIsInNldEFjdGl2ZUJ1dHRvbiIsInRvZ2dsZUhlYWRlciIsInRvZ2dsZUNsYXNzIiwic3R5bGVzIiwic3BhbiIsInNpemVJY29uIiwiZml4ZWRDZWxsIiwic2VsZWN0ZWRDZWxsIiwiX2JpbmRPblNlbGVjdCIsIl9iaW5kT2ZmU2VsZWN0IiwiX2JpbmRPZmZTaGlmdCIsImVuYWJsZWQiLCJfb2ZmQ2VsbE11bHRpU2VsZWN0IiwiX2luaXRCaW5kIiwiX3dkIiwiX29uQ2VsbE11bHRpU2VsZWN0IiwiX2FudGlCbHVyIiwiX3NldE11bHRpQ2VsbHMiLCJzdGFydENlbGwiLCJlbmRDZWxsIiwiZmluZFNlbGVjdGVkQ2VsbCIsIl9pIiwibmV3Q3MiLCJuZXdDZSIsIm5ld1JzIiwibmV3UmUiLCJvblRhYmxlQ2VsbE11bHRpU2VsZWN0IiwiZm9ybWF0QmxvY2siLCJfZm9ybWF0TGlzdCIsInBpY2tVcCIsImxhbmdfdG9vbGJhciIsImRlZmF1bHRGb3JtYXRzIiwiZm9ybWF0TGlzdCIsImZvcm1hdCIsImNsYXNzIiwiZm9ybWF0VGl0bGUiLCJmb3JtYXRDb250ZXh0IiwicmFuZ2VFbGVtZW50IiwiZmlyc3RQYXRoIiwibGFzdFBhdGgiLCJybGlzdCIsImRldGFjaExpc3QiLCJtb2RpZmllZEZvcm1zdHMiLCJmcmVlRWxlbWVudCIsImJlZm9yZSIsImlubmVyIiwiaXNDb21wIiwiaXNTYW1lQXR0cmlidXRlcyIsInByZXZpb3VzU2libGluZyIsIm5ld0Zvcm1hdCIsImxpbmVIZWlnaHRzIiwibGluZUhlaWdodENvbnRleHQiLCJfY2xhc3NMaXN0IiwibWVudUxhbmciLCJkZWZhdWx0TGlzdCIsIl9jbGFzcyIsInBhcmFncmFwaFN0eWxlcyIsImRlZmF1bHRTdHlsZSIsInBhcmFncmFwaExpc3QiLCJfc3R5bGVMaXN0Iiwic3R5bGVMaXN0IiwidGV4dFN0eWxlcyIsImtleXMiLCJzdHlsZUJ1dHRvbkxpc3QiLCJzZWxlY3Rpb25Ob2RlIiwiYnRuIiwiY2hlY2tTdHlsZXMiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwicmVtb3ZlTm9kZXMiLCJkcmF3SXRlbXMiLCJzZXRJbWFnZSIsInNyY05hbWUiLCJjb2RlX3ZpZXciLCJsaW5lX2hlaWdodCIsInBhcmFncmFwaF9zdHlsZSIsInRleHRfc3R5bGUiLCJhcnJvd19kb3duIiwiZm9udF9jb2xvciIsImhpZ2hsaWdodF9jb2xvciIsImhvcml6b250YWxfcnVsZSIsInNob3dfYmxvY2tzIiwibW9kaWZ5IiwiYXV0b19zaXplIiwicm90YXRlX2xlZnQiLCJyb3RhdGVfcmlnaHQiLCJtaXJyb3JfaG9yaXpvbnRhbCIsIm1pcnJvcl92ZXJ0aWNhbCIsImxpbmVfYnJlYWsiLCJtb3JlX3RleHQiLCJtb3JlX3BhcmFncmFwaCIsIm1vcmVfcGx1cyIsIm1vcmVfaG9yaXpvbnRhbCIsIm1vcmVfdmVydGljYWwiLCJhdHRhY2htZW50IiwibWFnaWNfc3RpY2siLCJlbXB0eV9maWxlIiwiaXNJRSIsImlzSUVfRWRnZSIsImlzT1NYX0lPUyIsIl9wcm9wZXJ0aWVzSW5pdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImFwcFZlcnNpb24iLCJwbGF0Zm9ybSIsIl9IVE1MQ29udmVydG9yIiwiY29udGVudHMiLCInIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiemVyb1dpZHRoUmVnRXhwIiwiUmVnRXhwIiwib25seVplcm9XaWR0aFJlZ0V4cCIsIkFjdGl2ZVhPYmplY3QiLCJYTUxIdHRwUmVxdWVzdCIsImUxIiwiZWxlbWVudE5hbWUiLCJvYmoiLCJfaGFzT3duIiwiZ2V0SW5jbHVkZVBhdGgiLCJuYW1lQXJyYXkiLCJleHRlbnNpb24iLCJwYXRoIiwicGF0aExpc3QiLCJmaWxlTmFtZSIsInJlZ0V4cCIsImV4dFJlZ0V4cCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZWRpdG9yVGFnIiwibG9jYXRpb24iLCJnZXRQYWdlU3R5bGUiLCJkb2MiLCJzaGVldHMiLCJzdHlsZVNoZWV0cyIsInJ1bGVzIiwiY3NzUnVsZXMiLCJnZXRJZnJhbWVEb2N1bWVudCIsImlmcmFtZSIsIndEb2N1bWVudCIsImNvbnRlbnRXaW5kb3ciLCJjb250ZW50RG9jdW1lbnQiLCJnZXRBdHRyaWJ1dGVzVG9TdHJpbmciLCJleGNlcHRBdHRycyIsImF0dHJpYnV0ZXMiLCJhdHRyU3RyaW5nIiwiZ2V0Qnl0ZUxlbmd0aCIsImVuY29kZXIiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjciIsImNsIiwidW5lc2NhcGUiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsImlzTm9uRWRpdGFibGUiLCJpc1RleHRTdHlsZUVsZW1lbnQiLCJpc0Nsb3N1cmVSYW5nZUZvcm1hdEVsZW1lbnQiLCJpc0ZyZWVGb3JtYXRFbGVtZW50IiwiaXNDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQiLCJpc1VuZWRpdGFibGVDb21wb25lbnQiLCJpc05vdENoZWNraW5nTm9kZSIsInZhbGlkYXRpb24iLCJnZXRGcmVlRm9ybWF0RWxlbWVudCIsImdldENsb3N1cmVGcmVlRm9ybWF0RWxlbWVudCIsImNvcHlUYWdBdHRyaWJ1dGVzIiwib3JpZ2luRWwiLCJjb3B5RWwiLCJnZXRBcnJheUl0ZW0iLCJhcnJheSIsIm11bHRpIiwiaWR4IiwibmV4dElkeCIsInByZXZJZHgiLCJfbmV3T2Zmc2V0cyIsImZpbmRzIiwidGVtcFRleHQiLCJwcmV2aW91cyIsInJldmVyc2UiLCJvZmZzZXRzIiwibm9kZXMiLCJzdHlsZV9hIiwic3R5bGVfYiIsImNvbXBTdHlsZSIsImNsYXNzX2EiLCJjbGFzc19iIiwicmVnIiwiY29tcENsYXNzIiwiaXNUYWJsZSIsImlzQnJlYWsiLCJpc01lZGlhIiwibWF4RGVjIiwidG9GaXhlZCIsImdldExpc3RDaGlsZHJlbiIsInJlY3Vyc2lvbkZ1bmMiLCJnZXRMaXN0Q2hpbGROb2RlcyIsImRlcHRoIiwiY29tcGFyZUVsZW1lbnRzIiwiYU5vZGUiLCJiTm9kZSIsImFuY2VzdG9yIiwiYUluZGV4IiwiYkluZGV4IiwicXVlcnkiLCJjaGVjayIsImF0dHIiLCJjaGlsZExpc3QiLCJsYXN0Q2hpbGQiLCJnZXRPZmZzZXQiLCJ3eXNpd3lnRnJhbWUiLCJvZmZzZXRMZWZ0Iiwib2Zmc2V0VG9wIiwib2Zmc2V0RWxlbWVudCIsInBhcmVudEVsZW1lbnQiLCJvZmZzZXRQYXJlbnQiLCJzY3JvbGxUb3AiLCJhU3RhcnQiLCJhRW5kIiwiYlN0YXJ0IiwiYkVuZCIsIm92ZXJsYXAiLCJ0eHQiLCJuZXdFbGVtZW50Iiwic3R5bGVOYW1lIiwic2V0RGlzYWJsZWRCdXR0b25zIiwiYnV0dG9uTGlzdCIsInN0b3BQYXJlbnQiLCJwYXJlbnQiLCJkZXRhY2hOZXN0ZWRMaXN0IiwiYmFzZU5vZGUiLCJhbGwiLCJyTm9kZSIsIl9kZWxldGVOZXN0ZWRMaXN0IiwiY05vZGVzIiwickNoaWxkcmVuIiwiYmFzZVBhcmVudCIsImxpU2libGluZyIsImxpUGFyZW50IiwiY2hpbGQiLCJzcGxpdEVsZW1lbnQiLCJvZmZzZXQiLCJicCIsInNwbGl0VGV4dCIsImFmdGVyIiwiZGVwdGhFbCIsInBFbGVtZW50Iiwibm9kZVBhdGhBcnJheSIsIm9ubHlUZXh0IiwiaW5zdCIsIm5vZGVQYXRoTGVuIiwiYXBwbHkiLCJOdW1iZXIiLCJ2YWx1ZU9mIiwiZGVwdGhJbmRleCIsImNEZXB0aCIsInNwbGljZURlcHRoIiwiY2hpbGRzIiwiY2hpbGRMZW5ndGgiLCJuTGVuIiwiYWRkT2Zmc2V0IiwidGV4dE9mZnNldCIsInRlbXBMIiwicmVtb3ZlRW1wdHlOb2RlIiwibm90UmVtb3ZlTm9kZSIsIl9ub3RUZXh0Tm9kZSIsImh0bWxSZW1vdmVXaGl0ZVNwYWNlIiwiZGVzIiwiX2lzTWFpbnRhaW5lZE5vZGUiLCJfaXNTaXplTm9kZSIsIl9kaXNhbGxvd2VkVGFncyIsImNyZWF0ZVRhZ3NXaGl0ZWxpc3QiLCJfZ2V0Q2hlY2tGb3JtYXQiLCJfY29uc2lzdGVuY3lDaGVja09mSFRNTCIsImRvY3VtZW50RnJhZ21lbnQiLCJodG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAiLCJhbGxvd1N0eWxlcyIsInJlbW92ZVRhZ3MiLCJlbXB0eVRhZ3MiLCJ3cm9uZ0xpc3QiLCJ3aXRob3V0Rm9ybWF0Q2VsbHMiLCJ3cm9uZ1RhZ3MiLCJucnRhZyIsImZlbCIsImNoZWNrVGFncyIsInRwIiwiX3NldERlZmF1bHRPcHRpb25TdHlsZSIsIm9wdGlvblN0eWxlIiwibWluSGVpZ2h0IiwiZWRpdG9yIiwic3R5bGVBcnIiLCJfc2V0SWZyYW1lRG9jdW1lbnQiLCJoZWFkIiwiX3NldElmcmFtZUNzc1RhZ3MiLCJfZWRpdGFibGVDbGFzcyIsImxpbmtOYW1lcyIsImlmcmFtZUNTU0ZpbGVOYW1lIiwid1JlZ0V4cCIsInRhZ1N0cmluZyIsIkNTU0ZpbGVOYW1lIiwic3R5bGVUYWciLCJfaW5pdE9wdGlvbnMiLCJ0b3BfZGl2IiwidG9vbF9iYXIiLCJfY3JlYXRlVG9vbEJhciIsInZpc2liaWxpdHkiLCJwbHVnaW5DYWxsQnV0dG9ucyIsIl9jaGVja0thdGV4TWF0aCIsImFycm93Iiwic3RpY2t5X2R1bW15IiwiZWRpdG9yX2RpdiIsImluaXRFbGVtZW50cyIsIl9pbml0RWxlbWVudHMiLCJib3R0b21CYXIiLCJ3eXNpd3lnX2RpdiIsInBsYWNlaG9sZGVyX3NwYW4iLCJ0ZXh0YXJlYSIsInJlc2l6aW5nX2JhciIsInJlc2l6aW5nQmFyIiwibmF2aWdhdGlvbiIsImNoYXJfd3JhcHBlciIsImNoYXJXcmFwcGVyIiwiY2hhcl9jb3VudGVyIiwiY2hhckNvdW50ZXIiLCJsb2FkaW5nX2JveCIsImxpbmVfYnJlYWtlciIsImxpbmVfYnJlYWtlcl90IiwibGluZV9icmVha2VyX2IiLCJyZXNpemVfYmFjayIsInRvb2xiYXJDb250YWluZXIiLCJfY2hlY2tDb2RlTWlycm9yIiwiY29uc3RydWN0ZWQiLCJfdG9wIiwiX3JlbGF0aXZlIiwiX3Rvb2xCYXIiLCJfbWVudVRyYXkiLCJfZWRpdG9yQXJlYSIsIl93eXNpd3lnQXJlYSIsIl9jb2RlQXJlYSIsIl9wbGFjZWhvbGRlciIsIl9yZXNpemluZ0JhciIsIl9uYXZpZ2F0aW9uIiwiX2NoYXJXcmFwcGVyIiwiX2NoYXJDb3VudGVyIiwiX2xpbmVCcmVha2VyIiwiX2xpbmVCcmVha2VyX3QiLCJfbGluZUJyZWFrZXJfYiIsIl9yZXNpemVCYWNrIiwiX3N0aWNreUR1bW15IiwiX2Fycm93IiwiX3Jlc3BvbnNpdmVCdXR0b25zIiwicmVzcG9uc2l2ZUJ1dHRvbnMiLCJjb2RlTWlycm9yIiwiY21PcHRpb25zIiwiaHRtbE1vZGUiLCJsaW5lTnVtYmVycyIsImxpbmVXcmFwcGluZyIsInJlZHVjZSIsInZpZXdwb3J0TWFyZ2luIiwiSW5maW5pdHkiLCJjbSIsImZyb21UZXh0QXJlYSIsIndyYXBwZXIiLCJjb2RlTWlycm9yRWRpdG9yIiwia2F0ZXhPcHRpb25zIiwidGhyb3dPbkVycm9yIiwiX3NldE9wdGlvbnMiLCJtZXJnZU9wdGlvbnMiLCJvcmlnaW5PcHRpb25zIiwib3JpZ2luRWxlbWVudCIsImVkaXRvckFyZWEiLCJpc05ld1Rvb2xiYXJDb250YWluZXIiLCJpc05ld1Rvb2xiYXIiLCJ0b3BBcmVhIiwiY2FsbEJ1dHRvbnMiLCJ0b3BEaXYiLCJ0b29sQmFyIiwidG9vbEJhckFycm93IiwiX2VkaXRvclN0eWxlcyIsInRvb2xiYXJXaWR0aCIsInd5c2l3eWdEaXYiLCJvdmVyZmxvdyIsImNoYXJDb3VudGVyTGFiZWwiLCJjaGFyTGFiZWwiLCJtYXhDaGFyQ291bnQiLCJjaGFyX21heCIsImlubmVyVGV4dCIsIl9kZWZhdWx0TGFuZyIsImRlZmF1bHRUYWciLCJ0ZXh0VGFncyIsIl9kZWZhdWx0IiwiX25ldyIsIl90ZXh0VGFnc01hcCIsImhpc3RvcnlTdGFja0RlbGF5VGltZSIsIl9kZWZhdWx0VGFnc1doaXRlbGlzdCIsIl9lZGl0b3JUYWdzV2hpdGVsaXN0IiwiYWRkVGFnc1doaXRlbGlzdCIsInBhc3RlVGFnc1doaXRlbGlzdCIsImF0dHJpYnV0ZXNXaGl0ZWxpc3QiLCJzdGlja3lUb29sYmFyIiwidW5kZWZpbmVkIiwiZnVsbFNjcmVlbk9mZnNldCIsImZ1bGxQYWdlIiwicHJldmlld1RlbXBsYXRlIiwic2hvd1BhdGhMYWJlbCIsImNoYXJDb3VudGVyVHlwZSIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwidGFiRGlzYWJsZSIsInNob3J0Y3V0c0Rpc2FibGUiLCJzaG9ydGN1dHNIaW50IiwiY2FsbEJhY2tTYXZlIiwiX2ljb25zIiwiX2RlZmF1bHRCdXR0b25zIiwiY21kIiwiYWRkU2hpZnQiLCJpbmRlbnRLZXkiLCJfY3JlYXRlTW9kdWxlR3JvdXAiLCJvRGl2Iiwib1VsIiwiX2NyZWF0ZUJ1dHRvbiIsImJ1dHRvbkNsYXNzIiwiZGF0YUNvbW1hbmQiLCJkYXRhRGlzcGxheSIsIl9kaXNhYmxlZCIsIm9MaSIsIm9CdXR0b24iLCJfcGx1Z2lucyIsInNlcGFyYXRvcl92ZXJ0aWNhbCIsIl9idXR0b25UcmF5Iiwic3RyaW5naWZ5IiwiZGVmYXVsdEJ1dHRvbkxpc3QiLCJwbHVnaW5zVmFsdWVzIiwibW9kdWxlRWxlbWVudCIsImJ1dHRvbkVsZW1lbnQiLCJtb3JlTGF5ZXIiLCJidXR0b25Hcm91cExvb3AiLCJtb3JlIiwibW9yZUNvbnRhaW5lciIsIm1vcmVDb21tYW5kIiwiYnV0dG9uR3JvdXAiLCJtb3JlQnV0dG9uIiwiZGl2IiwibWF0Y2hlZCIsImN1c3RvbSIsInVsIiwibGkiLCJzdiIsImVudGVyRGl2IiwidW5zaGlmdCIsInRvb2xfY292ZXIiLCJfQ29udGV4dCIsImNvbnMiLCJsb2FkaW5nIiwibGluZUJyZWFrZXIiLCJsaW5lQnJlYWtlcl90IiwibGluZUJyZWFrZXJfYiIsInJlc2l6ZUJhY2tncm91bmQiLCJ0b29sIiwibm90aWNlIiwibm90aWNlX2RpdiIsIm5vdGljZV9zcGFuIiwibm90aWNlX2J1dHRvbiIsIm9uQ2xpY2tfY2FuY2VsIiwiaW5pdF9vcHRpb25zIiwiaWRPckVsZW1lbnQiLCJfaW5pdF9vcHRpb25zIiwidmFsIiwiZ2V0RWxlbWVudEJ5SWQiLCJfQ29uc3RydWN0b3IiLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJfdXRpbCIsIl9wYXJzZXIiLCJfd3ciLCJfc2hhZG93Um9vdCIsIl9ub3RpY2UiLCJpbml0UGx1Z2lucyIsIl90YXJnZXRQbHVnaW5zIiwic3VibWVudSIsIl9zdWJtZW51TmFtZSIsIl9iaW5kZWRTdWJtZW51T2ZmIiwiX2JpbmRlZENvbnRhaW5lck9mZiIsInN1Ym1lbnVBY3RpdmVCdXR0b24iLCJjb250YWluZXJBY3RpdmVCdXR0b24iLCJjdXJyZW50Q29udHJvbGxlclRhcmdldCIsImN1cnJlbnRGaWxlQ29tcG9uZW50SW5mbyIsImNvZGVWaWV3RGlzYWJsZWRCdXR0b25zIiwicmVzaXppbmdEaXNhYmxlZEJ1dHRvbnMiLCJfbW9yZUxheWVyQWN0aXZlQnV0dG9uIiwiX2h0bWxDaGVja1doaXRlbGlzdFJlZ0V4cCIsIl9kaXNhbGxvd2VkVGV4dFRhZ3NSZWdFeHAiLCJlZGl0b3JUYWdzV2hpdGVsaXN0UmVnRXhwIiwicGFzdGVUYWdzV2hpdGVsaXN0UmVnRXhwIiwiaGFzRm9jdXMiLCJpc0Rpc2FibGVkIiwiX2F0dHJpYnV0ZXNXaGl0ZWxpc3RSZWdFeHAiLCJfYXR0cmlidXRlc1RhZ3NXaGl0ZWxpc3QiLCJfYmluZENvbnRyb2xsZXJzT2ZmIiwiX2lzSW5saW5lIiwiX2lzQmFsbG9vbiIsIl9pc0JhbGxvb25BbHdheXMiLCJfaW5saW5lVG9vbGJhckF0dHIiLCJpc1Nob3ciLCJfbm90SGlkZVRvb2xiYXIiLCJfc3RpY2t5IiwiX2xpbmVCcmVha2VyQnV0dG9uIiwiX2NvbXBvbmVudHNJbmZvSW5pdCIsIl9jb21wb25lbnRzSW5mb1Jlc2V0IiwiYWN0aXZlUGx1Z2lucyIsIm1hbmFnZWRUYWdzSW5mbyIsIl9jaGFyVHlwZUhUTUwiLCJfZmlsZUluZm9QbHVnaW5zQ2hlY2siLCJfZmlsZUluZm9QbHVnaW5zUmVzZXQiLCJfZmlsZU1hbmFnZXIiLCJxdWVyeVN0cmluZyIsInBsdWdpblJlZ0V4cCIsInBsdWdpbk1hcCIsImNvbW1hbmRNYXAiLCJfc3R5bGVDb21tYW5kTWFwIiwiX2RlZmF1bHRDb21tYW5kIiwiX3ZhcmlhYmxlIiwiaXNDb2RlVmlldyIsImlzRnVsbFNjcmVlbiIsImlubmVySGVpZ2h0X2Z1bGxTY3JlZW4iLCJyZXNpemVDbGllbnRZIiwidGFiU2l6ZSIsImNvZGVJbmRlbnQiLCJtaW5SZXNpemluZ1NpemUiLCJjdXJyZW50Tm9kZXMiLCJjdXJyZW50Tm9kZXNNYXAiLCJfcmFuZ2UiLCJfc2VsZWN0aW9uTm9kZSIsIl9vcmlnaW5Dc3NUZXh0IiwiX2JvZHlPdmVyZmxvdyIsIl9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dCIsIl93eXNpd3lnT3JpZ2luQ3NzVGV4dCIsIl9jb2RlT3JpZ2luQ3NzVGV4dCIsIl9mdWxsU2NyZWVuQXR0cnMiLCJzdGlja3kiLCJiYWxsb29uIiwiaW5saW5lIiwiX2xpbmVCcmVha0NvbXAiLCJfbGluZUJyZWFrRGlyIiwiY2FsbEJhY2tGdW5jdGlvbiIsIl90YXJnZXQiLCJtb2R1bGVBcnJheSIsIm1vZHVsZU5hbWUiLCJzdWJtZW51T24iLCJzdWJtZW51TmFtZSIsIl9zZXRNZW51UG9zaXRpb24iLCJjb250YWluZXJPbiIsImNvbnRhaW5lck5hbWUiLCJfY29udGFpbmVyTmFtZSIsImNvbnRhaW5lck9mZiIsInRvb2xiYXJXIiwidG9vbGJhck9mZnNldCIsImV2ZW50IiwiX2dldEVkaXRvck9mZnNldHMiLCJtZW51VyIsImVsZW1lbnRXIiwicnRsVyIsInJ0bEwiLCJvdmVyTGVmdCIsIm9mZnNldEVsIiwiYnQiLCJ0b29sYmFyVG9wIiwibWVudUhlaWdodCIsIm1lbnVIZWlnaHRfYm90dG9tIiwibWVudVRvcCIsImluc1RvcCIsIm1lbnVIZWlnaHRfdG9wIiwiYXJnIiwiYXJndW1lbnRzIiwiZ2V0RmlsZUNvbXBvbmVudCIsInNob3dDb250cm9sbGVyIiwicmVmZXJFbCIsInRvcE1hcmdpbiIsInNjcm9sbExlZnQiLCJjb250cm9sbGVyVyIsInJlZmVyRWxXIiwiYWxsb3ciLCJvdmVyU2l6ZSIsImV4ZWNDb21tYW5kIiwic2hvd0RlZmF1bHRVSSIsIm5hdGl2ZUZvY3VzIiwiX2VkaXRvclJhbmdlIiwiYnIiLCJfYXBwbHlUYWdFZmZlY3RzIiwiX3RvZ2dsZVRvb2xiYXJCYWxsb29uIiwiZmlsZUNvbXBvbmVudEluZm8iLCJibHVyIiwic3RhcnRDb24iLCJzdGFydE9mZiIsImVuZENvbiIsImVuZE9mZiIsInNldFN0YXJ0Iiwic2V0RW5kIiwiY29uc29sZSIsIndhcm4iLCJzZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInJlbW92ZVJhbmdlIiwiT1VUREVOVCIsIklOREVOVCIsIl9jcmVhdGVEZWZhdWx0UmFuZ2UiLCJjb2xsYXBzZWQiLCJmb2N1c05vZGUiLCJyYW5nZUNvdW50IiwiZ2V0UmFuZ2VBdCIsImFuY2hvck5vZGUiLCJhbmNob3JPZmZzZXQiLCJmb2N1c09mZnNldCIsImNvbXBhcmVWYWx1ZSIsInJpZ2h0RGlyIiwiX3NlbGVjdGlvblZvaWQiLCJvcCIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiZXh0ZW50Tm9kZSIsImNvbW0iLCJfcmVzZXRSYW5nZVRvVGV4dE5vZGUiLCJ0ZW1wQ29uIiwidGVtcE9mZnNldCIsInRlbXBDaGlsZCIsIm9ubHlCcmVhayIsImVtcHR5VGV4dCIsImNvbW1vbkNvbiIsImxpbmVOb2RlcyIsInN0YXJ0TGluZSIsImVuZExpbmUiLCJzdGFydElkeCIsImVuZElkeCIsIm9ubHlUYWJsZSIsInN0YXJ0UmFuZ2VFbCIsImVuZFJhbmdlRWwiLCJzYW1lUmFuZ2UiLCJsaW5lIiwicmVtb3ZlRHVwbGljYXRlIiwibXlDb21wb25lbnQiLCJzZWxlY3RlZExpbmVzIiwiaXNFZGdlUG9pbnQiLCJkaXIiLCJub2RlVmFsdWUiLCJpc0VkZ2VGb3JtYXQiLCJhcHBlbmRGb3JtYXRUYWciLCJmb3JtYXROb2RlIiwiY3VycmVudEZvcm1hdEVsIiwib0Zvcm1hdE5hbWUiLCJjaGVja0NoYXJDb3VudCIsIm5vdFNlbGVjdCIsInJlbW92ZU5vZGUiLCJmb3JtYXRFbCIsImRlcHRoRm9ybWF0IiwicGx1Z2luIiwiX3NldENvbXBvbmVudExpbmVCcmVha2VyIiwidF9zdHlsZSIsImJfc3R5bGUiLCJyZXNpemVDb250YWluZXIiLCJjb21wb25lbnRUb3AiLCJ3U2Nyb2xsIiwiYWZ0ZXJOb2RlIiwiZnJlZUZvcm1hdCIsImlzRm9ybWF0cyIsImZvcm1hdFJhbmdlIiwib3JpZ2luQWZ0ZXIiLCJyZW1vdmVkVGFnIiwicHJldkNvbnRhaW5lciIsIm9sZFBhcmVudCIsInJhbmdlQ29uIiwiX3NldEludG9GcmVlRm9ybWF0IiwicHJldmlvdXNUZXh0IiwibmV4dFRleHQiLCJuZXdSYW5nZSIsInplcm9XaWR0aCIsIm9Ob2RlQ2hpbGRyZW4iLCJsYXN0T05vZGUiLCJiZWZvcmVOb2RlIiwic3RhcnRJbmRleCIsImVuZEluZGV4Iiwic3RhcnROb2RlIiwiZW5kTm9kZSIsInN1YnN0cmluZ0RhdGEiLCJyYyIsInJhbmdlTGluZXMiLCJsaW5lc0xvb3AiLCJuZXN0ZWQiLCJmRWwiLCJsRWwiLCJzdGFuZFRhZyIsImJlZm9yZVRhZyIsInBhcmVudERlcHRoIiwibGlzdFBhcmVudCIsImxpbmVBcnIiLCJyZW1vdmVJdGVtcyIsIm5leHRMaW5lIiwibmV4dExpc3QiLCJyZW1vdmVBcnJheSIsInNwbGl0UmFuZ2UiLCJuZXdSYW5nZUVsZW1lbnQiLCJmaXJzdE5vZGUiLCJsYXN0Tm9kZSIsInJhbmdlRWwiLCJpbnNlcnRlZE5ldyIsIm1vdmVDb21wbGV0ZSIsImFwcGVuZE5vZGUiLCJpbnNOb2RlIiwib3JpZ2luTm9kZSIsImluc0NoaWxkcmVuIiwib3JpZ2luTmV4dCIsImRldGFjaFJhbmdlIiwibGluZUluZGV4IiwiaW5zTmV4dCIsImlubmVyQ2hpbGRyZW4iLCJyYW5nZVBhcmVudCIsInJhbmdlUmlnaHQiLCJjaGlsZEVkZ2UiLCJsaXN0Rmlyc3QiLCJsaXN0TGFzdCIsImxhc3RJbmRleCIsInN0eWxlQXJyYXkiLCJyZW1vdmVOb2RlQXJyYXkiLCJzdHJpY3RSZW1vdmUiLCJpc1JlbW92ZU5vZGUiLCJpc1JlbW92ZUZvcm1hdCIsIm5ld05vZGVOYW1lIiwic05vZGUiLCJjaGVja0NudCIsImNoZWNrQXR0cnMiLCJja2Vja0NsYXNzZXMiLCJjbGFzc1JlZyIsInN0eWxlQ2hlY2siLCJjbGFzc0NoZWNrIiwic3RhcnQiLCJlbmQiLCJzdHlsZVJlZ0V4cCIsImNsYXNzUmVnRXhwIiwicmVtb3ZlTm9kZVJlZ0V4cCIsIndCb29sZWFuIiwiQm9vbGVhbiIsIl9yZW1vdmVDaGVjayIsImNoZWNrTm9kZSIsInZOb2RlIiwidGFnUmVtb3ZlIiwib3JpZ2luU3R5bGUiLCJvcmlnaW5DbGFzc2VzIiwib25lTGluZSIsImVuZExlbmd0aCIsImlzUmVtb3ZlQW5jaG9yIiwiaXNTaXplTm9kZSIsIl9nZXRNYWludGFpbmVkTm9kZSIsIl91dGlsX2dldE1haW50YWluZWROb2RlIiwiX3V0aWxfaXNNYWludGFpbmVkTm9kZSIsIl9ub2RlQ2hhbmdlX29uZUxpbmUiLCJfc2V0Q29tbW9uTGlzdFN0eWxlIiwiX25vZGVDaGFuZ2VfZW5kTGluZSIsIl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUiLCJfbm9kZUNoYW5nZV9zdGFydExpbmUiLCJjaGlsZFN0eWxlIiwiZWxTdHlsZSIsImZvbnRXZWlnaHQiLCJfc3RyaXBSZW1vdmVOb2RlIiwiX2lzUmVtb3ZlIiwibmV3SW5uZXJOb2RlIiwicGFyZW50Q29uIiwic2FtZVRhZyIsInoiLCJuTm9kZUFycmF5IiwicE5vZGUiLCJpc1NhbWVOb2RlIiwicEN1cnJlbnQiLCJzdGFydFBhc3MiLCJlbmRQYXNzIiwiY2hlY2tDc3MiLCJjb3Zlck5vZGUiLCJwcmV2Tm9kZSIsInByZXZBbmNob3JOb2RlIiwiY2hpbGROb2RlIiwiYW5jaG9ycyIsImFDaGlsZHJlbiIsImFMZW4iLCJhbmNlc3RvckFuY2hvck5vZGUiLCJhZnRlckFuY2hvck5vZGUiLCJ0ZXh0Tm9kZV9zIiwidGV4dE5vZGVfZSIsImVuZENvblJlc2V0IiwibmV3U3RhcnRPZmZzZXQiLCJzdGFydFBhdGgiLCJtZXJnZUVuZENvbiIsIm5ld0VuZE9mZnNldCIsImVuZFBhdGgiLCJuZXdPZmZzZXRzIiwiX2VuZENvbnRhaW5lciIsInBhc3NOb2RlIiwiY2xvbmVDaGlsZCIsImlzVG9wTm9kZSIsInRlbXBOb2RlIiwibmV3Q3NzVGV4dCIsIm5ld0NsYXNzIiwibm9uZUNoYW5nZSIsImFjdGlvbkNhbGwiLCJsYXllciIsIl9zaG93VG9vbGJhckJhbGxvb24iLCJfc2hvd1Rvb2xiYXJJbmxpbmUiLCJjb21tYW5kSGFuZGxlciIsInRvZ2dsZUNvZGVWaWV3IiwidG9nZ2xlRnVsbFNjcmVlbiIsInRvZ2dsZURpc3BsYXlCbG9ja3MiLCJnZXRDb250ZW50cyIsIm5vZGVzTWFwIiwibWFyZ2luRGlyIiwiX3Jlc291cmNlc1N0YXRlQ2hhbmdlIiwiX3NldENvZGVEYXRhVG9FZGl0b3IiLCJfaGlkZVRvb2xiYXIiLCJfc2V0RWRpdG9yRGF0YVRvQ29kZVZpZXciLCJzY3JvbGxIZWlnaHQiLCJyZWZyZXNoIiwiX2NoZWNrUGxhY2Vob2xkZXIiLCJjb2RlX2h0bWwiLCJfZ2V0Q29kZVZpZXciLCJwYXJzZURvY3VtZW50IiwiaGVhZENoaWxkcmVuIiwiY29udmVydENvbnRlbnRzRm9yRWRpdG9yIiwiZWRpdGFibGVDbGFzc2VzIiwiY29kZUNvbnRlbnRzIiwiY29udmVydEhUTUxGb3JDb2RlVmlldyIsImNvZGVWYWx1ZSIsIl9zZXRDb2RlVmlldyIsIl92YXIiLCJvblNjcm9sbF93aW5kb3ciLCJtYXJnaW5Ub3AiLCJ6SW5kZXgiLCJfaWZyYW1lQXV0b0hlaWdodCIsInByaW50RG9jdW1lbnQiLCJjb250ZW50c0hUTUwiLCJ3RG9jIiwiYXJydHMiLCJ3cml0ZSIsImxpbmtzIiwibGlua0hUTUwiLCJkb2N1bWVudE1vZGUiLCJTdHlsZU1lZGlhIiwid2luZG93T2JqZWN0IiwibWltZVR5cGUiLCJjb252ZXJ0VmFsdWUiLCJfcmVzZXRDb21wb25lbnRzIiwic2V0SWZyYW1lQ29udGVudHMiLCJjdHgiLCJvbmx5Q29udGVudHMiLCJyZW5kZXJIVE1MIiwiZmlnY2FwdGlvbnMiLCJfbWFrZUxpbmUiLCJyZXF1aXJlRm9ybWF0IiwidGV4dEFycmF5IiwiX2FsbG93SFRNTENvbW1lbnRzIiwiX3RhZ0NvbnZlcnRvciIsIl9kZWxldGVEaXNhbGxvd2VkVGFncyIsImNsZWFuSFRNTCIsIndoaXRlbGlzdCIsInRBdHRyIiwidGV4dENvbXBMaXN0IiwiaW5pdE1ldGhvZCIsImRvbVRyZWUiLCJyZXR1cm5IVE1MIiwiYnJSZWciLCJpbmRlbnRTaXplIiwiam9pbiIsImxpbmVCUiIsImVsZW1lbnRSZWdUZXN0IiwiZWxlbWVudEluZGVudCIsIm5vZGVSZWdUZXN0IiwibGlzdGVuZXIiLCJ1c2VDYXB0dXJlIiwiX2NoYXJDb3VudCIsImlucHV0VGV4dCIsImNvdW50VHlwZSIsIm5leHRDaGFyQ291bnQiLCJnZXRDaGFyTGVuZ3RoIiwiX3NldENoYXJDb3VudCIsIm92ZXIiLCJjb3VudCIsImdldENoYXJDb3VudCIsInNsaWNlUG9zaXRpb24iLCJfY2FsbENvdW50ZXJCbGluayIsIl9jaGVja0NvbXBvbmVudHMiLCJnZXREb2MiLCJzZXRWYWx1ZSIsImdldFZhbHVlIiwiX2luaXQiLCJyZWxvYWQiLCJfaW5pdEhUTUwiLCJTaGFkb3dSb290Iiwic2hhZG93Um9vdCIsImRpc2FsbG93VGV4dFRhZ3MiLCJhbGxvd1RleHRUYWdzIiwiZGVmYXVsdEF0dHIiLCJfYXR0ciIsInRhZ3NBdHRyIiwiYWxsQXR0ciIsImsiLCJfY2FjaGluZ0J1dHRvbnMiLCJtYW5hZ2VkQ2xhc3MiLCJmaWxlUGx1Z2luUmVnRXhwIiwiY2hhbmdlIiwiZGVsYXlUaW1lIiwicHVzaERlbGF5Iiwic3RhY2tJbmRleCIsInN0YWNrIiwic2V0Q29udGVudHNGcm9tU3RhY2siLCJwdXNoU3RhY2siLCJkZWxheSIsInRpbWUiLCJjbGVhclRpbWVvdXQiLCJnbyIsImlnbm9yZUNoYW5nZUV2ZW50IiwiX3Jlc2V0Q2FjaGluZ0J1dHRvbiIsIl9kZXN0cm95IiwiX2hpc3RvcnkiLCJfb25DaGFuZ2VfaGlzdG9yeVN0YWNrIiwiX2lmcmFtZUF1dG8iLCJfaW5pdFd5c2l3eWdBcmVhIiwiU1VCIiwiU1VQIiwib25DaGFuZ2UiLCJfc2V0RGVmYXVsdEZvcm1hdCIsImZvcm1hdE5hbWUiLCJmaWxlQ29tcG9uZW50IiwiX3NldE9wdGlvbnNJbml0IiwiX2dldENvbnN0cnVjdGVkIiwiX2VkaXRvckluaXQiLCJfYWRkRXZlbnQiLCJfb2ZmU3RpY2t5VG9vbGJhciIsIm9uUmVzaXplX3dpbmRvdyIsImNvbnRleHRFbCIsIl9JRWlzQ29tcG9zaW5nIiwiX2xpbmVCcmVha2VyQmluZCIsIl9yZXNwb25zaXZlQ3VycmVudFNpemUiLCJfcmVzcG9uc2l2ZUJ1dHRvblNpemUiLCJfZGlyZWN0aW9uS2V5Q29kZSIsIl9ub25UZXh0S2V5Q29kZSIsIl9oaXN0b3J5SWdub3JlS2V5Q29kZSIsIl9vbkJ1dHRvbnNDaGVjayIsIl9mcm9udFplcm9XaWR0aFJlZyIsIl9rZXlDb2RlU2hvcnRjdXQiLCI2NSIsIjY2IiwiODMiLCI4NSIsIjczIiwiODkiLCI5MCIsIjIxOSIsIjIyMSIsIl9zaG9ydGN1dENvbW1hbmQiLCJjbGFzc09uQ2hlY2siLCJjb21tYW5kTWFwTm9kZXMiLCJfY2FuY2VsQ2FwdGlvbkVkaXQiLCJfYnV0dG9uc0V2ZW50SGFuZGxlciIsIm9uQ2xpY2tfdG9vbGJhciIsIm9uTW91c2VEb3duX3d5c2l3eWciLCJ0YWJsZUNlbGwiLCJvbk1vdXNlRG93biIsIm9uQ2xpY2tfd3lzaXd5ZyIsImhpZGVUb29sYmFyIiwicHJldkxpIiwib25DbGljayIsIl9iYWxsb29uRGVsYXkiLCJfc2hvd1Rvb2xiYXJCYWxsb29uRGVsYXkiLCJyYW5nZU9iaiIsImlzRGlyVG9wIiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImVkaXRvcldpZHRoIiwic3RpY2t5VG9wIiwiZWRpdG9yTGVmdCIsIm5vZGVPZmZzZXQiLCJib3R0b20iLCJub1RleHQiLCJhcnJvd01hcmdpbiIsInRvb2xiYXJIZWlnaHQiLCJpZnJhbWVSZWN0cyIsIl9zZXRUb29sYmFyT2Zmc2V0IiwiZWRpdG9yUGFyZW50IiwiYWJzb2x1dGVMZWZ0Iiwib3ZlclJpZ2h0IiwicmVzZXRUb3AiLCJzcGFjZSIsIl9nZXRQYWdlQm90dG9tU3BhY2UiLCJkb2N1bWVudEVsZW1lbnQiLCJhcnJvd19sZWZ0Iiwic2hvd0lubGluZSIsIm9uSW5wdXRfd3lzaXd5ZyIsIm9uSW5wdXQiLCJfaXNVbmVkaXRhYmxlTm9kZSIsImlzRnJvbnQiLCJzaWJsaW5nS2V5Iiwic2libGluZ05vZGUiLCJfaXNVbmVkaXRhYmxlTm9kZV9nZXRTaWJsaW5nIiwic2VsZWN0Tm9kZSIsIl9vblNob3J0Y3V0S2V5Iiwib25LZXlEb3duX3d5c2l3eWciLCJzaGlmdEtleSIsImN0cmwiLCJjdHJsS2V5IiwibWV0YUtleSIsImFsdEtleSIsInNlbGVjdFJhbmdlIiwiZmlsZUNvbXBvbmVudE5hbWUiLCJfaGFyZERlbGV0ZSIsImRlZmF1bHRGb3JtYXQiLCJwcmV2TGFzdCIsImNvbiIsInNlbCIsImlnbm9yZVpXUyIsIm5leHRFbCIsImlzRWRnZSIsImxpbmVzIiwiZmMiLCJsYyIsIm1vdmVDZWxsIiwiZW5kQ2hpbGQiLCJ0YWJUZXh0IiwidGV4dFJhbmdlIiwiZnJlZUZvcm1hdEVsIiwiZW50ZXJIVE1MIiwic2VsZWN0aW9uRm9ybWF0Iiwid1NlbGVjdGlvbiIsImluc2VydEhUTUwiLCJ3T2Zmc2V0IiwiZm9jdXNOZXh0IiwiYnJQcmV2IiwiYnJOZXh0IiwibmV3TGlzdENlbGwiLCJjb21wQ29udGV4dCIsIm5ic3AiLCJvbktleURvd24iLCJvbktleVVwX3d5c2l3eWciLCJvRm9ybWF0VGFnIiwiaXNDb21wb3NpbmciLCJmcm9udFplcm9XaWR0aENudCIsInN1YnN0cmluZyIsIm9uS2V5VXAiLCJvblNjcm9sbF93eXNpd3lnIiwib25TY3JvbGwiLCJvbkZvY3VzX3d5c2l3eWciLCJvbkZvY3VzIiwib25CbHVyX3d5c2l3eWciLCJvbkJsdXIiLCJvbk1vdXNlRG93bl9yZXNpemluZ0JhciIsImNsaWVudFkiLCJfcmVzaXplX2VkaXRvciIsImNsb3N1cmVGdW5jIiwicmVzaXplSW50ZXJ2YWwiLCJyZXNwb25zaXZlU2l6ZSIsIndpbmRvd1dpZHRoIiwicmVzcG9uc2l2ZVdpZHRoIiwic2V0VG9vbGJhckJ1dHRvbnMiLCJlZGl0b3JIZWlnaHQiLCJzY3JvbGxZIiwiZWRpdG9yVG9wIiwiX29uU3RpY2t5VG9vbGJhciIsInNjcm9sbCIsIl9jb2RlVmlld0F1dG9IZWlnaHQiLCJzQ2VsbCIsImVDZWxsIiwic0lzQ2VsbCIsImVJc0NlbGwiLCJzQ29tcCIsImVDb21wIiwib25QYXN0ZV93eXNpd3lnIiwiY2xpcGJvYXJkRGF0YSIsIl9kYXRhVHJhbnNmZXJBY3Rpb24iLCJfc2V0Q2xpcGJvYXJkQ29tcG9uZW50Iiwic2V0RGF0YSIsIm9uQ29weV93eXNpd3lnIiwib25Db3B5Iiwib25DdXRfd3lzaXd5ZyIsIm9uQ3V0Iiwib25Ecm9wX3d5c2l3eWciLCJkYXRhVHJhbnNmZXIiLCJfc2V0RHJvcExvY2F0aW9uU2VsZWN0aW9uIiwicmFuZ2VPZmZzZXQiLCJjYXJldFJhbmdlRnJvbVBvaW50IiwiY2xpZW50WCIsInBsYWluVGV4dCIsImNsZWFuRGF0YSIsImdldERhdGEiLCJ0ZW1wRGl2IiwidGVtcFJhbmdlIiwiX3NldENsaXBib2FyZERhdGEiLCJNU0RhdGEiLCJvblBhc3RlIiwib25Ecm9wIiwiaW5zZXJ0SW1hZ2UiLCJvbk1vdXNlTW92ZV93eXNpd3lnIiwibGluZUJyZWFrZXJTdHlsZSIsImN0eEVsIiwicGFnZVkiLCJfb25Nb3VzZURvd25fbGluZUJyZWFrIiwiX29uTGluZUJyZWFrIiwiZXZlbnRXeXNpd3lnIiwicGFzc2l2ZSIsIl9zZXRSZXNwb25zaXZlVG9vbGJhciIsIl9yZW1vdmVFdmVudCIsInNpemVBcnJheSIsImJ1dHRvbnNPYmoiLCJuZXdUb29sYmFyIiwibmV3Q29udGV4dCIsIm9sZENhbGxCdXR0b25zIiwib2xkQnV0dG9uIiwic2V0T3B0aW9ucyIsIl9vcHRpb25zIiwic2V0RGVmYXVsdFN0eWxlIiwibmV3U3R5bGVzIiwibm90aWNlQ2xvc2UiLCJnZXRDb250ZXh0IiwiZ2V0VGV4dCIsImdldEltYWdlc0luZm8iLCJnZXRGaWxlc0luZm8iLCJub3RDbGVhbmluZ0RhdGEiLCJyYW5nZVNlbGVjdGlvbiIsImNoZWNrSFRNTCIsImZpcnN0Q29uIiwiYXBwZW5kQ29udGVudHMiLCJzZXRPcHRpb24iLCJzaG93IiwidG9wQXJlYVN0eWxlIiwiaGlkZSIsInN1bmVkaXRvciIsIl9yZXNpemVDbGllbnRYIiwiX3Jlc2l6ZUNsaWVudFkiLCJfcmVzaXplX3ciLCJfcmVzaXplX2giLCJfcmVzaXplX2RpcmVjdGlvbiIsIl9tb3ZlX3BhdGgiLCJfaXNDaGFuZ2UiLCJhbGlnbkljb25zIiwicmVzaXplX2Rpdl9jb250YWluZXIiLCJzZXRDb250cm9sbGVyX3Jlc2l6ZSIsInJlc2l6ZURvdCIsInJlc2l6ZURpc3BsYXkiLCJyZXNpemVfYnV0dG9uIiwic2V0Q29udHJvbGxlcl9idXR0b24iLCJyZXNpemVfaGFuZGxlcyIsInJlc2l6ZUhhbmRsZXMiLCJyZXNpemVCdXR0b25Hcm91cCIsInJvdGF0aW9uQnV0dG9ucyIsInBlcmNlbnRhZ2VCdXR0b25zIiwiYWxpZ25NZW51IiwiYWxpZ25NZW51TGlzdCIsImFsaWduQnV0dG9uIiwiYXV0b1NpemVCdXR0b24iLCJjYXB0aW9uQnV0dG9uIiwib25Nb3VzZURvd25fcmVzaXplX2hhbmRsZSIsIm9uQ2xpY2tfcmVzaXplQnV0dG9uIiwicmVzaXplX2NvbnRhaW5lciIsInBsdWdpbk9iaiIsInBlcmNlbnRhZ2VSb3RhdGlvbiIsInhVbml0IiwieVVuaXQiLCJkZWMiLCJ4VmFsdWUiLCJ5VmFsdWUiLCJjb250ZXh0UmVzaXppbmciLCJpc1ZlcnRpY2FsIiwiYWJzIiwiZGlzcGxheVgiLCJkaXNwbGF5WSIsInJlc2l6ZURvdFNob3ciLCJyb3RhdGlvbnMiLCJwQnV0dG9ucyIsIm5hdHVyYWxXaWR0aCIsIm5hdHVyYWxIZWlnaHQiLCJfY2xvc2VBbGlnbk1lbnUiLCJvcGVuQWxpZ25NZW51IiwiY3VycmVudENvbnRleHQiLCJjdXJyZW50TW9kdWxlIiwicGVyY2VudFkiLCJwZXJjZW50YWdlIiwiX3NldFRyYW5zRm9ybSIsInNsb3BlIiwiZGVnIiwiYWxpZ25WYWx1ZSIsImNhcHRpb25UZXh0IiwidHJhbnNmb3JtIiwidHJhbnNmb3JtT3JpZ2luIiwidHJhbnNPcmlnaW4iLCJvZmZzZXRXIiwib2Zmc2V0SCIsInRyYW5zVyIsInRyYW5zSCIsInRyYW5zbGF0ZSIsImNsb3N1cmVGdW5jX2JpbmQiLCJyZXNpemluZ19lbGVtZW50X2JpbmQiLCJjYW5jZWxfY29udHJvbGxlcl9yZXNpemUiLCJyZXNpemluZ19lbGVtZW50IiwicmVzdWx0VyIsInJlc3VsdEgiLCJ3aCIsInBhZGRpbmciLCJsaW1pdCIsInVwbG9hZFVybCIsInVwbG9hZEhlYWRlciIsImNhbGxCYWNrIiwiZXJyb3JDYWxsQmFjayIsImZpbGVQbHVnaW4iLCJfY2FsbEJhY2tVcGxvYWQiLCJzZXRSZXF1ZXN0SGVhZGVyIiwidGFnTmFtZXMiLCJ1cGxvYWRFdmVudEhhbmRsZXIiLCJpbmZvTGlzdCIsInNldEZpbGVJbmZvIiwiaW5mb1VwZGF0ZSIsImN1cnJlbnRUYWdzIiwiaW5mb0luZGV4IiwicGxndWluIiwic3RhdGUiLCJzY3JvbGxJbnRvVmlldyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFB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c291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiWEpSMVwiKTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cbiAgICAgICAgICAgIGZhY3RvcnkoZ2xvYmFsLCB0cnVlKSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmICghdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NVTkVESVRPUl9NT0RVTEVTIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeSh3KTtcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShnbG9iYWwpO1xuICAgIH1cbn0odHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBub0dsb2JhbCkge1xuICAgIGNvbnN0IGRpYWxvZyA9IHtcbiAgICAgICAgbmFtZTogJ2RpYWxvZycsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICAgICAgY29udGV4dC5kaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAga2luZDogJycsXG4gICAgICAgICAgICAgICAgdXBkYXRlTW9kYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIF9jbG9zZVNpZ25hbDogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8qKiBkaWFsb2cgKi9cbiAgICAgICAgICAgIGxldCBkaWFsb2dfZGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgZGlhbG9nX2Rpdi5jbGFzc05hbWUgPSAnc2UtZGlhbG9nIHN1bi1lZGl0b3ItY29tbW9uJztcblxuICAgICAgICAgICAgbGV0IGRpYWxvZ19iYWNrID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgZGlhbG9nX2JhY2suY2xhc3NOYW1lID0gJ3NlLWRpYWxvZy1iYWNrJztcbiAgICAgICAgICAgIGRpYWxvZ19iYWNrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBkaWFsb2dfYXJlYSA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIGRpYWxvZ19hcmVhLmNsYXNzTmFtZSA9ICdzZS1kaWFsb2ctaW5uZXInO1xuICAgICAgICAgICAgZGlhbG9nX2FyZWEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgZGlhbG9nX2Rpdi5hcHBlbmRDaGlsZChkaWFsb2dfYmFjayk7XG4gICAgICAgICAgICBkaWFsb2dfZGl2LmFwcGVuZENoaWxkKGRpYWxvZ19hcmVhKTtcblxuICAgICAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWxBcmVhID0gZGlhbG9nX2RpdjtcbiAgICAgICAgICAgIGNvbnRleHQuZGlhbG9nLmJhY2sgPSBkaWFsb2dfYmFjaztcbiAgICAgICAgICAgIGNvbnRleHQuZGlhbG9nLm1vZGFsID0gZGlhbG9nX2FyZWE7XG5cbiAgICAgICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93bl9kaWFsb2cuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tfZGlhbG9nLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZWxhdGl2ZS5hcHBlbmRDaGlsZChkaWFsb2dfZGl2KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICAgICAgZGlhbG9nX2RpdiA9IG51bGwsIGRpYWxvZ19iYWNrID0gbnVsbCwgZGlhbG9nX2FyZWEgPSBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgY2xvc2luZyB0aGUgZGlhbG9nXG4gICAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9vbk1vdXNlRG93bl9kaWFsb2c6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoL3NlLWRpYWxvZy1pbm5lci8udGVzdChlLnRhcmdldC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5fY2xvc2VTaWduYWwgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLl9jbG9zZVNpZ25hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY2xvc2UgdGhlIHdpbmRvdyB3aGVuIHRoZSBvdXRzaWRlIGFyZWEgb2YgdGhlIGRpYWxvZyBvciBjbG9zZSBidXR0b24gaXMgY2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlIEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX29uQ2xpY2tfZGlhbG9nOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgaWYgKC9jbG9zZS8udGVzdChlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpKSB8fCB0aGlzLmNvbnRleHQuZGlhbG9nLl9jbG9zZVNpZ25hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBEaWFsb2cgcGx1Z2luXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBraW5kIERpYWxvZyBwbHVnaW4gbmFtZVxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHVwZGF0ZSBXaGV0aGVyIGl0IHdpbGwgb3BlbiBmb3IgdXBkYXRlICgnaW1hZ2UnID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSlcbiAgICAgICAgICovXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uIChraW5kLCB1cGRhdGUpICB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RhbEZvcm0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvMjcvLnRlc3QoZS5rZXlDb2RlKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPSB1cGRhdGU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9wdXBEaXNwbGF5ID09PSAnZnVsbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLm1vZGFsQXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWxBcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5raW5kID0ga2luZDtcbiAgICAgICAgICAgIHRoaXMubW9kYWxGb3JtID0gdGhpcy5jb250ZXh0W2tpbmRdLm1vZGFsO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNFbGVtZW50ID0gdGhpcy5jb250ZXh0W2tpbmRdLmZvY3VzRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBsdWdpbnNba2luZF0ub24gPT09ICdmdW5jdGlvbicpIHRoaXMucGx1Z2luc1traW5kXS5vbi5jYWxsKHRoaXMsIHVwZGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWxBcmVhLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5iYWNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgLy8gdGhpcy5jb250ZXh0LmRpYWxvZy5tb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOyBAdjNcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB0aGlzLm1vZGFsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgaWYgKGZvY3VzRWxlbWVudCkgZm9jdXNFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2JpbmRDbG9zZTogbnVsbCxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2xvc2UgYSBEaWFsb2cgcGx1Z2luXG4gICAgICAgICAqIFRoZSBwbHVnaW4ncyBcImluaXRcIiBtZXRob2QgaXMgY2FsbGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSB0aGlzLmNvbnRleHQuZGlhbG9nLmtpbmQ7XG4gICAgICAgICAgICB0aGlzLm1vZGFsRm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5iYWNrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLm1vZGFsQXJlYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBsdWdpbnNba2luZF0uaW5pdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wbHVnaW5zW2tpbmRdLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cua2luZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5tb2RhbEZvcm0gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2Ygbm9HbG9iYWwgPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuU1VORURJVE9SX01PRFVMRVMpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdTVU5FRElUT1JfTU9EVUxFUycsIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNVTkVESVRPUl9NT0RVTEVTLCAnZGlhbG9nJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogZGlhbG9nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkaWFsb2c7XG59KSk7IiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuICAgICAgICAgICAgZmFjdG9yeShnbG9iYWwsIHRydWUpIDpcbiAgICAgICAgICAgIGZ1bmN0aW9uICh3KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3LmRvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU1VORURJVE9SX01PRFVMRVMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KHcpO1xuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmYWN0b3J5KGdsb2JhbCk7XG4gICAgfVxufSh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uICh3aW5kb3csIG5vR2xvYmFsKSB7XG4gICAgY29uc3QgZmlsZUJyb3dzZXIgPSB7XG4gICAgICAgIG5hbWU6ICdmaWxlQnJvd3NlcicsXG4gICAgICAgIF94bWxIdHRwOiBudWxsLFxuICAgICAgICBfbG9hZGluZzogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0IFxuICAgICAgICAgKi9cbiAgICAgICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIgPSB7XG4gICAgICAgICAgICAgICAgX2Nsb3NlU2lnbmFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhcmVhOiBudWxsLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogbnVsbCxcbiAgICAgICAgICAgICAgICB0YWdBcmVhOiBudWxsLFxuICAgICAgICAgICAgICAgIGJvZHk6IG51bGwsXG4gICAgICAgICAgICAgICAgbGlzdDogbnVsbCxcbiAgICAgICAgICAgICAgICB0YWdFbGVtZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvckhhbmRsZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgY29udGV4dFBsdWdpbjogJycsXG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZTogNFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyoqIGZpbGVCcm93c2VyICovXG4gICAgICAgICAgICBsZXQgYnJvd3Nlcl9kaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBicm93c2VyX2Rpdi5jbGFzc05hbWUgPSAnc2UtZmlsZS1icm93c2VyIHN1bi1lZGl0b3ItY29tbW9uJztcblxuICAgICAgICAgICAgbGV0IGJhY2sgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBiYWNrLmNsYXNzTmFtZSA9ICdzZS1maWxlLWJyb3dzZXItYmFjayc7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgY29udGVudC5jbGFzc05hbWUgPSAnc2UtZmlsZS1icm93c2VyLWlubmVyJztcbiAgICAgICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gdGhpcy5zZXRfYnJvd3Nlcihjb3JlKTtcblxuICAgICAgICAgICAgYnJvd3Nlcl9kaXYuYXBwZW5kQ2hpbGQoYmFjayk7XG4gICAgICAgICAgICBicm93c2VyX2Rpdi5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmcgPSBicm93c2VyX2Rpdi5xdWVyeVNlbGVjdG9yKCcuc2UtbG9hZGluZy1ib3gnKTtcblxuICAgICAgICAgICAgY29udGV4dC5maWxlQnJvd3Nlci5hcmVhID0gYnJvd3Nlcl9kaXY7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLmhlYWRlciA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignLnNlLWZpbGUtYnJvd3Nlci1oZWFkZXInKTtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIudGl0bGVBcmVhID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcuc2UtZmlsZS1icm93c2VyLXRpdGxlJyk7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLnRhZ0FyZWEgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZS1maWxlLWJyb3dzZXItdGFncycpO1xuICAgICAgICAgICAgY29udGV4dC5maWxlQnJvd3Nlci5ib2R5ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcuc2UtZmlsZS1icm93c2VyLWJvZHknKTtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIubGlzdCA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignLnNlLWZpbGUtYnJvd3Nlci1saXN0Jyk7XG5cbiAgICAgICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLnRhZ0FyZWEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tUYWcuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLmxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tGaWxlLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgY29udGVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93bl9icm93c2VyLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgY29udGVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tfYnJvd3Nlci5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQoYnJvd3Nlcl9kaXYpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgICAgICBicm93c2VyX2RpdiA9IG51bGwsIGJhY2sgPSBudWxsLCBjb250ZW50ID0gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRfYnJvd3NlcjogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG5cbiAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cInNlLWZpbGUtYnJvd3Nlci1jb250ZW50XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1icm93c2VyLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImNsb3NlXCIgY2xhc3M9XCJzZS1idG4gc2UtZmlsZS1icm93c2VyLWNsb3NlXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LmNsb3NlICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5jYW5jZWwgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtZmlsZS1icm93c2VyLXRpdGxlXCI+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWJyb3dzZXItdGFnc1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1icm93c2VyLWJvZHlcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtbG9hZGluZy1ib3ggc3VuLWVkaXRvci1jb21tb25cIj48ZGl2IGNsYXNzPVwic2UtbG9hZGluZy1lZmZlY3RcIj48L2Rpdj48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1icm93c2VyLWxpc3RcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgY2xvc2luZyB0aGUgYnJvd3NlclxuICAgICAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgRXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfb25Nb3VzZURvd25fYnJvd3NlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICgvc2UtZmlsZS1icm93c2VyLWlubmVyLy50ZXN0KGUudGFyZ2V0LmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXIuX2Nsb3NlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyLl9jbG9zZVNpZ25hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY2xvc2UgdGhlIHdpbmRvdyB3aGVuIHRoZSBvdXRzaWRlIGFyZWEgb2YgdGhlIGJyb3dzZXIgb3IgY2xvc2UgYnV0dG9uIGlzIGNsaWNrXG4gICAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9vbkNsaWNrX2Jyb3dzZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAoL2Nsb3NlLy50ZXN0KGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykpIHx8IHRoaXMuY29udGV4dC5maWxlQnJvd3Nlci5fY2xvc2VTaWduYWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBmaWxlIGJyb3dzZXIgcGx1Z2luXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIFBsdWdpbiBuYW1lIHVzaW5nIHRoZSBmaWxlIGJyb3dzZXJcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBzZWxlY3RvckhhbmRsZXIgV2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgYXMgYW4gYXJndW1lbnQgdmFsdWUsIGl0IHN1YnN0aXR1dGVzIFwiY29udGV4dC5zZWxlY3RvckhhbmRsZXJcIi5cbiAgICAgICAgICovXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBzZWxlY3RvckhhbmRsZXIpICB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl9iaW5kQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuX2JpbmRDbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl9iaW5kQ2xvc2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuX2JpbmRDbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvMjcvLnRlc3QoZS5rZXlDb2RlKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fZC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl9iaW5kQ2xvc2UpO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlQnJvd3NlckNvbnRleHQgPSB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXI7XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuY29udGV4dFBsdWdpbiA9IHBsdWdpbk5hbWU7XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuc2VsZWN0b3JIYW5kbGVyID0gc2VsZWN0b3JIYW5kbGVyO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBwbHVnaW5Db250ZXh0ID0gdGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdO1xuICAgICAgICAgICAgY29uc3QgbGlzdENsYXNzTmFtZSA9IHBsdWdpbkNvbnRleHQubGlzdENsYXNzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWwuaGFzQ2xhc3MoZmlsZUJyb3dzZXJDb250ZXh0Lmxpc3QsIGxpc3RDbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lmxpc3QuY2xhc3NOYW1lID0gJ3NlLWZpbGUtYnJvd3Nlci1saXN0ICcgKyBsaXN0Q2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvcHVwRGlzcGxheSA9PT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LmFyZWEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuYXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC50aXRsZUFyZWEudGV4dENvbnRlbnQgPSBwbHVnaW5Db250ZXh0LnRpdGxlO1xuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LmFyZWEuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5fZHJhd0ZpbGVMaXN0LmNhbGwodGhpcywgdGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdLnVybCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2JpbmRDbG9zZTogbnVsbCxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2xvc2UgYSBmaWxlQnJvd3NlciBwbHVnaW5cbiAgICAgICAgICogVGhlIHBsdWdpbidzIFwiaW5pdFwiIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZUJyb3dzZXJQbHVnaW4gPSB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXI7XG5cbiAgICAgICAgICAgIGlmIChmaWxlQnJvd3NlclBsdWdpbi5feG1sSHR0cCkge1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyUGx1Z2luLl94bWxIdHRwLmFib3J0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWxlQnJvd3NlclBsdWdpbi5fYmluZENsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZmlsZUJyb3dzZXJQbHVnaW4uX2JpbmRDbG9zZSk7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJQbHVnaW4uX2JpbmRDbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyQ29udGV4dCA9IHRoaXMuY29udGV4dC5maWxlQnJvd3NlcjtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5hcmVhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuc2VsZWN0b3JIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5zZWxlY3RlZFRhZ3MgPSBbXTtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5pdGVtcyA9IFtdO1xuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lmxpc3QuaW5uZXJIVE1MID0gZmlsZUJyb3dzZXJDb250ZXh0LnRhZ0FyZWEuaW5uZXJIVE1MID0gZmlsZUJyb3dzZXJDb250ZXh0LnRpdGxlQXJlYS50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucGx1Z2luc1tmaWxlQnJvd3NlckNvbnRleHQuY29udGV4dFBsdWdpbl0uaW5pdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wbHVnaW5zW2ZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luXS5pbml0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuY29udGV4dFBsdWdpbiA9ICcnO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBmaWxlIGJyb3dzZXIgbG9hZGluZyBib3hcbiAgICAgICAgICovXG4gICAgICAgIHNob3dCcm93c2VyTG9hZGluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGZpbGUgYnJvd3NlciBsb2FkaW5nIGJveFxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2VCcm93c2VyTG9hZGluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9kcmF3RmlsZUxpc3Q6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyUGx1Z2luID0gdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyO1xuXG4gICAgICAgICAgICBjb25zdCB4bWxIdHRwID0gZmlsZUJyb3dzZXJQbHVnaW4uX3htbEh0dHAgPSB0aGlzLnV0aWwuZ2V0WE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhtbEh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZmlsZUJyb3dzZXJQbHVnaW4uX2NhbGxCYWNrR2V0LmJpbmQodGhpcywgeG1sSHR0cCk7XG4gICAgICAgICAgICB4bWxIdHRwLm9wZW4oJ2dldCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICB4bWxIdHRwLnNlbmQobnVsbCk7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5zaG93QnJvd3NlckxvYWRpbmcoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfY2FsbEJhY2tHZXQ6IGZ1bmN0aW9uICh4bWxIdHRwKSB7XG4gICAgICAgICAgICBpZiAoeG1sSHR0cC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl94bWxIdHRwID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoeG1sSHR0cC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl9kcmF3TGlzdEl0ZW0uY2FsbCh0aGlzLCBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KS5yZXN1bHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5maWxlQnJvd3Nlci5kcmF3TGlzdC5mYWlsXSBjYXVzZSA6IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLmNsb3NlQnJvd3NlckxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWxlQnJvd3Nlci5ib2R5LnN0eWxlLm1heEhlaWdodCA9ICh0aGlzLl93LmlubmVySGVpZ2h0IC0gdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyLmhlYWRlci5vZmZzZXRIZWlnaHQgLSA1MCkgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5jbG9zZUJyb3dzZXJMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4bWxIdHRwLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gIXhtbEh0dHAucmVzcG9uc2VUZXh0ID8geG1sSHR0cCA6IEpTT04ucGFyc2UoeG1sSHR0cC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gJ1tTVU5FRElUT1IuZmlsZUJyb3dzZXIuZ2V0LnNlcnZlckV4Y2VwdGlvbl0gc3RhdHVzOiAnICsgeG1sSHR0cC5zdGF0dXMgKyAnLCByZXNwb25zZTogJyArIChyZXMuZXJyb3JNZXNzYWdlIHx8IHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2RyYXdMaXN0SXRlbTogZnVuY3Rpb24gKGl0ZW1zLCB1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyQ29udGV4dCA9IHRoaXMuY29udGV4dC5maWxlQnJvd3NlcjtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbkNvbnRleHQgPSB0aGlzLmNvbnRleHRbZmlsZUJyb3dzZXJDb250ZXh0LmNvbnRleHRQbHVnaW5dO1xuXG4gICAgICAgICAgICBjb25zdCBfdGFncyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uU2l6ZSA9IHBsdWdpbkNvbnRleHQuY29sdW1uU2l6ZSB8fCBmaWxlQnJvd3NlckNvbnRleHQuY29sdW1uU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0U2l6ZSA9IGNvbHVtblNpemUgPD0gMSA/IDEgOiAoTWF0aC5yb3VuZChsZW4vY29sdW1uU2l6ZSkgfHwgMSk7XG4gICAgICAgICAgICBjb25zdCBkcmF3SXRlbUhhbmRsZXIgPSBwbHVnaW5Db250ZXh0Lml0ZW1UZW1wbGF0ZUhhbmRsZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0YWdzSFRNTCA9ICcnO1xuICAgICAgICAgICAgbGV0IGxpc3RIVE1MID0gJzxkaXYgY2xhc3M9XCJzZS1maWxlLWl0ZW0tY29sdW1uXCI+JztcbiAgICAgICAgICAgIGxldCBjb2x1bW5zID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpdGVtLCB0YWdzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgdGFncyA9ICFpdGVtLnRhZyA/IFtdIDogdHlwZW9mIGl0ZW0udGFnID09PSAnc3RyaW5nJyA/IGl0ZW0udGFnLnNwbGl0KCcsJykgOiBpdGVtLnRhZztcbiAgICAgICAgICAgICAgICB0YWdzID0gaXRlbS50YWcgPSB0YWdzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi50cmltKCk7IH0pO1xuICAgICAgICAgICAgICAgIGxpc3RIVE1MICs9IGRyYXdJdGVtSGFuZGxlcihpdGVtKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaSArIDEpICUgc3BsaXRTaXplID09PSAwICYmIGNvbHVtbnMgPCBjb2x1bW5TaXplICYmIChpICsgMSkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1ucysrO1xuICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCArPSAnPC9kaXY+PGRpdiBjbGFzcz1cInNlLWZpbGUtaXRlbS1jb2x1bW5cIj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlICYmIHRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMCwgdExlbiA9IHRhZ3MubGVuZ3RoLCB0YWc7IHQgPCB0TGVuOyB0KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZ3NbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnICYmIF90YWdzLmluZGV4T2YodGFnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnc0hUTUwgKz0gJzxhIHRpdGxlPVwiJyArIHRhZyArICdcIj4nICsgdGFnICsgJzwvYT4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdEhUTUwgKz0gJzwvZGl2Pic7XG5cbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5saXN0LmlubmVySFRNTCA9IGxpc3RIVE1MO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lml0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LnRhZ0FyZWEuaW5uZXJIVE1MID0gdGFnc0hUTUw7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LnRhZ0VsZW1lbnRzID0gZmlsZUJyb3dzZXJDb250ZXh0LnRhZ0FyZWEucXVlcnlTZWxlY3RvckFsbCgnQScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uQ2xpY2tUYWc6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGlmICghdGhpcy51dGlsLmlzQW5jaG9yKHRhcmdldCkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRhcmdldC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyUGx1Z2luID0gdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyO1xuICAgICAgICAgICAgY29uc3QgZmlsZUJyb3dzZXJDb250ZXh0ID0gdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RUYWcgPSBmaWxlQnJvd3NlckNvbnRleHQudGFnQXJlYS5xdWVyeVNlbGVjdG9yKCdhW3RpdGxlPVwiJyArIHRhZ05hbWUgKyAnXCJdJyk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRhZ3MgPSBmaWxlQnJvd3NlckNvbnRleHQuc2VsZWN0ZWRUYWdzO1xuICAgICAgICAgICAgY29uc3Qgc1RhZ0luZGV4ID0gc2VsZWN0ZWRUYWdzLmluZGV4T2YodGFnTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChzVGFnSW5kZXggPiAtMSl7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzLnNwbGljZShzVGFnSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RUYWcsICdvbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhZ3MucHVzaCh0YWdOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3Moc2VsZWN0VGFnLCAnb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZUJyb3dzZXJQbHVnaW4uX2RyYXdMaXN0SXRlbS5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzLmxlbmd0aCA9PT0gMCA/XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lml0ZW1zIDpcbiAgICAgICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnRhZy5zb21lKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFRhZ3MuaW5kZXhPZih0YWcpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLCBmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb25DbGlja0ZpbGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlQnJvd3NlckNvbnRleHQgPSB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXI7XG4gICAgICAgICAgICBjb25zdCBsaXN0RWwgPSBmaWxlQnJvd3NlckNvbnRleHQubGlzdDtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGxldCBjb21tYW5kID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gbGlzdEVsKSByZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChsaXN0RWwgIT09IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kKSBicmVhaztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZmlsZUJyb3dzZXJDb250ZXh0LnNlbGVjdG9ySGFuZGxlciB8fCB0aGlzLmNvbnRleHRbZmlsZUJyb3dzZXJDb250ZXh0LmNvbnRleHRQbHVnaW5dLnNlbGVjdG9ySGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGhhbmRsZXIodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG5vR2xvYmFsID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghd2luZG93LlNVTkVESVRPUl9NT0RVTEVTKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnU1VORURJVE9SX01PRFVMRVMnLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUywgJ2ZpbGVCcm93c2VyJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogZmlsZUJyb3dzZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVCcm93c2VyO1xufSkpOyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cbiAgICAgICAgICAgIGZhY3RvcnkoZ2xvYmFsLCB0cnVlKSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmICghdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NVTkVESVRPUl9MQU5HIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeSh3KTtcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShnbG9iYWwpO1xuICAgIH1cbn0odHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBub0dsb2JhbCkge1xuICAgIGNvbnN0IGxhbmcgPSB7XG4gICAgICAgIGNvZGU6ICdlbicsXG4gICAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIHNhdmU6ICdTYXZlJyxcbiAgICAgICAgICAgIGZvbnQ6ICdGb250JyxcbiAgICAgICAgICAgIGZvcm1hdHM6ICdGb3JtYXRzJyxcbiAgICAgICAgICAgIGZvbnRTaXplOiAnU2l6ZScsXG4gICAgICAgICAgICBib2xkOiAnQm9sZCcsXG4gICAgICAgICAgICB1bmRlcmxpbmU6ICdVbmRlcmxpbmUnLFxuICAgICAgICAgICAgaXRhbGljOiAnSXRhbGljJyxcbiAgICAgICAgICAgIHN0cmlrZTogJ1N0cmlrZScsXG4gICAgICAgICAgICBzdWJzY3JpcHQ6ICdTdWJzY3JpcHQnLFxuICAgICAgICAgICAgc3VwZXJzY3JpcHQ6ICdTdXBlcnNjcmlwdCcsXG4gICAgICAgICAgICByZW1vdmVGb3JtYXQ6ICdSZW1vdmUgRm9ybWF0JyxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogJ0ZvbnQgQ29sb3InLFxuICAgICAgICAgICAgaGlsaXRlQ29sb3I6ICdIaWdobGlnaHQgQ29sb3InLFxuICAgICAgICAgICAgaW5kZW50OiAnSW5kZW50JyxcbiAgICAgICAgICAgIG91dGRlbnQ6ICdPdXRkZW50JyxcbiAgICAgICAgICAgIGFsaWduOiAnQWxpZ24nLFxuICAgICAgICAgICAgYWxpZ25MZWZ0OiAnQWxpZ24gbGVmdCcsXG4gICAgICAgICAgICBhbGlnblJpZ2h0OiAnQWxpZ24gcmlnaHQnLFxuICAgICAgICAgICAgYWxpZ25DZW50ZXI6ICdBbGlnbiBjZW50ZXInLFxuICAgICAgICAgICAgYWxpZ25KdXN0aWZ5OiAnQWxpZ24ganVzdGlmeScsXG4gICAgICAgICAgICBsaXN0OiAnTGlzdCcsXG4gICAgICAgICAgICBvcmRlckxpc3Q6ICdPcmRlcmVkIGxpc3QnLFxuICAgICAgICAgICAgdW5vcmRlckxpc3Q6ICdVbm9yZGVyZWQgbGlzdCcsXG4gICAgICAgICAgICBob3Jpem9udGFsUnVsZTogJ0hvcml6b250YWwgbGluZScsXG4gICAgICAgICAgICBocl9zb2xpZDogJ1NvbGlkJyxcbiAgICAgICAgICAgIGhyX2RvdHRlZDogJ0RvdHRlZCcsXG4gICAgICAgICAgICBocl9kYXNoZWQ6ICdEYXNoZWQnLFxuICAgICAgICAgICAgdGFibGU6ICdUYWJsZScsXG4gICAgICAgICAgICBsaW5rOiAnTGluaycsXG4gICAgICAgICAgICBtYXRoOiAnTWF0aCcsXG4gICAgICAgICAgICBpbWFnZTogJ0ltYWdlJyxcbiAgICAgICAgICAgIHZpZGVvOiAnVmlkZW8nLFxuICAgICAgICAgICAgYXVkaW86ICdBdWRpbycsXG4gICAgICAgICAgICBmdWxsU2NyZWVuOiAnRnVsbCBzY3JlZW4nLFxuICAgICAgICAgICAgc2hvd0Jsb2NrczogJ1Nob3cgYmxvY2tzJyxcbiAgICAgICAgICAgIGNvZGVWaWV3OiAnQ29kZSB2aWV3JyxcbiAgICAgICAgICAgIHVuZG86ICdVbmRvJyxcbiAgICAgICAgICAgIHJlZG86ICdSZWRvJyxcbiAgICAgICAgICAgIHByZXZpZXc6ICdQcmV2aWV3JyxcbiAgICAgICAgICAgIHByaW50OiAncHJpbnQnLFxuICAgICAgICAgICAgdGFnX3A6ICdQYXJhZ3JhcGgnLFxuICAgICAgICAgICAgdGFnX2RpdjogJ05vcm1hbCAoRElWKScsXG4gICAgICAgICAgICB0YWdfaDogJ0hlYWRlcicsXG4gICAgICAgICAgICB0YWdfYmxvY2txdW90ZTogJ1F1b3RlJyxcbiAgICAgICAgICAgIHRhZ19wcmU6ICdDb2RlJyxcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnVGVtcGxhdGUnLFxuICAgICAgICAgICAgbGluZUhlaWdodDogJ0xpbmUgaGVpZ2h0JyxcbiAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlOiAnUGFyYWdyYXBoIHN0eWxlJyxcbiAgICAgICAgICAgIHRleHRTdHlsZTogJ1RleHQgc3R5bGUnLFxuICAgICAgICAgICAgaW1hZ2VHYWxsZXJ5OiAnSW1hZ2UgZ2FsbGVyeScsXG4gICAgICAgICAgICBtZW50aW9uOiAnTWVudGlvbidcbiAgICAgICAgfSxcbiAgICAgICAgZGlhbG9nQm94OiB7XG4gICAgICAgICAgICBsaW5rQm94OiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgTGluaycsXG4gICAgICAgICAgICAgICAgdXJsOiAnVVJMIHRvIGxpbmsnLFxuICAgICAgICAgICAgICAgIHRleHQ6ICdUZXh0IHRvIGRpc3BsYXknLFxuICAgICAgICAgICAgICAgIG5ld1dpbmRvd0NoZWNrOiAnT3BlbiBpbiBuZXcgd2luZG93JyxcbiAgICAgICAgICAgICAgICBib29rbWFyazogJ0Jvb2ttYXJrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hdGhCb3g6IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ01hdGgnLFxuICAgICAgICAgICAgICAgIGlucHV0TGFiZWw6ICdNYXRoZW1hdGljYWwgTm90YXRpb24nLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplTGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgICAgICAgIHByZXZpZXdMYWJlbDogJ1ByZXZpZXcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1hZ2VCb3g6IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luc2VydCBpbWFnZScsXG4gICAgICAgICAgICAgICAgZmlsZTogJ1NlbGVjdCBmcm9tIGZpbGVzJyxcbiAgICAgICAgICAgICAgICB1cmw6ICdJbWFnZSBVUkwnLFxuICAgICAgICAgICAgICAgIGFsdFRleHQ6ICdBbHRlcm5hdGl2ZSB0ZXh0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvQm94OiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgVmlkZW8nLFxuICAgICAgICAgICAgICAgIGZpbGU6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG4gICAgICAgICAgICAgICAgdXJsOiAnTWVkaWEgZW1iZWQgVVJMLCBZb3VUdWJlL1ZpbWVvJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1ZGlvQm94OiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgQXVkaW8nLFxuICAgICAgICAgICAgICAgIGZpbGU6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG4gICAgICAgICAgICAgICAgdXJsOiAnQXVkaW8gVVJMJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJyb3dzZXI6IHtcbiAgICAgICAgICAgICAgICB0YWdzOiAnVGFncycsXG4gICAgICAgICAgICAgICAgc2VhcmNoOiAnU2VhcmNoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYXB0aW9uOiAnSW5zZXJ0IGRlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgIGNsb3NlOiAnQ2xvc2UnLFxuICAgICAgICAgICAgc3VibWl0QnV0dG9uOiAnU3VibWl0JyxcbiAgICAgICAgICAgIHJldmVydEJ1dHRvbjogJ1JldmVydCcsXG4gICAgICAgICAgICBwcm9wb3J0aW9uOiAnQ29uc3RyYWluIHByb3BvcnRpb25zJyxcbiAgICAgICAgICAgIGJhc2ljOiAnQmFzaWMnLFxuICAgICAgICAgICAgbGVmdDogJ0xlZnQnLFxuICAgICAgICAgICAgcmlnaHQ6ICdSaWdodCcsXG4gICAgICAgICAgICBjZW50ZXI6ICdDZW50ZXInLFxuICAgICAgICAgICAgd2lkdGg6ICdXaWR0aCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdIZWlnaHQnLFxuICAgICAgICAgICAgc2l6ZTogJ1NpemUnLFxuICAgICAgICAgICAgcmF0aW86ICdSYXRpbydcbiAgICAgICAgfSxcbiAgICAgICAgY29udHJvbGxlcjoge1xuICAgICAgICAgICAgZWRpdDogJ0VkaXQnLFxuICAgICAgICAgICAgdW5saW5rOiAnVW5saW5rJyxcbiAgICAgICAgICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgICAgICAgICBpbnNlcnRSb3dBYm92ZTogJ0luc2VydCByb3cgYWJvdmUnLFxuICAgICAgICAgICAgaW5zZXJ0Um93QmVsb3c6ICdJbnNlcnQgcm93IGJlbG93JyxcbiAgICAgICAgICAgIGRlbGV0ZVJvdzogJ0RlbGV0ZSByb3cnLFxuICAgICAgICAgICAgaW5zZXJ0Q29sdW1uQmVmb3JlOiAnSW5zZXJ0IGNvbHVtbiBiZWZvcmUnLFxuICAgICAgICAgICAgaW5zZXJ0Q29sdW1uQWZ0ZXI6ICdJbnNlcnQgY29sdW1uIGFmdGVyJyxcbiAgICAgICAgICAgIGRlbGV0ZUNvbHVtbjogJ0RlbGV0ZSBjb2x1bW4nLFxuICAgICAgICAgICAgZml4ZWRDb2x1bW5XaWR0aDogJ0ZpeGVkIGNvbHVtbiB3aWR0aCcsXG4gICAgICAgICAgICByZXNpemUxMDA6ICdSZXNpemUgMTAwJScsXG4gICAgICAgICAgICByZXNpemU3NTogJ1Jlc2l6ZSA3NSUnLFxuICAgICAgICAgICAgcmVzaXplNTA6ICdSZXNpemUgNTAlJyxcbiAgICAgICAgICAgIHJlc2l6ZTI1OiAnUmVzaXplIDI1JScsXG4gICAgICAgICAgICBhdXRvU2l6ZTogJ0F1dG8gc2l6ZScsXG4gICAgICAgICAgICBtaXJyb3JIb3Jpem9udGFsOiAnTWlycm9yLCBIb3Jpem9udGFsJyxcbiAgICAgICAgICAgIG1pcnJvclZlcnRpY2FsOiAnTWlycm9yLCBWZXJ0aWNhbCcsXG4gICAgICAgICAgICByb3RhdGVMZWZ0OiAnUm90YXRlIGxlZnQnLFxuICAgICAgICAgICAgcm90YXRlUmlnaHQ6ICdSb3RhdGUgcmlnaHQnLFxuICAgICAgICAgICAgbWF4U2l6ZTogJ01heCBzaXplJyxcbiAgICAgICAgICAgIG1pblNpemU6ICdNaW4gc2l6ZScsXG4gICAgICAgICAgICB0YWJsZUhlYWRlcjogJ1RhYmxlIGhlYWRlcicsXG4gICAgICAgICAgICBtZXJnZUNlbGxzOiAnTWVyZ2UgY2VsbHMnLFxuICAgICAgICAgICAgc3BsaXRDZWxsczogJ1NwbGl0IENlbGxzJyxcbiAgICAgICAgICAgIEhvcml6b250YWxTcGxpdDogJ0hvcml6b250YWwgc3BsaXQnLFxuICAgICAgICAgICAgVmVydGljYWxTcGxpdDogJ1ZlcnRpY2FsIHNwbGl0J1xuICAgICAgICB9LFxuICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICBzcGFjZWQ6ICdTcGFjZWQnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6ICdCb3JkZXJlZCcsXG4gICAgICAgICAgICBuZW9uOiAnTmVvbicsXG4gICAgICAgICAgICB0cmFuc2x1Y2VudDogJ1RyYW5zbHVjZW50JyxcbiAgICAgICAgICAgIHNoYWRvdzogJ1NoYWRvdycsXG4gICAgICAgICAgICBjb2RlOiAnQ29kZSdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG5vR2xvYmFsID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghd2luZG93LlNVTkVESVRPUl9MQU5HKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnU1VORURJVE9SX0xBTkcnLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TVU5FRElUT1JfTEFORywgJ2VuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGxhbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmc7XG59KSk7IiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxOCBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdjb2xvclBpY2tlcicsXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xyXG4gICAgICAgIGNvbnRleHQuY29sb3JQaWNrZXIgPSB7XHJcbiAgICAgICAgICAgIGNvbG9yTGlzdEhUTUw6ICcnLFxyXG4gICAgICAgICAgICBfY29sb3JJbnB1dDogJycsXHJcbiAgICAgICAgICAgIF9kZWZhdWx0Q29sb3I6ICcjMDAwJyxcclxuICAgICAgICAgICAgX3N0eWxlUHJvcGVydHk6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIF9jdXJyZW50Q29sb3I6ICcnLFxyXG4gICAgICAgICAgICBfY29sb3JMaXN0OiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xyXG4gICAgICAgIGxldCBsaXN0RGl2ID0gdGhpcy5jcmVhdGVDb2xvckxpc3QoY29yZSwgdGhpcy5fbWFrZUNvbG9yTGlzdCk7XHJcblxyXG4gICAgICAgIC8qKiBjYWNoaW5nICovXHJcbiAgICAgICAgY29udGV4dC5jb2xvclBpY2tlci5jb2xvckxpc3RIVE1MID0gbGlzdERpdjtcclxuXHJcbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xyXG4gICAgICAgIGxpc3REaXYgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgY29sb3IgbGlzdFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYWtlQ29sb3IgdGhpcy5fbWFrZUNvbG9yTGlzdFxyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSFRNTCBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ29sb3JMaXN0OiBmdW5jdGlvbiAoY29yZSwgbWFrZUNvbG9yKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgY29sb3JMaXN0ID0gIW9wdGlvbi5jb2xvckxpc3QgfHwgb3B0aW9uLmNvbG9yTGlzdC5sZW5ndGggPT09IDAgP1xyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAnI2ZmMDAwMCcsICcjZmY1ZTAwJywgJyNmZmU0MDAnLCAnI2FiZjIwMCcsICcjMDBkOGZmJywgJyMwMDU1ZmYnLCAnIzY2MDBmZicsICcjZmYwMGRkJywgJyMwMDAwMDAnLFxyXG4gICAgICAgICAgICAgICAgJyNmZmQ4ZDgnLCAnI2ZhZTBkNCcsICcjZmFmNGMwJywgJyNlNGY3YmEnLCAnI2Q0ZjRmYScsICcjZDllNWZmJywgJyNlOGQ5ZmYnLCAnI2ZmZDlmYScsICcjZjFmMWYxJyxcclxuICAgICAgICAgICAgICAgICcjZmZhN2E3JywgJyNmZmMxOWUnLCAnI2ZhZWQ3ZCcsICcjY2VmMjc5JywgJyNiMmViZjQnLCAnI2IyY2NmZicsICcjZDFiMmZmJywgJyNmZmIyZjUnLCAnI2JkYmRiZCcsXHJcbiAgICAgICAgICAgICAgICAnI2YxNWY1ZicsICcjZjI5NjYxJywgJyNlNWQ4NWMnLCAnI2JjZTU1YycsICcjNWNkMWU1JywgJyM2Njk5ZmYnLCAnI2EzNjZmZicsICcjZjI2MWRmJywgJyM4YzhjOGMnLFxyXG4gICAgICAgICAgICAgICAgJyM5ODAwMDAnLCAnIzk5MzgwMCcsICcjOTk4YTAwJywgJyM2Yjk5MDAnLCAnIzAwODI5OScsICcjMDAzMzk5JywgJyMzZDAwOTknLCAnIzk5MDA4NScsICcjMzUzNTM1JyxcclxuICAgICAgICAgICAgICAgICcjNjcwMDAwJywgJyM2NjI1MDAnLCAnIzY2NWMwMCcsICcjNDc2NjAwJywgJyMwMDU3NjYnLCAnIzAwMjI2NicsICcjMjkwMDY2JywgJyM2NjAwNTgnLCAnIzIyMjIyMidcclxuICAgICAgICAgICAgXSA6IG9wdGlvbi5jb2xvckxpc3Q7XHJcblxyXG4gICAgICAgIGxldCBjb2xvckFyciA9IFtdO1xyXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbG9yTGlzdC5sZW5ndGgsIGNvbG9yOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JMaXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2xvcikgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3JBcnIucHVzaChjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb2xvckFyci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdCArPSAnPGRpdiBjbGFzcz1cInNlLXNlbGVjdG9yLWNvbG9yXCI+JyArIG1ha2VDb2xvcihjb2xvckFycikgKyAnPC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICBjb2xvckFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0ICs9ICc8ZGl2IGNsYXNzPVwic2Utc2VsZWN0b3ItY29sb3JcIj4nICsgbWFrZUNvbG9yKGNvbG9yKSArICc8L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpc3QgKz0gJycgK1xyXG4gICAgICAgICAgICAnPGZvcm0gY2xhc3M9XCJzZS1mb3JtLWdyb3VwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiOVwiIGNsYXNzPVwiX3NlX2NvbG9yX3BpY2tlcl9pbnB1dCBzZS1jb2xvci1pbnB1dFwiLz4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNlLWJ0bi1wcmltYXJ5IF9zZV9jb2xvcl9waWNrZXJfc3VibWl0XCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2hlY2tlZCArXHJcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gX3NlX2NvbG9yX3BpY2tlcl9yZW1vdmVcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIucmVtb3ZlRm9ybWF0ICsgJ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuZXJhc2UgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAnPC9mb3JtPicgK1xyXG4gICAgICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhpcy5jcmVhdGVDb2xvckxpc3RcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGNvbG9yTGlzdCBDb2xvciBsaXN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfbWFrZUNvbG9yTGlzdDogZnVuY3Rpb24gKGNvbG9yTGlzdCkge1xyXG4gICAgICAgIGxldCBsaXN0ID0gJyc7XHJcblxyXG4gICAgICAgIGxpc3QgKz0gJzx1bCBjbGFzcz1cInNlLWNvbG9yLXBhbGxldFwiPic7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbG9yTGlzdC5sZW5ndGgsIGNvbG9yOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29sb3IgPSBjb2xvckxpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0ICs9ICc8bGk+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS12YWx1ZT1cIicgKyBjb2xvciArICdcIiB0aXRsZT1cIicgKyBjb2xvciArICdcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGNvbG9yICsgJztcIj48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzwvbGk+JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsaXN0ICs9ICc8L3VsPic7XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0O1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGlzcGxheXMgb3IgcmVzZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29sb3IgYXQgY29sb3IgbGlzdC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBDdXJyZW50IFNlbGVjdGVkIG5vZGVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfG51bGx9IGNvbG9yIENvbG9yIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIGluaXQ6IGZ1bmN0aW9uIChub2RlLCBjb2xvcikge1xyXG4gICAgICAgIGNvbnN0IGNvbG9yUGlja2VyID0gdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyO1xyXG4gICAgICAgIGxldCBmaWxsQ29sb3IgPSBjb2xvciA/IGNvbG9yIDogY29sb3JQaWNrZXIuZ2V0Q29sb3JJbk5vZGUuY2FsbCh0aGlzLCBub2RlKSB8fCB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2RlZmF1bHRDb2xvcjtcclxuICAgICAgICBmaWxsQ29sb3IgPSBjb2xvclBpY2tlci5pc0hleENvbG9yKGZpbGxDb2xvcikgPyBmaWxsQ29sb3IgOiBjb2xvclBpY2tlci5yZ2IyaGV4KGZpbGxDb2xvcikgfHwgZmlsbENvbG9yO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckxpc3QgPSB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2NvbG9yTGlzdDtcclxuICAgICAgICBpZiAoY29sb3JMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjb2xvckxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxsQ29sb3IudG9Mb3dlckNhc2UoKSA9PT0gY29sb3JMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29sb3JMaXN0W2ldLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb2xvckxpc3RbaV0sICdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sb3JQaWNrZXIuc2V0SW5wdXRUZXh0LmNhbGwodGhpcywgY29sb3JQaWNrZXIuY29sb3JOYW1lMmhleC5jYWxsKHRoaXMsIGZpbGxDb2xvcikpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9yZSBjb2xvciB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZXhDb2xvclN0ciBIYXggY29sb3IgdmFsdWVcclxuICAgICAqL1xyXG4gICAgc2V0Q3VycmVudENvbG9yOiBmdW5jdGlvbiAoaGV4Q29sb3JTdHIpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2N1cnJlbnRDb2xvciA9IGhleENvbG9yU3RyO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5jb2xvclBpY2tlci5fY29sb3JJbnB1dC5zdHlsZS5ib3JkZXJDb2xvciA9IGhleENvbG9yU3RyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY29sb3IgYXQgaW5wdXQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhleENvbG9yU3RyIEhheCBjb2xvciB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBzZXRJbnB1dFRleHQ6IGZ1bmN0aW9uIChoZXhDb2xvclN0cikge1xyXG4gICAgICAgIGhleENvbG9yU3RyID0gL14jLy50ZXN0KGhleENvbG9yU3RyKSA/IGhleENvbG9yU3RyIDogJyMnICsgaGV4Q29sb3JTdHI7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9jb2xvcklucHV0LnZhbHVlID0gaGV4Q29sb3JTdHI7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyLnNldEN1cnJlbnRDb2xvci5jYWxsKHRoaXMsIGhleENvbG9yU3RyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyBjb2xvciB2YWx1ZSBhdCBjb2xvciBwcm9wZXJ0eSBvZiBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgU2VsZWN0ZWQgbm9kZSBcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldENvbG9ySW5Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIGxldCBmaW5kQ29sb3IgPSAnJztcclxuICAgICAgICBjb25zdCBzdHlsZVByb3BlcnR5ID0gdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9zdHlsZVByb3BlcnR5O1xyXG5cclxuICAgICAgICB3aGlsZSAobm9kZSAmJiAhdGhpcy51dGlsLmlzV3lzaXd5Z0Rpdihub2RlKSAmJiBmaW5kQ29sb3IubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuc3R5bGVbc3R5bGVQcm9wZXJ0eV0pIGZpbmRDb2xvciA9IG5vZGUuc3R5bGVbc3R5bGVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmluZENvbG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjaGVjayBoZXggZm9ybWF0IGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIENvbG9yIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIGlzSGV4Q29sb3I6IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgICAgICByZXR1cm4gL14jWzAtOWEtZl17M30oPzpbMC05YS1mXXszfSk/JC9pLnRlc3Qoc3RyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gY29udmVydCBoZXggZm9ybWF0IHRvIGEgcmdiIGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmdiIFJHQiBjb2xvciBmb3JtYXRcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHJnYjJoZXg6IGZ1bmN0aW9uIChyZ2IpIHtcclxuICAgICAgICBjb25zdCByZ2JNYXRjaCA9IHJnYi5tYXRjaCgvXnJnYmE/W1xccytdP1xcKFtcXHMrXT8oXFxkKylbXFxzK10/LFtcXHMrXT8oXFxkKylbXFxzK10/LFtcXHMrXT8oXFxkKylbXFxzK10/L2kpO1xyXG5cclxuICAgICAgICByZXR1cm4gKHJnYk1hdGNoICYmIHJnYk1hdGNoLmxlbmd0aCA9PT0gNCkgPyBcIiNcIiArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzFdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzJdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzNdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSA6ICcnO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBjb2xvciB2YWx1ZXMgb2Ygb3RoZXIgZm9ybWF0cyB0byBoZXggY29sb3IgdmFsdWVzIGFuZCByZXR1cm5zLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbG9yTmFtZSBDb2xvciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgY29sb3JOYW1lMmhleDogZnVuY3Rpb24gKGNvbG9yTmFtZSkge1xyXG4gICAgICAgIGlmICgvXiMvLnRlc3QoY29sb3JOYW1lKSkgcmV0dXJuIGNvbG9yTmFtZTtcclxuICAgICAgICB2YXIgdGVtcCA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0ZW1wLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgdGVtcC5zdHlsZS5jb2xvciA9IGNvbG9yTmFtZTtcclxuICAgICAgICB2YXIgY29sb3JzID0gdGhpcy5fdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2QuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKSkuY29sb3IubWF0Y2goL1xcZCsvZykubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBwYXJzZUludChhLDEwKTsgfSk7XHJcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGVtcCk7XHJcbiAgICAgICAgcmV0dXJuIChjb2xvcnMubGVuZ3RoID49IDMpID8gJyMnICsgKCgoMSA8PCAyNCkgKyAoY29sb3JzWzBdIDw8IDE2KSArIChjb2xvcnNbMV0gPDwgOCkgKyBjb2xvcnNbMl0pLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpIDogZmFsc2U7XHJcbiAgICB9XHJcbn07IiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCBjb2xvclBpY2tlciBmcm9tICcuLi9tb2R1bGVzL19jb2xvclBpY2tlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBuYW1lOiAnZm9udENvbG9yJyxcclxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcclxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICBjb3JlLmFkZE1vZHVsZShbY29sb3JQaWNrZXJdKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcclxuICAgICAgICBjb250ZXh0LmZvbnRDb2xvciA9IHtcclxuICAgICAgICAgICAgcHJldmlld0VsOiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvcklucHV0OiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvckxpc3Q6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cclxuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcclxuICAgICAgICBjb250ZXh0LmZvbnRDb2xvci5jb2xvcklucHV0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbG9yX3BpY2tlcl9pbnB1dCcpO1xyXG5cclxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xyXG4gICAgICAgIGNvbnRleHQuZm9udENvbG9yLmNvbG9ySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uQ2hhbmdlSW5wdXQuYmluZChjb3JlKSk7XHJcbiAgICAgICAgbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbG9yX3BpY2tlcl9zdWJtaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xyXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcignLl9zZV9jb2xvcl9waWNrZXJfcmVtb3ZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlbW92ZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICBsaXN0RGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XHJcbiAgICAgICAgY29udGV4dC5mb250Q29sb3IuY29sb3JMaXN0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcclxuXHJcbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cclxuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XHJcblxyXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cclxuICAgICAgICBsaXN0RGl2ID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcclxuICAgICAgICBjb25zdCBjb2xvckFyZWEgPSBjb3JlLmNvbnRleHQuY29sb3JQaWNrZXIuY29sb3JMaXN0SFRNTDtcclxuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXInO1xyXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gY29sb3JBcmVhO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlzdERpdjtcclxuICAgIH0sXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcclxuICAgICAqL1xyXG4gICAgb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0UGlja2VyID0gdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRGb250Q29sb3IgPSB0aGlzLmNvbnRleHQuZm9udENvbG9yO1xyXG5cclxuICAgICAgICBjb250ZXh0UGlja2VyLl9jb2xvcklucHV0ID0gY29udGV4dEZvbnRDb2xvci5jb2xvcklucHV0O1xyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX2RlZmF1bHRDb2xvciA9ICcjMzMzMzMzJztcclxuICAgICAgICBjb250ZXh0UGlja2VyLl9zdHlsZVByb3BlcnR5ID0gJ2NvbG9yJztcclxuICAgICAgICBjb250ZXh0UGlja2VyLl9jb2xvckxpc3QgPSBjb250ZXh0Rm9udENvbG9yLmNvbG9yTGlzdDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnBsdWdpbnMuY29sb3JQaWNrZXIuaW5pdC5jYWxsKHRoaXMsIHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCBudWxsKTtcclxuICAgIH0sXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQE92ZXJyaWRlIF9jb2xvclBpY2tlclxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZUlucHV0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy5jb2xvclBpY2tlci5zZXRDdXJyZW50Q29sb3IuY2FsbCh0aGlzLCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy5mb250Q29sb3IuYXBwbHlDb2xvci5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC5jb2xvclBpY2tlci5fY3VycmVudENvbG9yKTtcclxuICAgIH0sXHJcblxyXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnBsdWdpbnMuZm9udENvbG9yLmFwcGx5Q29sb3IuY2FsbCh0aGlzLCBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMubm9kZUNoYW5nZShudWxsLCBbJ2NvbG9yJ10sIFsnc3BhbiddLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcclxuICAgIH0sXHJcblxyXG4gICAgYXBwbHlDb2xvcjogZnVuY3Rpb24gKGNvbG9yKSB7XHJcbiAgICAgICAgaWYgKCFjb2xvcikgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcclxuICAgICAgICBuZXdOb2RlLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKG5ld05vZGUsIFsnY29sb3InXSwgbnVsbCwgbnVsbCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xyXG4gICAgfVxyXG59O1xyXG4iLCIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IGNvbG9yUGlja2VyIGZyb20gJy4uL21vZHVsZXMvX2NvbG9yUGlja2VyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdoaWxpdGVDb2xvcicsXHJcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgY29yZS5hZGRNb2R1bGUoW2NvbG9yUGlja2VyXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XHJcbiAgICAgICAgY29udGV4dC5oaWxpdGVDb2xvciA9IHtcclxuICAgICAgICAgICAgcHJldmlld0VsOiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvcklucHV0OiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvckxpc3Q6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cclxuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcclxuICAgICAgICBjb250ZXh0LmhpbGl0ZUNvbG9yLmNvbG9ySW5wdXQgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJy5fc2VfY29sb3JfcGlja2VyX2lucHV0Jyk7XHJcblxyXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgY29udGV4dC5oaWxpdGVDb2xvci5jb2xvcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbkNoYW5nZUlucHV0LmJpbmQoY29yZSkpO1xyXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcignLl9zZV9jb2xvcl9waWNrZXJfc3VibWl0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpKTtcclxuICAgICAgICBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJy5fc2VfY29sb3JfcGlja2VyX3JlbW92ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5yZW1vdmUuYmluZChjb3JlKSk7XHJcbiAgICAgICAgbGlzdERpdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja3VwLmJpbmQoY29yZSkpO1xyXG5cclxuICAgICAgICBjb250ZXh0LmhpbGl0ZUNvbG9yLmNvbG9yTGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XHJcblxyXG4gICAgICAgIC8qKiBhcHBlbmQgdGFyZ2V0IGJ1dHRvbiBtZW51ICovXHJcbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xyXG5cclxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXHJcbiAgICAgICAgbGlzdERpdiA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XHJcbiAgICAgICAgY29uc3QgY29sb3JBcmVhID0gY29yZS5jb250ZXh0LmNvbG9yUGlja2VyLmNvbG9yTGlzdEhUTUw7XHJcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuXHJcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyJztcclxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9IGNvbG9yQXJlYTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XHJcbiAgICB9LFxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XHJcbiAgICAgKi9cclxuICAgIG9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFBpY2tlciA9IHRoaXMuY29udGV4dC5jb2xvclBpY2tlcjtcclxuICAgICAgICBjb25zdCBjb250ZXh0SGlsaXRlQ29sb3IgPSB0aGlzLmNvbnRleHQuaGlsaXRlQ29sb3I7XHJcblxyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX2NvbG9ySW5wdXQgPSBjb250ZXh0SGlsaXRlQ29sb3IuY29sb3JJbnB1dDtcclxuICAgICAgICBjb250ZXh0UGlja2VyLl9kZWZhdWx0Q29sb3IgPSAnI0ZGRkZGRic7XHJcbiAgICAgICAgY29udGV4dFBpY2tlci5fc3R5bGVQcm9wZXJ0eSA9ICdiYWNrZ3JvdW5kQ29sb3InO1xyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX2NvbG9yTGlzdCA9IGNvbnRleHRIaWxpdGVDb2xvci5jb2xvckxpc3Q7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyLmluaXQuY2FsbCh0aGlzLCB0aGlzLmdldFNlbGVjdGlvbk5vZGUoKSwgbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBPdmVycmlkZSBfY29sb3JQaWNrZXJcclxuICAgICAqL1xyXG4gICAgb25DaGFuZ2VJbnB1dDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbnMuY29sb3JQaWNrZXIuc2V0Q3VycmVudENvbG9yLmNhbGwodGhpcywgZS50YXJnZXQudmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzdWJtaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbnMuaGlsaXRlQ29sb3IuYXBwbHlDb2xvci5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC5jb2xvclBpY2tlci5fY3VycmVudENvbG9yKTtcclxuICAgIH0sXHJcblxyXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnBsdWdpbnMuaGlsaXRlQ29sb3IuYXBwbHlDb2xvci5jYWxsKHRoaXMsIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKG51bGwsIFsnYmFja2dyb3VuZC1jb2xvciddLCBbJ3NwYW4nXSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGFwcGx5Q29sb3I6IGZ1bmN0aW9uIChjb2xvcikge1xyXG4gICAgICAgIGlmICghY29sb3IpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcclxuICAgICAgICBuZXdOb2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG4gICAgICAgIHRoaXMubm9kZUNoYW5nZShuZXdOb2RlLCBbJ2JhY2tncm91bmQtY29sb3InXSwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XHJcbiAgICB9XHJcbn07XHJcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRlbXBsYXRlID0ge307XG5cbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXG4gICAgICAgIGxldCB0ZW1wbGF0ZURpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICB0ZW1wbGF0ZURpdi5xdWVyeVNlbGVjdG9yKCd1bCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIHRlbXBsYXRlRGl2KTtcblxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIHRlbXBsYXRlRGl2ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVMaXN0ID0gY29yZS5vcHRpb25zLnRlbXBsYXRlcztcbiAgICAgICAgaWYgKCF0ZW1wbGF0ZUxpc3QgfHwgdGVtcGxhdGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IucGx1Z2lucy50ZW1wbGF0ZS5mYWlsXSBUbyB1c2UgdGhlIFwidGVtcGxhdGVcIiBwbHVnaW4sIHBsZWFzZSBkZWZpbmUgdGhlIFwidGVtcGxhdGVzXCIgb3B0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2UtbGlzdC1sYXllcic7XG5cbiAgICAgICAgbGV0IGxpc3QgPSAnPGRpdiBjbGFzcz1cInNlLXN1Ym1lbnUgc2UtbGlzdC1pbm5lclwiPicgK1xuICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRlbXBsYXRlTGlzdC5sZW5ndGgsIHQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdCA9IHRlbXBsYXRlTGlzdFtpXTtcbiAgICAgICAgICAgIGxpc3QgKz0gJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0XCIgZGF0YS12YWx1ZT1cIicgKyBpICsgJ1wiIHRpdGxlPVwiJyArIHQubmFtZSArICdcIj4nICsgdC5uYW1lICsgJzwvYnV0dG9uPjwvbGk+JztcbiAgICAgICAgfVxuICAgICAgICBsaXN0ICs9ICc8L3VsPjwvZGl2Pic7XG5cbiAgICAgICAgbGlzdERpdi5pbm5lckhUTUwgPSBsaXN0O1xuXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghL15CVVRUT04kL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5vcHRpb25zLnRlbXBsYXRlc1tlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKV07XG5cbiAgICAgICAgaWYgKHRlbXAuaHRtbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50cyh0ZW1wLmh0bWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi50ZW1wbGF0ZS5mYWlsXSBjYXVzZSA6IFwidGVtcGxhdGVzW2ldLmh0bWwgbm90IGZvdW5kXCInKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgfVxufTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRpYWxvZyBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnbGluaycsXG4gICAgZGlzcGxheTogJ2RpYWxvZycsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZGlhbG9nXSk7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5saW5rID0ge1xuICAgICAgICAgICAgZm9jdXNFbGVtZW50OiBudWxsLCAvLyBAT3ZlcnJpZGUgZGlhbG9nIC8vIFRoaXMgZWxlbWVudCBoYXMgZm9jdXMgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZC5cbiAgICAgICAgICAgIGxpbmtOZXdXaW5kb3dDaGVjazogbnVsbCxcbiAgICAgICAgICAgIGxpbmtBbmNob3JUZXh0OiBudWxsLFxuICAgICAgICAgICAgX2xpbmtBbmNob3I6IG51bGwsXG4gICAgICAgICAgICBfbGlua1ZhbHVlOiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBsaW5rIGRpYWxvZyAqL1xuICAgICAgICBsZXQgbGlua19kaWFsb2cgPSB0aGlzLnNldERpYWxvZyhjb3JlKTtcbiAgICAgICAgY29udGV4dC5saW5rLm1vZGFsID0gbGlua19kaWFsb2c7XG4gICAgICAgIGNvbnRleHQubGluay5mb2N1c0VsZW1lbnQgPSBsaW5rX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX2xpbmtfdXJsJyk7XG4gICAgICAgIGNvbnRleHQubGluay5saW5rQW5jaG9yVGV4dCA9IGxpbmtfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfbGlua190ZXh0Jyk7XG4gICAgICAgIGNvbnRleHQubGluay5saW5rTmV3V2luZG93Q2hlY2sgPSBsaW5rX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX2xpbmtfY2hlY2snKTtcbiAgICAgICAgY29udGV4dC5saW5rLnByZXZpZXcgPSBsaW5rX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtbGluay1wcmV2aWV3Jyk7XG4gICAgICAgIGNvbnRleHQubGluay5ib29rbWFyayA9IGxpbmtfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1saW5rLWJvb2ttYXJrJyk7XG4gICAgICAgIGNvbnRleHQubGluay5ib29rbWFya0J1dHRvbiA9IGxpbmtfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfYm9va21hcmtfYnV0dG9uJyk7XG4gICAgICAgIGNvbnRleHQubGluay5yZWwgPSBjb3JlLm9wdGlvbnMubGlua1JlbC5sZW5ndGggPiAwID8gbGlua19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWxpbmstcmVsJykgOiBudWxsO1xuXG4gICAgICAgIC8qKiBsaW5rIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgbGV0IGxpbmtfY29udHJvbGxlciA9IHRoaXMuc2V0Q29udHJvbGxlcl9MaW5rQnV0dG9uKGNvcmUpO1xuICAgICAgICBjb250ZXh0LmxpbmsubGlua0NvbnRyb2xsZXIgPSBsaW5rX2NvbnRyb2xsZXI7XG4gICAgICAgIGNvbnRleHQubGluay5fbGlua0FuY2hvciA9IG51bGw7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlua19kaWFsb2cucXVlcnlTZWxlY3RvcignZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xuICAgICAgICBsaW5rX2NvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfbGlua0NvbnRyb2xsZXIuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQubGluay5mb2N1c0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9vbkxpbmtQcmV2aWV3LmJpbmQoY29yZSwgY29udGV4dC5saW5rLnByZXZpZXcsIGNvbnRleHQubGluaywgY29yZS5vcHRpb25zLmxpbmtQcm90b2NvbCkpO1xuICAgICAgICBjb250ZXh0LmxpbmsuYm9va21hcmtCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfYm9va21hcmtCdXR0b24uYmluZChjb3JlKSk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgIGNvbnRleHQuZGlhbG9nLm1vZGFsLmFwcGVuZENoaWxkKGxpbmtfZGlhbG9nKTtcblxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFwcGVuZENoaWxkKGxpbmtfY29udHJvbGxlcik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaW5rX2RpYWxvZyA9IG51bGwsIGxpbmtfY29udHJvbGxlciA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBkaWFsb2cgKi9cbiAgICBzZXREaWFsb2c6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgY29uc3QgcmVsID0gY29yZS5vcHRpb25zLmxpbmtSZWw7XG5cbiAgICAgICAgZGlhbG9nLmNsYXNzTmFtZSA9ICdzZS1kaWFsb2ctY29udGVudCc7XG4gICAgICAgIGRpYWxvZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBsZXQgaHRtbCA9ICcnICtcbiAgICAgICAgICAgICc8Zm9ybSBjbGFzcz1cImVkaXRvcl9saW5rXCI+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjbG9zZVwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LmNsb3NlICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5jYW5jZWwgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLW1vZGFsLXRpdGxlXCI+JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gudGl0bGUgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1ib2R5XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gudXJsICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtLWZpbGVzXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gc2UtaW5wdXQtdXJsIF9zZV9saW5rX3VybFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCInICsgKGNvcmUub3B0aW9ucy5wcm90b2NvbCB8fCAnJykgKyAnXCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWZpbGVzLWVkZ2UtYnV0dG9uIF9zZV9ib29rbWFya19idXR0b25cIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5saW5rQm94LmJvb2ttYXJrICsgJ1wiPicgKyBjb3JlLmljb25zLmJvb2ttYXJrICsgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGRpc3BsYXk6IGZsZXg7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1zdmcgc2UtbGluay1ib29rbWFya1wiIHN0eWxlPVwiZmxleDogdW5zZXQ7IGRpc3BsYXk6IG5vbmU7XCI+JyArIGNvcmUuaWNvbnMuYm9va21hcmsgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIiBzdHlsZT1cImZsZXg6IGF1dG87XCI+PC9wcmU+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gubGlua0JveC50ZXh0ICsgJzwvbGFiZWw+PGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBfc2VfbGlua190ZXh0XCIgdHlwZT1cInRleHRcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0tZm9vdGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tY2hlY2sgX3NlX2xpbmtfY2hlY2tcIiAvPiZuYnNwOycgKyBsYW5nLmRpYWxvZ0JveC5saW5rQm94Lm5ld1dpbmRvd0NoZWNrICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9vdGVyXCI+JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8c2VsZWN0IGNsYXNzPVwic2UtaW5wdXQtc2VsZWN0IHNlLWxpbmstcmVsXCIgdGl0bGU9XCJyZWxcIj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlbC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgcmVsW2ldICsgJ1wiPicgKyByZWxbaV0gKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0Pic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNlLWJ0bi1wcmltYXJ5XCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJ1wiPjxzcGFuPicgKyBsYW5nLmRpYWxvZ0JveC5zdWJtaXRCdXR0b24gKyAnPC9zcGFuPjwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Zvcm0+JztcblxuICAgICAgICBkaWFsb2cuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9LFxuXG4gICAgLyoqIG1vZGlmeSBjb250cm9sbGVyIGJ1dHRvbiAqL1xuICAgIHNldENvbnRyb2xsZXJfTGlua0J1dHRvbjogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBsaW5rX2J0biA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsaW5rX2J0bi5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLWxpbmsnO1xuICAgICAgICBsaW5rX2J0bi5pbm5lckhUTUwgPSAnJyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWFycm93IHNlLWFycm93LXVwXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cImxpbmstY29udGVudFwiPjxzcGFuPjxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJcIj48L2E+Jm5ic3A7PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJ1cGRhdGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuZWRpdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLmVkaXQgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwidW5saW5rXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLnVubGluayArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnVubGluayArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuZGVsZXRlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIucmVtb3ZlICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICByZXR1cm4gbGlua19idG47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdsaW5rJywgJ2xpbmsnID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSk7XG4gICAgfSxcblxuICAgIF9vbkxpbmtQcmV2aWV3OiBmdW5jdGlvbiAocHJldmlldywgY29udGV4dCwgcHJvdG9jb2wsIGUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBlIDogZS50YXJnZXQudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBsaW5rSFRUUCA9IHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSAmJiB2YWx1ZS5pbmRleE9mKCcjJykgIT09IDA7XG4gICAgICAgIGNvbnRleHQuX2xpbmtWYWx1ZSA9IHByZXZpZXcudGV4dENvbnRlbnQgPSAhdmFsdWUgPyAnJyA6IChwcm90b2NvbCAmJiBsaW5rSFRUUCkgPyBwcm90b2NvbCArIHZhbHVlIDogbGlua0hUVFAgPyAnLycgKyB2YWx1ZSA6IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJvb2ttYXJrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNvbnRleHQuYm9va21hcmtCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuYm9va21hcmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LmJvb2ttYXJrQnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3VwZGF0ZUFuY2hvcjogZnVuY3Rpb24gKGFuY2hvciwgdXJsLCBhbHQsIHRhcmdldEVsLCByZWxFbCkge1xuICAgICAgICBpZiAoL15cXCMvLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgYW5jaG9yLmlkID0gdXJsLnN1YnN0cigxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuY2hvci5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhbmNob3IuaHJlZiA9IHVybDtcbiAgICAgICAgYW5jaG9yLnRleHRDb250ZW50ID0gYWx0O1xuXG4gICAgICAgIGlmICh0YXJnZXRFbC5jaGVja2VkKSBhbmNob3IudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGVsc2UgYW5jaG9yLnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG5cbiAgICAgICAgaWYgKHJlbEVsKSB7XG4gICAgICAgICAgICBhbmNob3IucmVsID0gcmVsRWwub3B0aW9uc1tyZWxFbC5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhbmNob3IuaWQpIHtcbiAgICAgICAgICAgIGFuY2hvci5yZWwgPSAnYm9va21hcmsnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yLnJlbW92ZUF0dHJpYnV0ZSgncmVsJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc3VibWl0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1pdEFjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRMaW5rID0gdGhpcy5jb250ZXh0Lmxpbms7XG4gICAgICAgICAgICBpZiAoY29udGV4dExpbmsuX2xpbmtWYWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgdXJsID0gY29udGV4dExpbmsuX2xpbmtWYWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGNvbnRleHRMaW5rLmxpbmtBbmNob3JUZXh0O1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yVGV4dCA9IGFuY2hvci52YWx1ZS5sZW5ndGggPT09IDAgPyB1cmwgOiBhbmNob3IudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9BID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ0EnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGluay5fdXBkYXRlQW5jaG9yKG9BLCB1cmwsIGFuY2hvclRleHQsIGNvbnRleHRMaW5rLmxpbmtOZXdXaW5kb3dDaGVjaywgY29udGV4dExpbmsucmVsKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRm9ybWF0cyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50cygpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvRm9ybWF0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzWzBdLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb0Zvcm1hdC5hcHBlbmRDaGlsZChvQSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbnNlcnROb2RlKG9Gb3JtYXQsIG51bGwsIHRydWUpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluc2VydE5vZGUob0EsIG51bGwsIHRydWUpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShvQS5jaGlsZE5vZGVzWzBdLCAwLCBvQS5jaGlsZE5vZGVzWzBdLCBvQS50ZXh0Q29udGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGluay5fdXBkYXRlQW5jaG9yKGNvbnRleHRMaW5rLl9saW5rQW5jaG9yLCB1cmwsIGFuY2hvclRleHQsIGNvbnRleHRMaW5rLmxpbmtOZXdXaW5kb3dDaGVjaywgY29udGV4dExpbmsucmVsKTtcblxuICAgICAgICAgICAgICAgIC8vIHNldCByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gY29udGV4dExpbmsuX2xpbmtBbmNob3IuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKHRleHROb2RlLCAwLCB0ZXh0Tm9kZSwgdGV4dE5vZGUudGV4dENvbnRlbnQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGV4dExpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRMaW5rLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0TGluay5mb2N1c0VsZW1lbnQudmFsdWUgPSBjb250ZXh0TGluay5saW5rQW5jaG9yVGV4dC52YWx1ZSA9ICcnO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN1Ym1pdEFjdGlvbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmVcbiAgICAgKi9cbiAgICBhY3RpdmU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlckFycmF5LmluZGV4T2YodGhpcy5jb250ZXh0LmxpbmsubGlua0NvbnRyb2xsZXIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51dGlsLmlzQW5jaG9yKGVsZW1lbnQpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWltYWdlLWxpbmsnKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlckFycmF5LmluZGV4T2YodGhpcy5jb250ZXh0LmxpbmsubGlua0NvbnRyb2xsZXIpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5saW5rLmNhbGxfY29udHJvbGxlci5jYWxsKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgICAgICBjb25zdCBjb250ZXh0TGluayA9IHRoaXMuY29udGV4dC5saW5rO1xuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmxpbmsuaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgY29udGV4dExpbmsubGlua0FuY2hvclRleHQudmFsdWUgPSB0aGlzLmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dExpbmsuX2xpbmtBbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgY29udGV4dExpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRMaW5rLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0TGluay5mb2N1c0VsZW1lbnQudmFsdWUgPSAoY29udGV4dExpbmsuX2xpbmtBbmNob3IuaWQgPyAnIycgKyBjb250ZXh0TGluay5fbGlua0FuY2hvci5pZCA6IGNvbnRleHRMaW5rLl9saW5rQW5jaG9yLmhyZWYpO1xuICAgICAgICAgICAgY29udGV4dExpbmsubGlua0FuY2hvclRleHQudmFsdWUgPSBjb250ZXh0TGluay5fbGlua0FuY2hvci50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNvbnRleHRMaW5rLmxpbmtOZXdXaW5kb3dDaGVjay5jaGVja2VkID0gKC9fYmxhbmsvaS50ZXN0KGNvbnRleHRMaW5rLl9saW5rQW5jaG9yLnRhcmdldCkgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRMaW5rLnJlbCkgY29udGV4dExpbmsucmVsLnZhbHVlID0gY29udGV4dExpbmsuX2xpbmtBbmNob3IucmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmxpbmsuX29uTGlua1ByZXZpZXcuY2FsbCh0aGlzLCBjb250ZXh0TGluay5wcmV2aWV3LCBjb250ZXh0TGluaywgdGhpcy5vcHRpb25zLmxpbmtQcm90b2NvbCwgY29udGV4dExpbmsuX2xpbmtWYWx1ZSk7XG4gICAgfSxcblxuICAgIGNhbGxfY29udHJvbGxlcjogZnVuY3Rpb24gKHNlbGVjdGlvbkFUYWcpIHtcbiAgICAgICAgdGhpcy5lZGl0TGluayA9IHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yID0gc2VsZWN0aW9uQVRhZztcbiAgICAgICAgY29uc3QgbGlua0J0biA9IHRoaXMuY29udGV4dC5saW5rLmxpbmtDb250cm9sbGVyO1xuICAgICAgICBjb25zdCBsaW5rID0gbGlua0J0bi5xdWVyeVNlbGVjdG9yKCdhJyk7XG5cbiAgICAgICAgbGluay5ocmVmID0gc2VsZWN0aW9uQVRhZy5ocmVmO1xuICAgICAgICBsaW5rLnRpdGxlID0gc2VsZWN0aW9uQVRhZy50ZXh0Q29udGVudDtcbiAgICAgICAgbGluay50ZXh0Q29udGVudCA9IHNlbGVjdGlvbkFUYWcudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHNlbGVjdGlvbkFUYWcsICdvbicpO1xuICAgICAgICB0aGlzLnNldENvbnRyb2xsZXJQb3NpdGlvbihsaW5rQnRuLCBzZWxlY3Rpb25BVGFnLCAnYm90dG9tJywge2xlZnQ6IDAsIHRvcDogMH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24obGlua0J0biwgc2VsZWN0aW9uQVRhZywgJ2xpbmsnLCB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLnV0aWwsIHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yLCAnb24nKSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfYm9va21hcmtCdXR0b246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dExpbmsgPSB0aGlzLmNvbnRleHQubGluaztcbiAgICAgICAgbGV0IHVybCA9IGNvbnRleHRMaW5rLmZvY3VzRWxlbWVudC52YWx1ZTtcbiAgICAgICAgaWYgKC9eXFwjLy50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMSk7XG4gICAgICAgICAgICBjb250ZXh0TGluay5ib29rbWFyay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGNvbnRleHRMaW5rLmJvb2ttYXJrQnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwgPSAnIycgKyB1cmw7XG4gICAgICAgICAgICBjb250ZXh0TGluay5ib29rbWFyay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0TGluay5ib29rbWFya0J1dHRvbiwgJ2FjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dExpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRMaW5rLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0TGluay5mb2N1c0VsZW1lbnQudmFsdWUgPSB1cmw7XG4gICAgICAgIGNvbnRleHRMaW5rLmZvY3VzRWxlbWVudC5mb2N1cygpO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrX2xpbmtDb250cm9sbGVyOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpIHx8IGUudGFyZ2V0LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICgvdXBkYXRlLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0TGluayA9IHRoaXMuY29udGV4dC5saW5rO1xuICAgICAgICAgICAgY29udGV4dExpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRMaW5rLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0TGluay5mb2N1c0VsZW1lbnQudmFsdWUgPSBjb250ZXh0TGluay5fbGlua0FuY2hvci5ocmVmO1xuICAgICAgICAgICAgY29udGV4dExpbmsubGlua0FuY2hvclRleHQudmFsdWUgPSBjb250ZXh0TGluay5fbGlua0FuY2hvci50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNvbnRleHRMaW5rLmxpbmtOZXdXaW5kb3dDaGVjay5jaGVja2VkID0gKC9fYmxhbmsvaS50ZXN0KGNvbnRleHRMaW5rLl9saW5rQW5jaG9yLnRhcmdldCkgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRMaW5rLnJlbCkgY29udGV4dExpbmsucmVsLnZhbHVlID0gY29udGV4dExpbmsuX2xpbmtBbmNob3IucmVsO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ2xpbmsnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvdW5saW5rLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBjb25zdCBzYyA9IHRoaXMudXRpbC5nZXRDaGlsZEVsZW1lbnQodGhpcy5jb250ZXh0LmxpbmsuX2xpbmtBbmNob3IsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwIHx8IGN1cnJlbnQubm9kZVR5cGUgPT09IDM7IH0sIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVjID0gdGhpcy51dGlsLmdldENoaWxkRWxlbWVudCh0aGlzLmNvbnRleHQubGluay5fbGlua0FuY2hvciwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIGN1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDAgfHwgY3VycmVudC5ub2RlVHlwZSA9PT0gMzsgfSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKHNjLCAwLCBlYywgZWMudGV4dENvbnRlbnQubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMubm9kZUNoYW5nZShudWxsLCBudWxsLCBbJ0EnXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLyoqIGRlbGV0ZSAqL1xuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGhpcy5jb250ZXh0LmxpbmsuX2xpbmtBbmNob3IpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmsuX2xpbmtBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRMaW5rID0gdGhpcy5jb250ZXh0Lmxpbms7XG4gICAgICAgIGNvbnRleHRMaW5rLmxpbmtDb250cm9sbGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGNvbnRleHRMaW5rLl9saW5rQW5jaG9yID0gbnVsbDtcbiAgICAgICAgY29udGV4dExpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRMaW5rLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0TGluay5mb2N1c0VsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dExpbmsubGlua0FuY2hvclRleHQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dExpbmsubGlua05ld1dpbmRvd0NoZWNrLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRleHRMaW5rLnJlbCkgY29udGV4dExpbmsucmVsLnZhbHVlID0gY29udGV4dExpbmsucmVsLm9wdGlvbnNbMF0udmFsdWU7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgZGlhbG9nIGZyb20gJy4uL21vZHVsZXMvZGlhbG9nJztcbmltcG9ydCBjb21wb25lbnQgZnJvbSAnLi4vbW9kdWxlcy9jb21wb25lbnQnO1xuaW1wb3J0IHJlc2l6aW5nIGZyb20gJy4uL21vZHVsZXMvcmVzaXppbmcnO1xuaW1wb3J0IGZpbGVNYW5hZ2VyIGZyb20gJy4uL21vZHVsZXMvZmlsZU1hbmFnZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ltYWdlJyxcbiAgICBkaXNwbGF5OiAnZGlhbG9nJyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvcmUuYWRkTW9kdWxlKFtkaWFsb2csIGNvbXBvbmVudCwgcmVzaXppbmcsIGZpbGVNYW5hZ2VyXSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSBjb250ZXh0LmltYWdlID0ge1xuICAgICAgICAgICAgX2luZm9MaXN0OiBbXSwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBfaW5mb0luZGV4OiAwLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIF91cGxvYWRGaWxlTGVuZ3RoOiAwLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIGZvY3VzRWxlbWVudDogbnVsbCwgLy8gQE92ZXJyaWRlIGRpYWxvZyAvLyBUaGlzIGVsZW1lbnQgaGFzIGZvY3VzIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuZWQuXG4gICAgICAgICAgICBzaXplVW5pdDogb3B0aW9ucy5faW1hZ2VTaXplVW5pdCxcbiAgICAgICAgICAgIF9hbHRUZXh0OiAnJyxcbiAgICAgICAgICAgIF9saW5rRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgIF9hbGlnbjogJ25vbmUnLFxuICAgICAgICAgICAgX2Zsb2F0Q2xhc3NSZWdFeHA6ICdfX3NlX19mbG9hdFxcXFwtW2Etel0rJyxcbiAgICAgICAgICAgIF92X2xpbms6IHtfbGlua1ZhbHVlOiAnJ30sXG4gICAgICAgICAgICBfdl9zcmM6IHtfbGlua1ZhbHVlOiAnJ30sXG4gICAgICAgICAgICBzdmdEZWZhdWx0U2l6ZTogJzMwJScsXG4gICAgICAgICAgICBiYXNlNjRSZW5kZXJJbmRleDogMCxcbiAgICAgICAgICAgIC8vIEByZXF1aXJlIEBPdmVycmlkZSBjb21wb25lbnRcbiAgICAgICAgICAgIF9lbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgX2NvdmVyOiBudWxsLFxuICAgICAgICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIC8vIEBPdmVycmlkZSByZXNpemluZyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpbnB1dFg6IG51bGwsXG4gICAgICAgICAgICBpbnB1dFk6IG51bGwsXG4gICAgICAgICAgICBfZWxlbWVudF93OiAxLFxuICAgICAgICAgICAgX2VsZW1lbnRfaDogMSxcbiAgICAgICAgICAgIF9lbGVtZW50X2w6IDAsXG4gICAgICAgICAgICBfZWxlbWVudF90OiAwLFxuICAgICAgICAgICAgX2RlZmF1bHRTaXplWDogJ2F1dG8nLFxuICAgICAgICAgICAgX2RlZmF1bHRTaXplWTogJ2F1dG8nLFxuICAgICAgICAgICAgX29yaWdpbl93OiBvcHRpb25zLmltYWdlV2lkdGggPT09ICdhdXRvJyA/ICcnIDogb3B0aW9ucy5pbWFnZVdpZHRoLFxuICAgICAgICAgICAgX29yaWdpbl9oOiBvcHRpb25zLmltYWdlSGVpZ2h0ID09PSAnYXV0bycgPyAnJyA6IG9wdGlvbnMuaW1hZ2VIZWlnaHQsXG4gICAgICAgICAgICBfcHJvcG9ydGlvbkNoZWNrZWQ6IHRydWUsXG4gICAgICAgICAgICBfcmVzaXppbmc6IG9wdGlvbnMuaW1hZ2VSZXNpemluZyxcbiAgICAgICAgICAgIF9yZXNpemVEb3RIaWRlOiAhb3B0aW9ucy5pbWFnZUhlaWdodFNob3csXG4gICAgICAgICAgICBfcm90YXRpb246IG9wdGlvbnMuaW1hZ2VSb3RhdGlvbixcbiAgICAgICAgICAgIF9vbmx5UGVyY2VudGFnZTogb3B0aW9ucy5pbWFnZVNpemVPbmx5UGVyY2VudGFnZSxcbiAgICAgICAgICAgIF9yYXRpbzogZmFsc2UsXG4gICAgICAgICAgICBfcmF0aW9YOiAxLFxuICAgICAgICAgICAgX3JhdGlvWTogMSxcbiAgICAgICAgICAgIF9jYXB0aW9uU2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIF9jYXB0aW9uQ2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBfY2FwdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGNhcHRpb25DaGVja0VsOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIGltYWdlIGRpYWxvZyAqL1xuICAgICAgICBsZXQgaW1hZ2VfZGlhbG9nID0gdGhpcy5zZXREaWFsb2coY29yZSk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5tb2RhbCA9IGltYWdlX2RpYWxvZztcbiAgICAgICAgY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX2ltYWdlX2ZpbGUnKTtcbiAgICAgICAgY29udGV4dEltYWdlLmltZ1VybEZpbGUgPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV91cmwnKTtcbiAgICAgICAgY29udGV4dEltYWdlLmZvY3VzRWxlbWVudCA9IGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUgfHwgY29udGV4dEltYWdlLmltZ1VybEZpbGU7XG4gICAgICAgIGNvbnRleHRJbWFnZS5hbHRUZXh0ID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2VfYWx0Jyk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5pbWdMaW5rID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2VfbGluaycpO1xuICAgICAgICBjb250ZXh0SW1hZ2UuaW1nTGlua05ld1dpbmRvd0NoZWNrID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2VfbGlua19jaGVjaycpO1xuICAgICAgICBjb250ZXh0SW1hZ2UuY2FwdGlvbkNoZWNrRWwgPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV9jaGVja19jYXB0aW9uJyk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5wcmV2aWV3TGluayA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYl9jb250ZW50X3VybCAuc2UtbGluay1wcmV2aWV3Jyk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5wcmV2aWV3U3JjID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdGFiX2NvbnRlbnRfaW1hZ2UgLnNlLWxpbmstcHJldmlldycpO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtZGlhbG9nLXRhYnMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub3BlblRhYi5iaW5kKGNvcmUpKTtcbiAgICAgICAgaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpKTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUpIGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtZmlsZS1yZW1vdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3JlbW92ZVNlbGVjdGVkRmlsZXMuYmluZChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlLCBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZSwgY29udGV4dEltYWdlLnByZXZpZXdTcmMpKTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUgJiYgY29udGV4dEltYWdlLmltZ1VybEZpbGUpIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fZmlsZUlucHV0Q2hhbmdlLmJpbmQoY29udGV4dEltYWdlKSk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLmltZ0xpbmsuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9vbkxpbmtQcmV2aWV3LmJpbmQoY29udGV4dEltYWdlLnByZXZpZXdMaW5rLCBjb250ZXh0SW1hZ2UuX3ZfbGluaywgb3B0aW9ucy5saW5rUHJvdG9jb2wpKTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uTGlua1ByZXZpZXcuYmluZChjb250ZXh0SW1hZ2UucHJldmlld1NyYywgY29udGV4dEltYWdlLl92X3NyYywgb3B0aW9ucy5saW5rUHJvdG9jb2wpKTtcblxuICAgICAgICBjb25zdCBpbWFnZUdhbGxlcnlCdXR0b24gPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9fc2VfX2dhbGxlcnknKTtcbiAgICAgICAgaWYgKGltYWdlR2FsbGVyeUJ1dHRvbikgaW1hZ2VHYWxsZXJ5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb3BlbkdhbGxlcnkuYmluZChjb3JlKSk7XG4gICAgICAgIFxuICAgICAgICBjb250ZXh0SW1hZ2UucHJvcG9ydGlvbiA9IHt9O1xuICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRYID0ge307XG4gICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFkgPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW1hZ2VSZXNpemluZykge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLnByb3BvcnRpb24gPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV9jaGVja19wcm9wb3J0aW9uJyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRYID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2Vfc2l6ZV94Jyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRZID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2Vfc2l6ZV95Jyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlID0gb3B0aW9ucy5pbWFnZVdpZHRoO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSA9IG9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFguYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnNldElucHV0U2l6ZS5iaW5kKGNvcmUsICd4JykpO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuc2V0SW5wdXRTaXplLmJpbmQoY29yZSwgJ3knKSk7XG5cbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFguYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRSYXRpby5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRSYXRpby5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5wcm9wb3J0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc2V0UmF0aW8uYmluZChjb3JlKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtZGlhbG9nLWJ0bi1yZXZlcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc2l6ZVJldmVydC5iaW5kKGNvcmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBhcHBlbmQgaHRtbCAqL1xuICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hcHBlbmRDaGlsZChpbWFnZV9kaWFsb2cpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgaW1hZ2VfZGlhbG9nID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqIGRpYWxvZyAqL1xuICAgIHNldERpYWxvZzogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBkaWFsb2cgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgZGlhbG9nLmNsYXNzTmFtZSA9ICdzZS1kaWFsb2ctY29udGVudCBzZS1kaWFsb2ctaW1hZ2UnO1xuICAgICAgICBkaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICBsZXQgaHRtbCA9ICcnICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjbG9zZVwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1jbG9zZVwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5jbG9zZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5jYW5jZWwgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1tb2RhbC10aXRsZVwiPicgKyBsYW5nLmRpYWxvZ0JveC5pbWFnZUJveC50aXRsZSArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy10YWJzXCI+JyArXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiX3NlX3RhYl9saW5rIGFjdGl2ZVwiIGRhdGEtdGFiLWxpbms9XCJpbWFnZVwiPicgKyBsYW5nLnRvb2xiYXIuaW1hZ2UgKyAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiX3NlX3RhYl9saW5rXCIgZGF0YS10YWItbGluaz1cInVybFwiPicgKyBsYW5nLnRvb2xiYXIubGluayArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8Zm9ybSBtZXRob2Q9XCJwb3N0XCIgZW5jdHlwZT1cIm11bHRpcGFydC9mb3JtLWRhdGFcIj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIl9zZV90YWJfY29udGVudCBfc2VfdGFiX2NvbnRlbnRfaW1hZ2VcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctYm9keVwiPjxkaXYgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNjY2M7XCI+JztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uaW1hZ2VGaWxlSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3guaW1hZ2VCb3guZmlsZSArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtLWZpbGVzXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBfc2VfaW1hZ2VfZmlsZVwiIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiJyArIG9wdGlvbi5pbWFnZUFjY2VwdCArICdcIicgKyAob3B0aW9uLmltYWdlTXVsdGlwbGVGaWxlID8gJyBtdWx0aXBsZT1cIm11bHRpcGxlXCInIDogJycpICsgJy8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWZpbGVzLWVkZ2UtYnV0dG9uIHNlLWZpbGUtcmVtb3ZlXCIgdGl0bGU9XCInICsgbGFuZy5jb250cm9sbGVyLnJlbW92ZSArICdcIj4nICsgY29yZS5pY29ucy5jYW5jZWwgKyAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uaW1hZ2VVcmxJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5pbWFnZUJveC51cmwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybS1maWxlc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gc2UtaW5wdXQtdXJsIF9zZV9pbWFnZV91cmxcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGlvbi5pbWFnZUdhbGxlcnlVcmwgJiYgY29yZS5wbHVnaW5zLmltYWdlR2FsbGVyeSkgPyAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWZpbGVzLWVkZ2UtYnV0dG9uIF9fc2VfX2dhbGxlcnlcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuaW1hZ2VHYWxsZXJ5ICsgJ1wiPicgKyBjb3JlLmljb25zLmltYWdlX2dhbGxlcnkgKyAnPC9idXR0b24+JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIj48L3ByZT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3guaW1hZ2VCb3guYWx0VGV4dCArICc8L2xhYmVsPjxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gX3NlX2ltYWdlX2FsdFwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9uLmltYWdlUmVzaXppbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGVyY2VudGFnZSA9IG9wdGlvbi5pbWFnZVNpemVPbmx5UGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGVyY2VudERpc3BsYXkgPSBvbmx5UGVyY2VudGFnZSA/ICcgc3R5bGU9XCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCInIDogJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0RGlzcGxheSA9ICFvcHRpb24uaW1hZ2VIZWlnaHRTaG93ID8gJyBzdHlsZT1cImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcIicgOiAnJztcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlQZXJjZW50YWdlIHx8ICFvcHRpb24uaW1hZ2VIZWlnaHRTaG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctc2l6ZS10ZXh0XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzaXplLXdcIj4nICsgbGFuZy5kaWFsb2dCb3guc2l6ZSArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1zaXplLXRleHRcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNpemUtd1wiPicgKyBsYW5nLmRpYWxvZ0JveC53aWR0aCArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2UtZGlhbG9nLXNpemUteFwiPiZuYnNwOzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzaXplLWhcIj4nICsgbGFuZy5kaWFsb2dCb3guaGVpZ2h0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtY29udHJvbCBfc2VfaW1hZ2Vfc2l6ZV94XCIgcGxhY2Vob2xkZXI9XCJhdXRvXCInICsgKG9ubHlQZXJjZW50YWdlID8gJyB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiJyA6ICd0eXBlPVwidGV4dFwiJykgKyAob25seVBlcmNlbnRhZ2UgPyAnIG1heD1cIjEwMFwiJyA6ICcnKSArICcgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2UtZGlhbG9nLXNpemUteFwiJyArIGhlaWdodERpc3BsYXkgKyAnPicgKyAob25seVBlcmNlbnRhZ2UgPyAnJScgOiAneCcpICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2UtaW5wdXQtY29udHJvbCBfc2VfaW1hZ2Vfc2l6ZV95XCIgcGxhY2Vob2xkZXI9XCJhdXRvXCInICsgb25seVBlcmNlbnREaXNwbGF5ICsgKG9ubHlQZXJjZW50YWdlID8gJyBtYXg9XCIxMDBcIicgOiAnJykgKyBoZWlnaHREaXNwbGF5ICsgJy8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCcgKyBvbmx5UGVyY2VudERpc3BsYXkgKyBoZWlnaHREaXNwbGF5ICsgJz48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLWNoZWNrIF9zZV9pbWFnZV9jaGVja19wcm9wb3J0aW9uXCIgY2hlY2tlZC8+Jm5ic3A7JyArIGxhbmcuZGlhbG9nQm94LnByb3BvcnRpb24gKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3gucmV2ZXJ0QnV0dG9uICsgJ1wiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1idG4tcmV2ZXJ0XCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7XCI+JyArIGNvcmUuaWNvbnMucmV2ZXJ0ICsgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0gc2UtZGlhbG9nLWZvcm0tZm9vdGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLWNoZWNrIF9zZV9pbWFnZV9jaGVja19jYXB0aW9uXCIgLz4mbmJzcDsnICsgbGFuZy5kaWFsb2dCb3guY2FwdGlvbiArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiX3NlX3RhYl9jb250ZW50IF9zZV90YWJfY29udGVudF91cmxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctYm9keVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gudXJsICsgJzwvbGFiZWw+PGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBzZS1pbnB1dC11cmwgX3NlX2ltYWdlX2xpbmtcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIj48L3ByZT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiX3NlX2ltYWdlX2xpbmtfY2hlY2tcIi8+Jm5ic3A7JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gubmV3V2luZG93Q2hlY2sgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb290ZXJcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VuZWRpdG9yX2ltYWdlX3JhZGlvXCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLXJhZGlvXCIgdmFsdWU9XCJub25lXCIgY2hlY2tlZD4nICsgbGFuZy5kaWFsb2dCb3guYmFzaWMgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cImxlZnRcIj4nICsgbGFuZy5kaWFsb2dCb3gubGVmdCArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1yYWRpb1wiIHZhbHVlPVwiY2VudGVyXCI+JyArIGxhbmcuZGlhbG9nQm94LmNlbnRlciArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1yYWRpb1wiIHZhbHVlPVwicmlnaHRcIj4nICsgbGFuZy5kaWFsb2dCb3gucmlnaHQgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZS1idG4tcHJpbWFyeVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICdcIj48c3Bhbj4nICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJzwvc3Bhbj48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9mb3JtPic7XG5cbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9LFxuXG4gICAgX2ZpbGVJbnB1dENoYW5nZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW1nSW5wdXRGaWxlLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmltZ1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3U3JjLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmltZ1VybEZpbGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3U3JjLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCc7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlbW92ZVNlbGVjdGVkRmlsZXM6IGZ1bmN0aW9uICh1cmxJbnB1dCwgcHJldmlld1NyYykge1xuICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgICAgIGlmICh1cmxJbnB1dCkge1xuICAgICAgICAgICAgdXJsSW5wdXQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgcHJldmlld1NyYy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9vcGVuR2FsbGVyeTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhbGxQbHVnaW4oJ2ltYWdlR2FsbGVyeScsIHRoaXMucGx1Z2lucy5pbWFnZUdhbGxlcnkub3Blbi5iaW5kKHRoaXMsIHRoaXMucGx1Z2lucy5pbWFnZS5fc2V0VXJsSW5wdXQuYmluZCh0aGlzLmNvbnRleHQuaW1hZ2UpKSwgbnVsbCk7XG4gICAgfSxcblxuICAgIF9zZXRVcmxJbnB1dDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0aGlzLmFsdFRleHQudmFsdWUgPSB0YXJnZXQuYWx0O1xuICAgICAgICB0aGlzLl92X3NyYy5fbGlua1ZhbHVlID0gdGhpcy5wcmV2aWV3U3JjLnRleHRDb250ZW50ID0gdGhpcy5pbWdVcmxGaWxlLnZhbHVlID0gdGFyZ2V0LnNyYztcbiAgICAgICAgdGhpcy5pbWdVcmxGaWxlLmZvY3VzKCk7XG4gICAgfSxcblxuICAgIF9vbkxpbmtQcmV2aWV3OiBmdW5jdGlvbiAoY29udGV4dCwgcHJvdG9jb2wsIGUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlLnRhcmdldC52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnRleHQuX2xpbmtWYWx1ZSA9IHRoaXMudGV4dENvbnRlbnQgPSAhdmFsdWUgPyAnJyA6IChwcm90b2NvbCAmJiB2YWx1ZS5pbmRleE9mKCc6Ly8nKSA9PT0gLTEgJiYgdmFsdWUuaW5kZXhPZignIycpICE9PSAwKSA/IHByb3RvY29sICsgdmFsdWUgOiB2YWx1ZS5pbmRleE9mKCc6Ly8nKSA9PT0gLTEgPyAnLycgKyB2YWx1ZSA6IHZhbHVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgQFJlcXVpcmVkIGZpbGVNYW5hZ2VyXG4gICAgICovXG4gICAgZmlsZVRhZ3M6IFsnaW1nJ10sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgY29yZSwgZmlsZU1hbmFnZXIsIHJlc2l6aW5nXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGNhbGxlZCBmcm9tIGNvcmUuc2VsZWN0Q29tcG9uZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudFxuICAgICAqL1xuICAgIHNlbGVjdDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLm9uTW9kaWZ5TW9kZS5jYWxsKHRoaXMsIGVsZW1lbnQsIHRoaXMucGx1Z2lucy5yZXNpemluZy5jYWxsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwodGhpcywgZWxlbWVudCwgJ2ltYWdlJykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXIsIHJlc2l6aW5nXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbCA9IGVsZW1lbnQgfHwgdGhpcy5jb250ZXh0LmltYWdlLl9lbGVtZW50O1xuICAgICAgICBjb25zdCBpbWFnZUNvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGltYWdlRWwsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KSB8fCBpbWFnZUVsO1xuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSBpbWFnZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpICogMTtcbiAgICAgICAgbGV0IGZvY3VzRWwgPSAoaW1hZ2VDb250YWluZXIucHJldmlvdXNFbGVtZW50U2libGluZyB8fCBpbWFnZUNvbnRhaW5lci5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBpbWFnZUNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICB0aGlzLnV0aWwucmVtb3ZlSXRlbShpbWFnZUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5pbml0LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcblxuICAgICAgICBpZiAoZW1wdHlEaXYgIT09IHRoaXMuY29udGV4dC5lbGVtZW50Lnd5c2l3eWcpIHRoaXMudXRpbC5yZW1vdmVJdGVtQWxsUGFyZW50cyhlbXB0eURpdiwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIGN1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDA7IH0sIG51bGwpO1xuXG4gICAgICAgIC8vIGZvY3VzXG4gICAgICAgIHRoaXMuZm9jdXNFZGdlKGZvY3VzRWwpO1xuICAgICAgICBcbiAgICAgICAgLy8gZXZlbnRcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmRlbGV0ZUluZm8uY2FsbCh0aGlzLCAnaW1hZ2UnLCBkYXRhSW5kZXgsIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQpO1xuXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgXG4gICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlID0gY29udGV4dEltYWdlLl9vcmlnaW5fdyA9IHRoaXMub3B0aW9ucy5pbWFnZVdpZHRoID09PSBjb250ZXh0SW1hZ2UuX2RlZmF1bHRTaXplWCA/ICcnIDogdGhpcy5vcHRpb25zLmltYWdlV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlID0gY29udGV4dEltYWdlLl9vcmlnaW5faCA9IHRoaXMub3B0aW9ucy5pbWFnZUhlaWdodCA9PT0gY29udGV4dEltYWdlLl9kZWZhdWx0U2l6ZVkgPyAnJyA6IHRoaXMub3B0aW9ucy5pbWFnZUhlaWdodDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlICYmIHRoaXMub3B0aW9ucy5pbWFnZU11bHRpcGxlRmlsZSkgY29udGV4dEltYWdlLmltZ0lucHV0RmlsZS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgJ211bHRpcGxlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSAmJiB0aGlzLm9wdGlvbnMuaW1hZ2VNdWx0aXBsZUZpbGUpIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUucmVtb3ZlQXR0cmlidXRlKCdtdWx0aXBsZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnaW1hZ2UnLCAnaW1hZ2UnID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSk7XG4gICAgfSxcblxuICAgIG9wZW5UYWI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnN0IG1vZGFsID0gdGhpcy5jb250ZXh0LmltYWdlLm1vZGFsO1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gKGUgPT09ICdpbml0JyA/IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdGFiX2xpbmsnKSA6IGUudGFyZ2V0KTtcblxuICAgICAgICBpZiAoIS9eQlVUVE9OJC9pLnRlc3QodGFyZ2V0RWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjbGFyZSBhbGwgdmFyaWFibGVzXG4gICAgICAgIGNvbnN0IHRhYk5hbWUgPSB0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10YWItbGluaycpO1xuICAgICAgICBjb25zdCBjb250ZW50Q2xhc3NOYW1lID0gJ19zZV90YWJfY29udGVudCc7XG4gICAgICAgIGxldCBpLCB0YWJDb250ZW50LCB0YWJMaW5rcztcblxuICAgICAgICAvLyBHZXQgYWxsIGVsZW1lbnRzIHdpdGggY2xhc3M9XCJ0YWJjb250ZW50XCIgYW5kIGhpZGUgdGhlbVxuICAgICAgICB0YWJDb250ZW50ID0gbW9kYWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjb250ZW50Q2xhc3NOYW1lKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhYkNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRhYkNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgd2l0aCBjbGFzcz1cInRhYmxpbmtzXCIgYW5kIHJlbW92ZSB0aGUgY2xhc3MgXCJhY3RpdmVcIlxuICAgICAgICB0YWJMaW5rcyA9IG1vZGFsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ19zZV90YWJfbGluaycpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFiTGlua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0YWJMaW5rc1tpXSwgJ2FjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgY3VycmVudCB0YWIsIGFuZCBhZGQgYW4gXCJhY3RpdmVcIiBjbGFzcyB0byB0aGUgYnV0dG9uIHRoYXQgb3BlbmVkIHRoZSB0YWJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcignLicgKyBjb250ZW50Q2xhc3NOYW1lICsgJ18nICsgdGFiTmFtZSkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0YXJnZXRFbGVtZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgICAgLy8gZm9jdXNcbiAgICAgICAgaWYgKHRhYk5hbWUgPT09ICdpbWFnZScgJiYgdGhpcy5jb250ZXh0LmltYWdlLmZvY3VzRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmZvY3VzRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhYk5hbWUgPT09ICd1cmwnICYmIHRoaXMuY29udGV4dC5pbWFnZS5pbWdMaW5rKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW1hZ2UuaW1nTGluay5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBzdWJtaXQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29uc3QgaW1hZ2VQbHVnaW4gPSB0aGlzLnBsdWdpbnMuaW1hZ2U7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnRleHRJbWFnZS5fYWx0VGV4dCA9IGNvbnRleHRJbWFnZS5hbHRUZXh0LnZhbHVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2FsaWduID0gY29udGV4dEltYWdlLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIl06Y2hlY2tlZCcpLnZhbHVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb25DaGVja2VkID0gY29udGV4dEltYWdlLmNhcHRpb25DaGVja0VsLmNoZWNrZWQ7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSBjb250ZXh0SW1hZ2UuX3Byb3BvcnRpb25DaGVja2VkID0gY29udGV4dEltYWdlLnByb3BvcnRpb24uY2hlY2tlZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVBsdWdpbi51cGRhdGVfaW1hZ2UuY2FsbCh0aGlzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSAmJiBjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2VQbHVnaW4uc3VibWl0QWN0aW9uLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmltYWdlLmltZ0lucHV0RmlsZS5maWxlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlICYmIGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgICAgICAgICAgIGltYWdlUGx1Z2luLm9uUmVuZGVyX2ltZ1VybC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmltYWdlLnN1Ym1pdC5mYWlsXSBjYXVzZSA6IFwiJyArIGVycm9yLm1lc3NhZ2UgKyAnXCInKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgc3VibWl0QWN0aW9uOiBmdW5jdGlvbiAoZmlsZUxpc3QpIHtcbiAgICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBmaWxlU2l6ZSA9IDA7XG4gICAgICAgIGxldCBmaWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZmlsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgvaW1hZ2UvaS50ZXN0KGZpbGVMaXN0W2ldLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlTGlzdFtpXSk7XG4gICAgICAgICAgICAgICAgZmlsZVNpemUgKz0gZmlsZUxpc3RbaV0uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbWl0U2l6ZSA9IHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZFNpemVMaW1pdDtcbiAgICAgICAgaWYgKGxpbWl0U2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGxldCBpbmZvU2l6ZSA9IDA7XG4gICAgICAgICAgICBjb25zdCBpbWFnZXNJbmZvID0gdGhpcy5jb250ZXh0LmltYWdlLl9pbmZvTGlzdDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpbWFnZXNJbmZvLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5mb1NpemUgKz0gaW1hZ2VzSW5mb1tpXS5zaXplICogMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChmaWxlU2l6ZSArIGluZm9TaXplKSA+IGxpbWl0U2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gJ1tTVU5FRElUT1IuaW1hZ2VVcGxvYWQuZmFpbF0gU2l6ZSBvZiB1cGxvYWRhYmxlIHRvdGFsIGltYWdlczogJyArIChsaW1pdFNpemUvMTAwMCkgKyAnS0InO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEVycm9yKGVyciwgeyAnbGltaXRTaXplJzogbGltaXRTaXplLCAnY3VycmVudFNpemUnOiBpbmZvU2l6ZSwgJ3VwbG9hZFNpemUnOiBmaWxlU2l6ZSB9LCB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5ub3RpY2VPcGVuKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29udGV4dEltYWdlLl91cGxvYWRGaWxlTGVuZ3RoID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgIGxpbmtWYWx1ZTogY29udGV4dEltYWdlLl92X2xpbmsuX2xpbmtWYWx1ZSxcbiAgICAgICAgICAgIGxpbmtOZXdXaW5kb3c6IGNvbnRleHRJbWFnZS5pbWdMaW5rTmV3V2luZG93Q2hlY2suY2hlY2tlZCxcbiAgICAgICAgICAgIGlucHV0V2lkdGg6IGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUsXG4gICAgICAgICAgICBpbnB1dEhlaWdodDogY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSxcbiAgICAgICAgICAgIGFsaWduOiBjb250ZXh0SW1hZ2UuX2FsaWduLFxuICAgICAgICAgICAgaXNVcGRhdGU6IHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwsXG4gICAgICAgICAgICBlbGVtZW50OiBjb250ZXh0SW1hZ2UuX2VsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWRCZWZvcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWRCZWZvcmUoZmlsZXMsIGluZm8sIHRoaXMsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgdGhpcy5fdy5BcnJheS5pc0FycmF5KGRhdGEucmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UucmVnaXN0ZXIuY2FsbCh0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UudXBsb2FkLmNhbGwodGhpcywgaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3cuQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggPiAwKSBmaWxlcyA9IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS51cGxvYWQuY2FsbCh0aGlzLCBpbmZvLCBmaWxlcyk7XG4gICAgfSxcblxuICAgIGVycm9yOiBmdW5jdGlvbiAobWVzc2FnZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEVycm9yKG1lc3NhZ2UsIHJlc3BvbnNlLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMubm90aWNlT3BlbihtZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLnBsdWdpbi5pbWFnZS5lcnJvcl0gcmVzcG9uc2U6ICcgKyBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGxvYWQ6IGZ1bmN0aW9uIChpbmZvLCBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZmlsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuZXJyb3IuY2FsbCh0aGlzLCBmaWxlcywgbnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZVVwbG9hZFVybCA9IHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZFVybDtcbiAgICAgICAgY29uc3QgZmlsZXNMZW4gPSB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsID8gMSA6IGZpbGVzLmxlbmd0aDtcblxuICAgICAgICAvLyBzZXJ2ZXIgdXBsb2FkXG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VVcGxvYWRVcmwgPT09ICdzdHJpbmcnICYmIGltYWdlVXBsb2FkVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUtJyArIGksIGZpbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci51cGxvYWQuY2FsbCh0aGlzLCBpbWFnZVVwbG9hZFVybCwgdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkSGVhZGVyLCBmb3JtRGF0YSwgdGhpcy5wbHVnaW5zLmltYWdlLmNhbGxCYWNrX2ltZ1VwbG9hZC5iaW5kKHRoaXMsIGluZm8pLCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IpO1xuICAgICAgICB9IGVsc2UgeyAvLyBiYXNlNjRcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5zZXR1cF9yZWFkZXIuY2FsbCh0aGlzLCBmaWxlcywgaW5mby5saW5rVmFsdWUsIGluZm8ubGlua05ld1dpbmRvdywgaW5mby5pbnB1dFdpZHRoLCBpbmZvLmlucHV0SGVpZ2h0LCBpbmZvLmFsaWduLCBmaWxlc0xlbiwgaW5mby5pc1VwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsbEJhY2tfaW1nVXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgeG1sSHR0cCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLmltYWdlVXBsb2FkSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMuaW1hZ2VVcGxvYWRIYW5kbGVyKHhtbEh0dHAsIGluZm8sIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuZXJyb3IuY2FsbCh0aGlzLCByZXNwb25zZS5lcnJvck1lc3NhZ2UsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoaW5mbywgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgZmlsZUxpc3QgPSByZXNwb25zZS5yZXN1bHQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aCwgZmlsZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0geyBuYW1lOiBmaWxlTGlzdFtpXS5uYW1lLCBzaXplOiBmaWxlTGlzdFtpXS5zaXplIH07XG4gICAgICAgICAgICBpZiAoaW5mby5pc1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS51cGRhdGVfc3JjLmNhbGwodGhpcywgZmlsZUxpc3RbaV0udXJsLCBpbmZvLmVsZW1lbnQsIGZpbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuY3JlYXRlX2ltYWdlLmNhbGwodGhpcywgZmlsZUxpc3RbaV0udXJsLCBpbmZvLmxpbmtWYWx1ZSwgaW5mby5saW5rTmV3V2luZG93LCBpbmZvLmlucHV0V2lkdGgsIGluZm8uaW5wdXRIZWlnaHQsIGluZm8uYWxpZ24sIGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgIH0sXG5cbiAgICBzZXR1cF9yZWFkZXI6IGZ1bmN0aW9uIChmaWxlcywgaW1nTGlua1ZhbHVlLCBuZXdXaW5kb3dDaGVjaywgd2lkdGgsIGhlaWdodCwgYWxpZ24sIGZpbGVzTGVuLCBpc1VwZGF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmJhc2U2NFJlbmRlckluZGV4ID0gZmlsZXNMZW47XG4gICAgICAgICAgICBjb25zdCB3RmlsZVJlYWRlciA9IHRoaXMuX3cuRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzU3RhY2sgPSBbZmlsZXNMZW5dO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmlucHV0WC52YWx1ZSA9IHdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmlucHV0WS52YWx1ZSA9IGhlaWdodDtcbiAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZWFkZXIsIGZpbGU7IGkgPCBmaWxlc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IHdGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgZmlsZSA9IGZpbGVzW2ldO1xuICAgIFxuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAocmVhZGVyLCB1cGRhdGUsIHVwZGF0ZUVsZW1lbnQsIGZpbGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzU3RhY2tbaW5kZXhdID0geyByZXN1bHQ6IHJlYWRlci5yZXN1bHQsIGZpbGU6IGZpbGUgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoLS10aGlzLmNvbnRleHQuaW1hZ2UuYmFzZTY0UmVuZGVySW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5vblJlbmRlcl9pbWdCYXNlNjQuY2FsbCh0aGlzLCB1cGRhdGUsIGZpbGVzU3RhY2ssIHVwZGF0ZUVsZW1lbnQsIGltZ0xpbmtWYWx1ZSwgbmV3V2luZG93Q2hlY2ssIHdpZHRoLCBoZWlnaHQsIGFsaWduKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgcmVhZGVyLCBpc1VwZGF0ZSwgdGhpcy5jb250ZXh0LmltYWdlLl9lbGVtZW50LCBmaWxlLCBpKTtcblxuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuaW1hZ2Uuc2V0dXBfcmVhZGVyLmZhaWxdIGNhdXNlIDogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25SZW5kZXJfaW1nQmFzZTY0OiBmdW5jdGlvbiAodXBkYXRlLCBmaWxlc1N0YWNrLCB1cGRhdGVFbGVtZW50LCBpbWdMaW5rVmFsdWUsIG5ld1dpbmRvd0NoZWNrLCB3aWR0aCwgaGVpZ2h0LCBhbGlnbikge1xuICAgICAgICBjb25zdCB1cGRhdGVNZXRob2QgPSB0aGlzLnBsdWdpbnMuaW1hZ2UudXBkYXRlX3NyYztcbiAgICAgICAgY29uc3QgY3JlYXRlTWV0aG9kID0gdGhpcy5wbHVnaW5zLmltYWdlLmNyZWF0ZV9pbWFnZTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWxlc1N0YWNrLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1maWxlLW5hbWUnLCBmaWxlc1N0YWNrW2ldLmZpbGUubmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1maWxlLXNpemUnLCBmaWxlc1N0YWNrW2ldLmZpbGUuc2l6ZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlTWV0aG9kLmNhbGwodGhpcywgZmlsZXNTdGFja1tpXS5yZXN1bHQsIHVwZGF0ZUVsZW1lbnQsIGZpbGVzU3RhY2tbaV0uZmlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNyZWF0ZU1ldGhvZC5jYWxsKHRoaXMsIGZpbGVzU3RhY2tbaV0ucmVzdWx0LCBpbWdMaW5rVmFsdWUsIG5ld1dpbmRvd0NoZWNrLCB3aWR0aCwgaGVpZ2h0LCBhbGlnbiwgZmlsZXNTdGFja1tpXS5maWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlbmRlcl9pbWdVcmw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBpZiAoY29udGV4dEltYWdlLl92X3NyYy5fbGlua1ZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0ge25hbWU6IGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZS5zcGxpdCgnLycpLnBvcCgpLCBzaXplOiAwfTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsKSB0aGlzLnBsdWdpbnMuaW1hZ2UudXBkYXRlX3NyYy5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZSwgY29udGV4dEltYWdlLl9lbGVtZW50LCBmaWxlKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5wbHVnaW5zLmltYWdlLmNyZWF0ZV9pbWFnZS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZSwgY29udGV4dEltYWdlLl92X2xpbmsuX2xpbmtWYWx1ZSwgY29udGV4dEltYWdlLmltZ0xpbmtOZXdXaW5kb3dDaGVjay5jaGVja2VkLCBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlLCBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlLCBjb250ZXh0SW1hZ2UuX2FsaWduLCBmaWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuaW1hZ2UuVVJMUmVuZGVyaW5nLmZhaWxdIGNhdXNlIDogXCInICsgZS5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9uUmVuZGVyX2xpbms6IGZ1bmN0aW9uIChpbWdUYWcsIGltZ0xpbmtWYWx1ZSwgbmV3V2luZG93Q2hlY2spIHtcbiAgICAgICAgaWYgKGltZ0xpbmtWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdBJyk7XG4gICAgICAgICAgICBsaW5rLmhyZWYgPSAvXmh0dHBzPzpcXC9cXC8vLnRlc3QoaW1nTGlua1ZhbHVlKSA/IGltZ0xpbmtWYWx1ZSA6ICdodHRwOi8vJyArIGltZ0xpbmtWYWx1ZTtcbiAgICAgICAgICAgIGxpbmsudGFyZ2V0ID0gKG5ld1dpbmRvd0NoZWNrID8gJ19ibGFuaycgOiAnJyk7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJywgJ2ltYWdlJyk7XG4gICAgICAgICAgICBpbWdUYWcuc2V0QXR0cmlidXRlKCdkYXRhLWltYWdlLWxpbmsnLCBpbWdMaW5rVmFsdWUpO1xuXG4gICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGltZ1RhZyk7XG4gICAgICAgICAgICByZXR1cm4gbGluaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbWdUYWc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB4eSAneCc6IHdpZHRoLCAneSc6IGhlaWdodFxuICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgKi9cbiAgICBzZXRJbnB1dFNpemU6IGZ1bmN0aW9uICh4eSwgZSkge1xuICAgICAgICBpZiAoZSAmJiBlLmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRJbnB1dFNpemUuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuaW1hZ2UsIHh5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0UmF0aW86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2V0UmF0aW8uY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuaW1hZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBjaGVja0ZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGltYWdlUGx1Z2luID0gdGhpcy5wbHVnaW5zLmltYWdlO1xuXG4gICAgICAgIGNvbnN0IG1vZGlmeUhhbmRsZXIgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICBpbWFnZVBsdWdpbi5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCB0YWcsIG51bGwpO1xuICAgICAgICAgICAgaW1hZ2VQbHVnaW4ub3Blbk1vZGlmeS5jYWxsKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgaW1hZ2VQbHVnaW4udXBkYXRlX2ltYWdlLmNhbGwodGhpcywgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmNoZWNrSW5mby5jYWxsKHRoaXMsICdpbWFnZScsIFsnaW1nJ10sIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQsIG1vZGlmeUhhbmRsZXIsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICByZXNldEZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5yZXNldEluZm8uY2FsbCh0aGlzLCAnaW1hZ2UnLCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkKTtcbiAgICB9LFxuXG4gICAgY3JlYXRlX2ltYWdlOiBmdW5jdGlvbiAoc3JjLCBsaW5rVmFsdWUsIGxpbmtOZXdXaW5kb3csIHdpZHRoLCBoZWlnaHQsIGFsaWduLCBmaWxlKSB7XG4gICAgICAgIGNvbnN0IGltYWdlUGx1Z2luID0gdGhpcy5wbHVnaW5zLmltYWdlO1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA9ICdpbWFnZSc7XG5cbiAgICAgICAgbGV0IG9JbWcgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnSU1HJyk7XG4gICAgICAgIG9JbWcuc3JjID0gc3JjO1xuICAgICAgICBvSW1nLmFsdCA9IGNvbnRleHRJbWFnZS5fYWx0VGV4dDtcbiAgICAgICAgb0ltZyA9IGltYWdlUGx1Z2luLm9uUmVuZGVyX2xpbmsuY2FsbCh0aGlzLCBvSW1nLCBsaW5rVmFsdWUsIGxpbmtOZXdXaW5kb3cpO1xuICAgICAgICBvSW1nLnNldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGUnLCAnMCcpO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICBvSW1nLnNldEF0dHJpYnV0ZSgnZGF0YS1wcm9wb3J0aW9uJywgY29udGV4dEltYWdlLl9wcm9wb3J0aW9uQ2hlY2tlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3ZlciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvdmVyLmNhbGwodGhpcywgb0ltZyk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvbnRhaW5lci5jYWxsKHRoaXMsIGNvdmVyLCAnc2UtaW1hZ2UtY29udGFpbmVyJyk7XG5cbiAgICAgICAgLy8gY2FwdGlvblxuICAgICAgICBpZiAoY29udGV4dEltYWdlLl9jYXB0aW9uQ2hlY2tlZCkge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9jYXB0aW9uID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5jcmVhdGVfY2FwdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9jYXB0aW9uLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xuICAgICAgICAgICAgY292ZXIuYXBwZW5kQ2hpbGQoY29udGV4dEltYWdlLl9jYXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IG9JbWc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIgPSBjb3ZlcjtcbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICAgICAgLy8gc2V0IHNpemVcbiAgICAgICAgaW1hZ2VQbHVnaW4uYXBwbHlTaXplLmNhbGwodGhpcywgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgLy8gYWxpZ25cbiAgICAgICAgaW1hZ2VQbHVnaW4uc2V0QWxpZ24uY2FsbCh0aGlzLCBhbGlnbiwgb0ltZywgY292ZXIsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgb0ltZy5vbmxvYWQgPSBpbWFnZVBsdWdpbi5faW1hZ2VfY3JlYXRlX29ubG9hZC5iaW5kKHRoaXMsIG9JbWcsIGNvbnRleHRJbWFnZS5zdmdEZWZhdWx0U2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLmluc2VydENvbXBvbmVudChjb250YWluZXIsIHRydWUsIHRydWUsIHRydWUpKSB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuc2V0SW5mby5jYWxsKHRoaXMsICdpbWFnZScsIG9JbWcsIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQsIGZpbGUsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW4gPSAnJztcbiAgICB9LFxuXG4gICAgX2ltYWdlX2NyZWF0ZV9vbmxvYWQ6IGZ1bmN0aW9uIChvSW1nLCBzdmdEZWZhdWx0U2l6ZSkge1xuICAgICAgICAvLyBzdmcgZXhjZXB0aW9uIGhhbmRsaW5nXG4gICAgICAgIGlmIChvSW1nLm9mZnNldFdpZHRoID09PSAwKSB0aGlzLnBsdWdpbnMuaW1hZ2UuYXBwbHlTaXplLmNhbGwodGhpcywgc3ZnRGVmYXVsdFNpemUsICcnKTtcbiAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2FsbCh0aGlzLCBvSW1nLCAnaW1hZ2UnKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlX2ltYWdlOiBmdW5jdGlvbiAoaW5pdCwgb3BlbkNvbnRyb2xsZXIsIG5vdEhpc3RvcnlQdXNoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29uc3QgbGlua1ZhbHVlID0gY29udGV4dEltYWdlLl92X2xpbmsuX2xpbmtWYWx1ZTtcbiAgICAgICAgbGV0IGltYWdlRWwgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQ7XG4gICAgICAgIGxldCBjb3ZlciA9IGNvbnRleHRJbWFnZS5fY292ZXI7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBjb250ZXh0SW1hZ2UuX2NvbnRhaW5lcjtcbiAgICAgICAgbGV0IGlzTmV3Q29udGFpbmVyID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGNvdmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICBpc05ld0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBpbWFnZUVsID0gY29udGV4dEltYWdlLl9lbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgIGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBpbWFnZUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvdmVyID0gY292ZXIuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgaW1hZ2VFbCA9IGNvdmVyLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaXNOZXdDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS1pbWFnZS1jb250YWluZXInKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc05ld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvdmVyKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIgPSBjb3ZlcjtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IGltYWdlRWw7XG4gICAgICAgICAgICBpc05ld0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgc2l6ZVxuICAgICAgICBsZXQgY2hhbmdlU2l6ZTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMudXRpbC5pc051bWJlcihjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlKSA/IGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUgKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlO1xuICAgICAgICBjb25zdCB5ID0gdGhpcy51dGlsLmlzTnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWUpID8gY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSArIGNvbnRleHRJbWFnZS5zaXplVW5pdCA6IGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWU7XG4gICAgICAgIGlmICgvJSQvLnRlc3QoaW1hZ2VFbC5zdHlsZS53aWR0aCkpIHtcbiAgICAgICAgICAgIGNoYW5nZVNpemUgPSB4ICE9PSBjb250YWluZXIuc3R5bGUud2lkdGggfHwgeSAhPT0gY29udGFpbmVyLnN0eWxlLmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZVNpemUgPSB4ICE9PSBpbWFnZUVsLnN0eWxlLndpZHRoIHx8IHkgIT09IGltYWdlRWwuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWx0XG4gICAgICAgIGltYWdlRWwuYWx0ID0gY29udGV4dEltYWdlLl9hbHRUZXh0O1xuICAgICAgICBcbiAgICAgICAgLy8gY2FwdGlvblxuICAgICAgICBsZXQgbW9kaWZpZWRDYXB0aW9uID0gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2NhcHRpb25DaGVja2VkKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRleHRJbWFnZS5fY2FwdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbiA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuY3JlYXRlX2NhcHRpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb3Zlci5hcHBlbmRDaGlsZChjb250ZXh0SW1hZ2UuX2NhcHRpb24pO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ2FwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLl9jYXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGV4dEltYWdlLl9jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ2FwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsaW5rXG4gICAgICAgIGlmIChsaW5rVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2xpbmtFbGVtZW50ICE9PSBudWxsICYmIGNvdmVyLmNvbnRhaW5zKGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dEltYWdlLl9saW5rRWxlbWVudC5ocmVmID0gbGlua1ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQudGFyZ2V0ID0gKGNvbnRleHRJbWFnZS5pbWdMaW5rTmV3V2luZG93Q2hlY2suY2hlY2tlZCA/ICdfYmxhbmsnIDogJycpO1xuICAgICAgICAgICAgICAgIGltYWdlRWwuc2V0QXR0cmlidXRlKCdkYXRhLWltYWdlLWxpbmsnLCBsaW5rVmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RWwgPSB0aGlzLnBsdWdpbnMuaW1hZ2Uub25SZW5kZXJfbGluay5jYWxsKHRoaXMsIGltYWdlRWwsIGxpbmtWYWx1ZSwgdGhpcy5jb250ZXh0LmltYWdlLmltZ0xpbmtOZXdXaW5kb3dDaGVjay5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICBjb3Zlci5pbnNlcnRCZWZvcmUobmV3RWwsIGNvbnRleHRJbWFnZS5fY2FwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGV4dEltYWdlLl9saW5rRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gaW1hZ2VFbDtcblxuICAgICAgICAgICAgaW1hZ2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJywgJycpO1xuICAgICAgICAgICAgbGV0IG5ld0VsID0gaW1hZ2VFbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgIGNvdmVyLnJlbW92ZUNoaWxkKGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQpO1xuICAgICAgICAgICAgY292ZXIuaW5zZXJ0QmVmb3JlKG5ld0VsLCBjb250ZXh0SW1hZ2UuX2NhcHRpb24pO1xuICAgICAgICAgICAgaW1hZ2VFbCA9IG5ld0VsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdEVsZW1lbnQgPSAodGhpcy51dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGNvbnRleHRJbWFnZS5fZWxlbWVudC5wYXJlbnROb2RlKSB8fCB0aGlzLnV0aWwuaXNXeXNpd3lnRGl2KGNvbnRleHRJbWFnZS5fZWxlbWVudC5wYXJlbnROb2RlKSkgPyBcbiAgICAgICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnQgOiBcbiAgICAgICAgICAgICAgICAvXkEkL2kudGVzdChjb250ZXh0SW1hZ2UuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlTmFtZSkgPyBjb250ZXh0SW1hZ2UuX2VsZW1lbnQucGFyZW50Tm9kZSA6IHRoaXMudXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbnRleHRJbWFnZS5fZWxlbWVudCkgfHwgY29udGV4dEltYWdlLl9lbGVtZW50O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5pc0Zvcm1hdEVsZW1lbnQoZXhpc3RFbGVtZW50KSAmJiBleGlzdEVsZW1lbnQudGV4dENvbnRlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIGV4aXN0RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKGNvbnRleHRJbWFnZS5fZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjb250YWluZXIsIGV4aXN0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGltYWdlRWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IGltYWdlRWw7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyID0gY292ZXI7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyYW5zZm9ybVxuICAgICAgICBpZiAobW9kaWZpZWRDYXB0aW9uIHx8ICghY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSAmJiBjaGFuZ2VTaXplKSkge1xuICAgICAgICAgICAgaWYgKCFpbml0ICYmICgvXFxkKy8udGVzdChpbWFnZUVsLnN0eWxlLmhlaWdodCkgfHwgKHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwgJiYgY29udGV4dEltYWdlLl9jYXB0aW9uQ2hlY2tlZCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKC8lJC8udGVzdChjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlKSB8fCAvJSQvLnRlc3QoY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnJlc2V0VHJhbnNmb3JtLmNhbGwodGhpcywgaW1hZ2VFbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnNldFRyYW5zZm9ybVNpemUuY2FsbCh0aGlzLCBpbWFnZUVsLCB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUsIDApLCB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWUsIDApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplXG4gICAgICAgIGxldCBpc1BlcmNlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5fcmVzaXppbmcpIHtcbiAgICAgICAgICAgIGltYWdlRWwuc2V0QXR0cmlidXRlKCdkYXRhLXByb3BvcnRpb24nLCBjb250ZXh0SW1hZ2UuX3Byb3BvcnRpb25DaGVja2VkKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLmFwcGx5U2l6ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxpZ25cbiAgICAgICAgaWYgKCEoaXNQZXJjZW50ICYmIGNvbnRleHRJbWFnZS5fYWxpZ24gPT09ICdjZW50ZXInKSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgaW1hZ2VFbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgaW1hZ2VzSW5mb1xuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAnaW1hZ2UnLCBpbWFnZUVsLCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkLCBudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcGVuQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQoaW1hZ2VFbCwgJ2ltYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIGlmICghbm90SGlzdG9yeVB1c2gpIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlX3NyYzogZnVuY3Rpb24gKHNyYywgZWxlbWVudCwgZmlsZSkge1xuICAgICAgICBlbGVtZW50LnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5fdy5zZXRUaW1lb3V0KHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5zZXRJbmZvLmJpbmQodGhpcywgJ2ltYWdlJywgZWxlbWVudCwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZCwgZmlsZSwgdHJ1ZSkpO1xuICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChlbGVtZW50LCAnaW1hZ2UnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBvbk1vZGlmeU1vZGU6IGZ1bmN0aW9uIChlbGVtZW50LCBzaXplKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2xpbmtFbGVtZW50ID0gL15BJC9pLnRlc3QoZWxlbWVudC5wYXJlbnROb2RlLm5vZGVOYW1lKSA/IGVsZW1lbnQucGFyZW50Tm9kZSA6IG51bGw7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCAnRklHVVJFJyk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgdGhpcy51dGlsLmlzTWVkaWFDb21wb25lbnQpO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb24gPSB0aGlzLnV0aWwuZ2V0Q2hpbGRFbGVtZW50KGNvbnRleHRJbWFnZS5fY292ZXIsICdGSUdDQVBUSU9OJyk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fYWxpZ24gPSBlbGVtZW50LnN0eWxlLmZsb2F0IHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWFsaWduJykgfHwgJ25vbmUnO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmZsb2F0ID0gJyc7XG5cbiAgICAgICAgaWYgKHNpemUpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudF93ID0gc2l6ZS53O1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50X2ggPSBzaXplLmg7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnRfdCA9IHNpemUudDtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudF9sID0gc2l6ZS5sO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVzZXJTaXplID0gY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykgfHwgY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKTtcbiAgICAgICAgaWYgKHVzZXJTaXplKSB7XG4gICAgICAgICAgICB1c2VyU2l6ZSA9IHVzZXJTaXplLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX29yaWdpbl93ID0gdXNlclNpemVbMF07XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX29yaWdpbl9oID0gdXNlclNpemVbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSkge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9vcmlnaW5fdyA9IHNpemUudztcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fb3JpZ2luX2ggPSBzaXplLmg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBvcGVuTW9kaWZ5OiBmdW5jdGlvbiAobm90T3Blbikge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZSkge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl92X3NyYy5fbGlua1ZhbHVlID0gY29udGV4dEltYWdlLnByZXZpZXdTcmMudGV4dENvbnRlbnQgPSBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZS52YWx1ZSA9IGNvbnRleHRJbWFnZS5fZWxlbWVudC5zcmM7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dEltYWdlLl9hbHRUZXh0ID0gY29udGV4dEltYWdlLmFsdFRleHQudmFsdWUgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQuYWx0O1xuICAgICAgICBjb250ZXh0SW1hZ2UuX3ZfbGluay5fbGlua1ZhbHVlID0gY29udGV4dEltYWdlLnByZXZpZXdMaW5rLnRleHRDb250ZW50ID0gY29udGV4dEltYWdlLmltZ0xpbmsudmFsdWUgPSBjb250ZXh0SW1hZ2UuX2xpbmtFbGVtZW50ID09PSBudWxsID8gJycgOiBjb250ZXh0SW1hZ2UuX2xpbmtFbGVtZW50LmhyZWY7XG4gICAgICAgIGNvbnRleHRJbWFnZS5pbWdMaW5rTmV3V2luZG93Q2hlY2suY2hlY2tlZCA9IGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQgJiYgY29udGV4dEltYWdlLl9saW5rRWxlbWVudC50YXJnZXQgPT09ICdfYmxhbmsnO1xuICAgICAgICBjb250ZXh0SW1hZ2UubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiXVt2YWx1ZT1cIicgKyBjb250ZXh0SW1hZ2UuX2FsaWduICsgJ1wiXScpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2FsaWduID0gY29udGV4dEltYWdlLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIl06Y2hlY2tlZCcpLnZhbHVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb25DaGVja2VkID0gY29udGV4dEltYWdlLmNhcHRpb25DaGVja0VsLmNoZWNrZWQgPSAhIWNvbnRleHRJbWFnZS5fY2FwdGlvbjtcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRNb2RpZnlJbnB1dFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UsIHRoaXMucGx1Z2lucy5pbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vdE9wZW4pIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdpbWFnZScsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBhcHBseVNpemU6IGZ1bmN0aW9uICh3LCBoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcblxuICAgICAgICBpZiAoIXcpIHcgPSBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlIHx8IHRoaXMub3B0aW9ucy5pbWFnZVdpZHRoO1xuICAgICAgICBpZiAoIWgpIGggPSBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlIHx8IHRoaXMub3B0aW9ucy5pbWFnZUhlaWdodDtcbiAgICAgICAgXG4gICAgICAgIGlmICgoY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSAmJiAhIXcpIHx8IC8lJC8udGVzdCh3KSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldFBlcmNlbnRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICgoIXcgfHwgdyA9PT0gJ2F1dG8nKSAmJiAoIWggfHwgaCA9PT0gJ2F1dG8nKSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldEF1dG9TaXplLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2Uuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2l6ZVJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zaXplUmV2ZXJ0LmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHcsIGgsIG5vdFJlc2V0UGVyY2VudGFnZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29uc3Qgb25seVcgPSAvXihyd3xsdykkLy50ZXN0KGRpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IG9ubHlIID0gL14odGh8YmgpJC8udGVzdChkaXJlY3Rpb24pO1xuXG4gICAgICAgIGlmICghb25seUgpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMudXRpbC5pc051bWJlcih3KSA/IHcgKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiB3O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLmNhbmNlbFBlcmNlbnRBdHRyLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvbmx5Vykge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiAvJSQvLnRlc3QoaCkgPyAnJyA6IGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dEltYWdlLl9hbGlnbiA9PT0gJ2NlbnRlcicpIHRoaXMucGx1Z2lucy5pbWFnZS5zZXRBbGlnbi5jYWxsKHRoaXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICBpZiAoIW5vdFJlc2V0UGVyY2VudGFnZSkgY29udGV4dEltYWdlLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJyk7XG5cbiAgICAgICAgLy8gc2F2ZSBjdXJyZW50IHNpemVcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplLmNhbGwodGhpcywgY29udGV4dEltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0QXV0b1NpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuXG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5yZXNldFRyYW5zZm9ybS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fZWxlbWVudCk7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5jYW5jZWxQZXJjZW50QXR0ci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScsICdhdXRvLGF1dG8nKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UpO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0T3JpZ2luU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScpO1xuXG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5yZXNldFRyYW5zZm9ybS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fZWxlbWVudCk7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5jYW5jZWxQZXJjZW50QXR0ci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpblNpemUgPSAoY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKSB8fCAnJykuc3BsaXQoJywnKTtcbiAgICAgICAgY29uc3QgdyA9IG9yaWdpblNpemVbMF07XG4gICAgICAgIGNvbnN0IGggPSBvcmlnaW5TaXplWzFdO1xuXG4gICAgICAgIGlmIChvcmlnaW5TaXplKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSB8fCAoLyUkLy50ZXN0KHcpICYmICgvJSQvLnRlc3QoaCkgfHwgIS9cXGQvLnRlc3QoaCkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5zZXRQZXJjZW50U2l6ZS5jYWxsKHRoaXMsIHcsIGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2Uuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplLmNhbGwodGhpcywgY29udGV4dEltYWdlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRQZXJjZW50U2l6ZTogZnVuY3Rpb24gKHcsIGgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBoID0gISFoICYmICEvJSQvLnRlc3QoaCkgJiYgIXRoaXMudXRpbC5nZXROdW1iZXIoaCwgMCkgPyB0aGlzLnV0aWwuaXNOdW1iZXIoaCkgPyBoICsgJyUnIDogaCA6IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiAoaCB8fCAnJyk7XG4gICAgICAgIGNvbnN0IGhlaWdodFBlcmNlbnRhZ2UgPSAvJSQvLnRlc3QoaCk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLnV0aWwuaXNOdW1iZXIodykgPyB3ICsgJyUnIDogdztcbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gIWhlaWdodFBlcmNlbnRhZ2UgPyAnJyA6IGg7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodFBlcmNlbnRhZ2UgPyAnJyA6IGg7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJywgdyArICcsJyArIGgpO1xuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuc2V0Q2FwdGlvblBvc2l0aW9uLmNhbGwodGhpcywgY29udGV4dEltYWdlLl9lbGVtZW50KTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBjYW5jZWxQZXJjZW50QXR0cjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIFxuICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnO1xuXG4gICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0SW1hZ2UuX2NvbnRhaW5lciwgdGhpcy5jb250ZXh0LmltYWdlLl9mbG9hdENsYXNzUmVnRXhwKTtcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNvbnRleHRJbWFnZS5fY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGNvbnRleHRJbWFnZS5fYWxpZ24pO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldEFsaWduOiBmdW5jdGlvbiAoYWxpZ24sIGVsZW1lbnQsIGNvdmVyLCBjb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFhbGlnbikgYWxpZ24gPSBjb250ZXh0SW1hZ2UuX2FsaWduO1xuICAgICAgICBpZiAoIWVsZW1lbnQpIGVsZW1lbnQgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQ7XG4gICAgICAgIGlmICghY292ZXIpIGNvdmVyID0gY29udGV4dEltYWdlLl9jb3ZlcjtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGNvbnRleHRJbWFnZS5fY29udGFpbmVyO1xuXG4gICAgICAgIGlmIChhbGlnbiAmJiBhbGlnbiAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBjb3Zlci5zdHlsZS5tYXJnaW4gPSAnYXV0byc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb3Zlci5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoLyUkLy50ZXN0KGVsZW1lbnQuc3R5bGUud2lkdGgpICYmIGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUud2lkdGggPSBjb250YWluZXIuc3R5bGUud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSAnJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA/IChlbGVtZW50LnN0eWxlLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCkgOiAoKCFlbGVtZW50LnN0eWxlLndpZHRoIHx8IGVsZW1lbnQuc3R5bGUud2lkdGggPT09ICdhdXRvJykgPyAnJyA6IGVsZW1lbnQuc3R5bGUud2lkdGggfHwgJzEwMCUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy51dGlsLmhhc0NsYXNzKGNvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBhbGlnbikpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250YWluZXIsIGNvbnRleHRJbWFnZS5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGFsaWduKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nLCBhbGlnbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUpIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUudmFsdWUgPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSBjb250ZXh0SW1hZ2UuX3Zfc3JjLl9saW5rVmFsdWUgPSBjb250ZXh0SW1hZ2UucHJldmlld1NyYy50ZXh0Q29udGVudCA9IGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlLnZhbHVlID0gJyc7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlICYmIGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSB7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UucHJldmlld1NyYy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dEltYWdlLmFsdFRleHQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dEltYWdlLl92X2xpbmsuX2xpbmtWYWx1ZSA9IGNvbnRleHRJbWFnZS5wcmV2aWV3TGluay50ZXh0Q29udGVudCA9IGNvbnRleHRJbWFnZS5pbWdMaW5rLnZhbHVlID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5pbWdMaW5rTmV3V2luZG93Q2hlY2suY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBjb250ZXh0SW1hZ2UubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiXVt2YWx1ZT1cIm5vbmVcIl0nKS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dEltYWdlLmNhcHRpb25DaGVja0VsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLm9wZW5UYWIuY2FsbCh0aGlzLCAnaW5pdCcpO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlID0gdGhpcy5vcHRpb25zLmltYWdlV2lkdGggPT09IGNvbnRleHRJbWFnZS5fZGVmYXVsdFNpemVYID8gJycgOiB0aGlzLm9wdGlvbnMuaW1hZ2VXaWR0aDtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWUgPSB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQgPT09IGNvbnRleHRJbWFnZS5fZGVmYXVsdFNpemVZID8gJycgOiB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UucHJvcG9ydGlvbi5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fcmF0aW8gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fcmF0aW9YID0gMTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fcmF0aW9ZID0gMTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRpYWxvZyBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZyc7XG5pbXBvcnQgY29tcG9uZW50IGZyb20gJy4uL21vZHVsZXMvY29tcG9uZW50JztcbmltcG9ydCByZXNpemluZyBmcm9tICcuLi9tb2R1bGVzL3Jlc2l6aW5nJztcbmltcG9ydCBmaWxlTWFuYWdlciBmcm9tICcuLi9tb2R1bGVzL2ZpbGVNYW5hZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICd2aWRlbycsXG4gICAgZGlzcGxheTogJ2RpYWxvZycsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZGlhbG9nLCBjb21wb25lbnQsIHJlc2l6aW5nLCBmaWxlTWFuYWdlcl0pO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb3JlLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IGNvbnRleHQudmlkZW8gPSB7XG4gICAgICAgICAgICBfaW5mb0xpc3Q6IFtdLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIF9pbmZvSW5kZXg6IDAsIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgX3VwbG9hZEZpbGVMZW5ndGg6IDAsIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgZm9jdXNFbGVtZW50OiBudWxsLCAvLyBAT3ZlcnJpZGUgZGlhbG9nIC8vIFRoaXMgZWxlbWVudCBoYXMgZm9jdXMgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZC5cbiAgICAgICAgICAgIHNpemVVbml0OiBvcHRpb25zLl92aWRlb1NpemVVbml0LFxuICAgICAgICAgICAgX2FsaWduOiAnbm9uZScsXG4gICAgICAgICAgICBfZmxvYXRDbGFzc1JlZ0V4cDogJ19fc2VfX2Zsb2F0XFxcXC1bYS16XSsnLFxuICAgICAgICAgICAgX3lvdXR1YmVRdWVyeTogb3B0aW9ucy55b3V0dWJlUXVlcnksXG4gICAgICAgICAgICBfdmlkZW9SYXRpbzogKG9wdGlvbnMudmlkZW9SYXRpbyAqIDEwMCkgKyAnJScsXG4gICAgICAgICAgICBfZGVmYXVsdFJhdGlvOiAob3B0aW9ucy52aWRlb1JhdGlvICogMTAwKSArICclJyxcbiAgICAgICAgICAgIF9saW5rVmFsdWU6ICcnLFxuICAgICAgICAgICAgLy8gQHJlcXVpcmUgQE92ZXJyaWRlIGNvbXBvbmVudFxuICAgICAgICAgICAgX2VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBfY292ZXI6IG51bGwsXG4gICAgICAgICAgICBfY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgLy8gQE92ZXJyaWRlIHJlc2l6aW5nIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlucHV0WDogbnVsbCxcbiAgICAgICAgICAgIGlucHV0WTogbnVsbCxcbiAgICAgICAgICAgIF9lbGVtZW50X3c6IDEsXG4gICAgICAgICAgICBfZWxlbWVudF9oOiAxLFxuICAgICAgICAgICAgX2VsZW1lbnRfbDogMCxcbiAgICAgICAgICAgIF9lbGVtZW50X3Q6IDAsXG4gICAgICAgICAgICBfZGVmYXVsdFNpemVYOiAnMTAwJScsXG4gICAgICAgICAgICBfZGVmYXVsdFNpemVZOiAob3B0aW9ucy52aWRlb1JhdGlvICogMTAwKSArICclJyxcbiAgICAgICAgICAgIF9vcmlnaW5fdzogb3B0aW9ucy52aWRlb1dpZHRoID09PSAnMTAwJScgPyAnJyA6IG9wdGlvbnMudmlkZW9XaWR0aCxcbiAgICAgICAgICAgIF9vcmlnaW5faDogb3B0aW9ucy52aWRlb0hlaWdodCA9PT0gJzU2LjI1JScgPyAnJyA6IG9wdGlvbnMudmlkZW9IZWlnaHQsXG4gICAgICAgICAgICBfcHJvcG9ydGlvbkNoZWNrZWQ6IHRydWUsXG4gICAgICAgICAgICBfcmVzaXppbmc6IG9wdGlvbnMudmlkZW9SZXNpemluZyxcbiAgICAgICAgICAgIF9yZXNpemVEb3RIaWRlOiAhb3B0aW9ucy52aWRlb0hlaWdodFNob3csXG4gICAgICAgICAgICBfcm90YXRpb246IG9wdGlvbnMudmlkZW9Sb3RhdGlvbixcbiAgICAgICAgICAgIF9vbmx5UGVyY2VudGFnZTogb3B0aW9ucy52aWRlb1NpemVPbmx5UGVyY2VudGFnZSxcbiAgICAgICAgICAgIF9yYXRpbzogZmFsc2UsXG4gICAgICAgICAgICBfcmF0aW9YOiAxLFxuICAgICAgICAgICAgX3JhdGlvWTogMSxcbiAgICAgICAgICAgIF9jYXB0aW9uU2hvdzogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogdmlkZW8gZGlhbG9nICovXG4gICAgICAgIGxldCB2aWRlb19kaWFsb2cgPSB0aGlzLnNldERpYWxvZyhjb3JlKTtcbiAgICAgICAgY29udGV4dFZpZGVvLm1vZGFsID0gdmlkZW9fZGlhbG9nO1xuICAgICAgICBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUgPSB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV92aWRlb19maWxlJyk7XG4gICAgICAgIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUgPSB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWlucHV0LXVybCcpO1xuICAgICAgICBjb250ZXh0VmlkZW8uZm9jdXNFbGVtZW50ID0gY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSB8fCBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGU7XG4gICAgICAgIGNvbnRleHRWaWRlby5wcmV2aWV3ID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1saW5rLXByZXZpZXcnKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlKSB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWRpYWxvZy1maWxlcy1lZGdlLWJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fcmVtb3ZlU2VsZWN0ZWRGaWxlcy5iaW5kKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSwgY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSwgY29udGV4dFZpZGVvLnByZXZpZXcpKTtcbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSAmJiBjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlKSBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fZmlsZUlucHV0Q2hhbmdlLmJpbmQoY29udGV4dFZpZGVvKSk7XG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlKSBjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25MaW5rUHJldmlldy5iaW5kKGNvbnRleHRWaWRlby5wcmV2aWV3LCBjb250ZXh0VmlkZW8sIG9wdGlvbnMubGlua1Byb3RvY29sKSk7XG5cbiAgICAgICAgY29udGV4dFZpZGVvLnByb3BvcnRpb24gPSB7fTtcbiAgICAgICAgY29udGV4dFZpZGVvLnZpZGVvUmF0aW9PcHRpb24gPSB7fTtcbiAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WCA9IHt9O1xuICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZID0ge307XG4gICAgICAgIGlmIChvcHRpb25zLnZpZGVvUmVzaXppbmcpIHtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5wcm9wb3J0aW9uID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdmlkZW9fY2hlY2tfcHJvcG9ydGlvbicpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnZpZGVvUmF0aW9PcHRpb24gPSB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLXZpZGVvLXJhdGlvJyk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRYID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdmlkZW9fc2l6ZV94Jyk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdmlkZW9fc2l6ZV95Jyk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRYLnZhbHVlID0gb3B0aW9ucy52aWRlb1dpZHRoO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSA9IG9wdGlvbnMudmlkZW9IZWlnaHQ7XG5cbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFguYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnNldElucHV0U2l6ZS5iaW5kKGNvcmUsICd4JykpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuc2V0SW5wdXRTaXplLmJpbmQoY29yZSwgJ3knKSk7XG5cbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFguYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRSYXRpby5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRSYXRpby5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5wcm9wb3J0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc2V0UmF0aW8uYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8udmlkZW9SYXRpb09wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNldFZpZGVvUmF0aW8uYmluZChjb3JlKSk7XG5cbiAgICAgICAgICAgIHZpZGVvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtZGlhbG9nLWJ0bi1yZXZlcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc2l6ZVJldmVydC5iaW5kKGNvcmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBhcHBlbmQgaHRtbCAqL1xuICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hcHBlbmRDaGlsZCh2aWRlb19kaWFsb2cpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgdmlkZW9fZGlhbG9nID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqIGRpYWxvZyAqL1xuICAgIHNldERpYWxvZzogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBkaWFsb2cgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgZGlhbG9nLmNsYXNzTmFtZSA9ICdzZS1kaWFsb2ctY29udGVudCc7XG4gICAgICAgIGRpYWxvZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBsZXQgaHRtbCA9ICcnICtcbiAgICAgICAgICAgICc8Zm9ybSBtZXRob2Q9XCJwb3N0XCIgZW5jdHlwZT1cIm11bHRpcGFydC9mb3JtLWRhdGFcIj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1oZWFkZXJcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImNsb3NlXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guY2xvc2UgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JlLmljb25zLmNhbmNlbCArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtbW9kYWwtdGl0bGVcIj4nICsgbGFuZy5kaWFsb2dCb3gudmlkZW9Cb3gudGl0bGUgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1ib2R5XCI+JztcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24udmlkZW9GaWxlSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gudmlkZW9Cb3guZmlsZSArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0tZmlsZXNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gX3NlX3ZpZGVvX2ZpbGVcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIicgKyBvcHRpb24udmlkZW9BY2NlcHQgKyAnXCInICsgKG9wdGlvbi52aWRlb011bHRpcGxlRmlsZSA/ICcgbXVsdGlwbGU9XCJtdWx0aXBsZVwiJyA6ICcnKSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiZmlsZXNSZW1vdmVcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24gc2UtZmlsZS1yZW1vdmVcIiB0aXRsZT1cIicgKyBsYW5nLmNvbnRyb2xsZXIucmVtb3ZlICsgJ1wiPicgKyBjb3JlLmljb25zLmNhbmNlbCArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyA7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24udmlkZW9VcmxJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC52aWRlb0JveC51cmwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBzZS1pbnB1dC11cmxcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIj48L3ByZT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbi52aWRlb1Jlc2l6aW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF0aW9MaXN0ID0gb3B0aW9uLnZpZGVvUmF0aW9MaXN0IHx8IFt7bmFtZTogJzE2OjknLCB2YWx1ZTogMC41NjI1fSwge25hbWU6ICc0OjMnLCB2YWx1ZTogMC43NX0sIHtuYW1lOiAnMjE6OScsIHZhbHVlOiAwLjQyODV9XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IG9wdGlvbi52aWRlb1JhdGlvO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9ubHlQZXJjZW50YWdlID0gb3B0aW9uLnZpZGVvU2l6ZU9ubHlQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9ubHlQZXJjZW50RGlzcGxheSA9IG9ubHlQZXJjZW50YWdlID8gJyBzdHlsZT1cImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcIicgOiAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHREaXNwbGF5ID0gIW9wdGlvbi52aWRlb0hlaWdodFNob3cgPyAnIHN0eWxlPVwiZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1wiJyA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdGlvRGlzcGxheSA9ICFvcHRpb24udmlkZW9SYXRpb1Nob3cgPyAnIHN0eWxlPVwiZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1wiJyA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9ubHlXaWR0aERpc3BsYXkgPSAhb25seVBlcmNlbnRhZ2UgJiYgIW9wdGlvbi52aWRlb0hlaWdodFNob3cgJiYgIW9wdGlvbi52aWRlb1JhdGlvU2hvdyA/ICcgc3R5bGU9XCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCInIDogJyc7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLXNpemUtdGV4dFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzaXplLXdcIj4nICsgbGFuZy5kaWFsb2dCb3gud2lkdGggKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2UtZGlhbG9nLXNpemUteFwiPiZuYnNwOzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNpemUtaFwiJyArIGhlaWdodERpc3BsYXkgKyAnPicgKyBsYW5nLmRpYWxvZ0JveC5oZWlnaHQgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2l6ZS1oXCInICsgcmF0aW9EaXNwbGF5ICsgJz4oJyArIGxhbmcuZGlhbG9nQm94LnJhdGlvICsgJyk8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWNvbnRyb2wgX3NlX3ZpZGVvX3NpemVfeFwiIHBsYWNlaG9sZGVyPVwiMTAwJVwiJyArIChvbmx5UGVyY2VudGFnZSA/ICcgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIicgOiAndHlwZT1cInRleHRcIicpICsgKG9ubHlQZXJjZW50YWdlID8gJyBtYXg9XCIxMDBcIicgOiAnJykgKyAnLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzZS1kaWFsb2ctc2l6ZS14XCInICsgb25seVdpZHRoRGlzcGxheSArICc+JyArIChvbmx5UGVyY2VudGFnZSA/ICclJyA6ICd4JykgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9XCJzZS1pbnB1dC1jb250cm9sIF9zZV92aWRlb19zaXplX3lcIiBwbGFjZWhvbGRlcj1cIicgKyAob3B0aW9uLnZpZGVvUmF0aW8gKiAxMDApICsgJyVcIicgKyAob25seVBlcmNlbnRhZ2UgPyAnIHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCInIDogJ3R5cGU9XCJ0ZXh0XCInKSArIChvbmx5UGVyY2VudGFnZSA/ICcgbWF4PVwiMTAwXCInIDogJycpICsgaGVpZ2h0RGlzcGxheSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzZWxlY3QgY2xhc3M9XCJzZS1pbnB1dC1zZWxlY3Qgc2UtdmlkZW8tcmF0aW9cIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5yYXRpbyArICdcIicgKyByYXRpb0Rpc3BsYXkgKyAnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHREaXNwbGF5KSBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiXCI+IC0gPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmF0aW9MaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgcmF0aW9MaXN0W2ldLnZhbHVlICsgJ1wiJyArIChyYXRpby50b1N0cmluZygpID09PSByYXRpb0xpc3RbaV0udmFsdWUudG9TdHJpbmcoKSA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz4nICsgcmF0aW9MaXN0W2ldLm5hbWUgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8L3NlbGVjdD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5yZXZlcnRCdXR0b24gKyAnXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWJ0bi1yZXZlcnRcIiBzdHlsZT1cImZsb2F0OiByaWdodDtcIj4nICsgY29yZS5pY29ucy5yZXZlcnQgKyAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybSBzZS1kaWFsb2ctZm9ybS1mb290ZXJcIicgKyBvbmx5UGVyY2VudERpc3BsYXkgKyBvbmx5V2lkdGhEaXNwbGF5ICsgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1jaGVjayBfc2VfdmlkZW9fY2hlY2tfcHJvcG9ydGlvblwiIGNoZWNrZWQvPiZuYnNwOycgKyBsYW5nLmRpYWxvZ0JveC5wcm9wb3J0aW9uICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9vdGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bmVkaXRvcl92aWRlb19yYWRpb1wiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1yYWRpb1wiIHZhbHVlPVwibm9uZVwiIGNoZWNrZWQ+JyArIGxhbmcuZGlhbG9nQm94LmJhc2ljICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VuZWRpdG9yX3ZpZGVvX3JhZGlvXCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLXJhZGlvXCIgdmFsdWU9XCJsZWZ0XCI+JyArIGxhbmcuZGlhbG9nQm94LmxlZnQgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cImNlbnRlclwiPicgKyBsYW5nLmRpYWxvZ0JveC5jZW50ZXIgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cInJpZ2h0XCI+JyArIGxhbmcuZGlhbG9nQm94LnJpZ2h0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwic2UtYnRuLXByaW1hcnlcIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5zdWJtaXRCdXR0b24gKyAnXCI+PHNwYW4+JyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICc8L3NwYW4+PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZm9ybT4nO1xuXG4gICAgICAgIGRpYWxvZy5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSxcblxuICAgIF9maWxlSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvSW5wdXRGaWxlLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvVXJsRmlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9VcmxGaWxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlldy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2gnO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZW1vdmVTZWxlY3RlZEZpbGVzOiBmdW5jdGlvbiAodXJsSW5wdXQsIHByZXZpZXcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAodXJsSW5wdXQpIHtcbiAgICAgICAgICAgIHVybElucHV0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25MaW5rUHJldmlldzogZnVuY3Rpb24gKGNvbnRleHQsIHByb3RvY29sLCBlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoL148aWZyYW1lLipcXC9pZnJhbWU+JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuX2xpbmtWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9ICc8SUZyYW1lIDpzcmM9XCIuLlwiPjwvSUZyYW1lPic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0Ll9saW5rVmFsdWUgPSB0aGlzLnRleHRDb250ZW50ID0gIXZhbHVlID8gJycgOiAocHJvdG9jb2wgJiYgdmFsdWUuaW5kZXhPZignOi8vJykgPT09IC0xICYmIHZhbHVlLmluZGV4T2YoJyMnKSAhPT0gMCkgPyBwcm90b2NvbCArIHZhbHVlIDogdmFsdWUuaW5kZXhPZignOi8vJykgPT09IC0xID8gJy8nICsgdmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfc2V0VGFnQXR0cnM6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250cm9scycsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGF0dHJzID0gdGhpcy5vcHRpb25zLnZpZGVvVGFnQXR0cnM7XG4gICAgICAgIGlmICghYXR0cnMpIHJldHVybjtcblxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy51dGlsLmhhc093bihhdHRycywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIGF0dHJzW2tleV0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZVZpZGVvVGFnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvVGFnID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1ZJREVPJyk7XG4gICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5fc2V0VGFnQXR0cnMuY2FsbCh0aGlzLCB2aWRlb1RhZyk7XG4gICAgICAgIHJldHVybiB2aWRlb1RhZztcbiAgICB9LFxuXG4gICAgX3NldElmcmFtZUF0dHJzOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmZyYW1lQm9yZGVyID0gJzAnO1xuICAgICAgICBlbGVtZW50LmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLm9wdGlvbnMudmlkZW9JZnJhbWVBdHRycztcbiAgICAgICAgaWYgKCFhdHRycykgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBhdHRycykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWwuaGFzT3duKGF0dHJzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlSWZyYW1lVGFnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGlmcmFtZVRhZyA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdJRlJBTUUnKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLl9zZXRJZnJhbWVBdHRycy5jYWxsKHRoaXMsIGlmcmFtZVRhZyk7XG4gICAgICAgIHJldHVybiBpZnJhbWVUYWc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBAUmVxdWlyZWQgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBmaWxlVGFnczogWydpZnJhbWUnLCAndmlkZW8nXSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlLCByZXNpemluZywgZmlsZU1hbmFnZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMgY2FsbGVkIGZyb20gY29yZS5zZWxlY3RDb21wb25lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRhcmdldCBlbGVtZW50XG4gICAgICovXG4gICAgc2VsZWN0OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8ub25Nb2RpZnlNb2RlLmNhbGwodGhpcywgZWxlbWVudCwgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLmNhbGxfY29udHJvbGxlcl9yZXNpemUuY2FsbCh0aGlzLCBlbGVtZW50LCAndmlkZW8nKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IGVsZW1lbnQgfHwgdGhpcy5jb250ZXh0LnZpZGVvLl9lbGVtZW50O1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRleHQudmlkZW8uX2NvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gZnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JykgKiAxO1xuICAgICAgICBsZXQgZm9jdXNFbCA9IChjb250YWluZXIucHJldmlvdXNFbGVtZW50U2libGluZyB8fCBjb250YWluZXIubmV4dEVsZW1lbnRTaWJsaW5nKTtcblxuICAgICAgICBjb25zdCBlbXB0eURpdiA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICB0aGlzLnV0aWwucmVtb3ZlSXRlbShjb250YWluZXIpO1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG5cbiAgICAgICAgaWYgKGVtcHR5RGl2ICE9PSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnKSB0aGlzLnV0aWwucmVtb3ZlSXRlbUFsbFBhcmVudHMoZW1wdHlEaXYsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOyB9LCBudWxsKTtcblxuICAgICAgICAvLyBmb2N1c1xuICAgICAgICB0aGlzLmZvY3VzRWRnZShmb2N1c0VsKTtcblxuICAgICAgICAvLyBldmVudFxuICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuZGVsZXRlSW5mby5jYWxsKHRoaXMsICd2aWRlbycsIGRhdGFJbmRleCwgdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZCk7XG5cbiAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICh1cGRhdGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuXG4gICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRYLnZhbHVlID0gY29udGV4dFZpZGVvLl9vcmlnaW5fdyA9IHRoaXMub3B0aW9ucy52aWRlb1dpZHRoID09PSBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWCA/ICcnIDogdGhpcy5vcHRpb25zLnZpZGVvV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlID0gY29udGV4dFZpZGVvLl9vcmlnaW5faCA9IHRoaXMub3B0aW9ucy52aWRlb0hlaWdodCA9PT0gY29udGV4dFZpZGVvLl9kZWZhdWx0U2l6ZVkgPyAnJyA6IHRoaXMub3B0aW9ucy52aWRlb0hlaWdodDtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5wcm9wb3J0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLnZpZGVvTXVsdGlwbGVGaWxlKSBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUuc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSAmJiB0aGlzLm9wdGlvbnMudmlkZW9NdWx0aXBsZUZpbGUpIGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZS5yZW1vdmVBdHRyaWJ1dGUoJ211bHRpcGxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9yZXNpemluZykge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldFZpZGVvUmF0aW9TZWxlY3QuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8uX29yaWdpbl9oIHx8IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9wZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ3ZpZGVvJywgJ3ZpZGVvJyA9PT0gdGhpcy5jdXJyZW50Q29udHJvbGxlck5hbWUpO1xuICAgIH0sXG4gICAgXG4gICAgc2V0VmlkZW9SYXRpbzogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0Lm9wdGlvbnNbZS50YXJnZXQuc2VsZWN0ZWRJbmRleF0udmFsdWU7XG5cbiAgICAgICAgY29udGV4dFZpZGVvLl9kZWZhdWx0U2l6ZVkgPSBjb250ZXh0VmlkZW8uX3ZpZGVvUmF0aW8gPSAhdmFsdWUgPyBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWSA6ICh2YWx1ZSAqIDEwMCkgKyAnJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkucGxhY2Vob2xkZXIgPSAhdmFsdWUgPyAnJyA6ICh2YWx1ZSAqIDEwMCkgKyAnJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkudmFsdWUgPSAnJztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHh5ICd4Jzogd2lkdGgsICd5JzogaGVpZ2h0XG4gICAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBlIEV2ZW50IG9iamVjdFxuICAgICAqL1xuICAgIHNldElucHV0U2l6ZTogZnVuY3Rpb24gKHh5LCBlKSB7XG4gICAgICAgIGlmIChlICYmIGUua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2V0SW5wdXRTaXplLmNhbGwodGhpcywgY29udGV4dFZpZGVvLCB4eSk7XG5cbiAgICAgICAgaWYgKHh5ID09PSAneScpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRWaWRlb1JhdGlvU2VsZWN0LmNhbGwodGhpcywgZS50YXJnZXQudmFsdWUgfHwgY29udGV4dFZpZGVvLl9kZWZhdWx0UmF0aW8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFJhdGlvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fbW9kdWxlX3NldFJhdGlvLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LnZpZGVvKTtcbiAgICB9LFxuXG4gICAgc3VibWl0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGNvbnN0IHZpZGVvUGx1Z2luID0gdGhpcy5wbHVnaW5zLnZpZGVvO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb250ZXh0VmlkZW8uX2FsaWduID0gY29udGV4dFZpZGVvLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlICYmIGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZS5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgICAgICAgICAgIHZpZGVvUGx1Z2luLnN1Ym1pdEFjdGlvbi5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC52aWRlby52aWRlb0lucHV0RmlsZS5maWxlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUgJiYgY29udGV4dFZpZGVvLl9saW5rVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICB2aWRlb1BsdWdpbi5zZXR1cF91cmwuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi52aWRlby5zdWJtaXQuZmFpbF0gY2F1c2UgOiBcIicgKyBlcnJvci5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIHN1Ym1pdEFjdGlvbjogZnVuY3Rpb24gKGZpbGVMaXN0KSB7XG4gICAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQgZmlsZVNpemUgPSAwO1xuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoL3ZpZGVvL2kudGVzdChmaWxlTGlzdFtpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZUxpc3RbaV0pO1xuICAgICAgICAgICAgICAgIGZpbGVTaXplICs9IGZpbGVMaXN0W2ldLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW1pdFNpemUgPSB0aGlzLm9wdGlvbnMudmlkZW9VcGxvYWRTaXplTGltaXQ7XG4gICAgICAgIGlmIChsaW1pdFNpemUgPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5mb1NpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgdmlkZW9zSW5mbyA9IHRoaXMuY29udGV4dC52aWRlby5faW5mb0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmlkZW9zSW5mby5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGluZm9TaXplICs9IHZpZGVvc0luZm9baV0uc2l6ZSAqIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoZmlsZVNpemUgKyBpbmZvU2l6ZSkgPiBsaW1pdFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9ICdbU1VORURJVE9SLnZpZGVvVXBsb2FkLmZhaWxdIFNpemUgb2YgdXBsb2FkYWJsZSB0b3RhbCB2aWRlb3M6ICcgKyAobGltaXRTaXplLzEwMDApICsgJ0tCJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEVycm9yICE9PSAnZnVuY3Rpb24nIHx8IHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWRFcnJvcihlcnIsIHsgJ2xpbWl0U2l6ZSc6IGxpbWl0U2l6ZSwgJ2N1cnJlbnRTaXplJzogaW5mb1NpemUsICd1cGxvYWRTaXplJzogZmlsZVNpemUgfSwgdGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMubm90aWNlT3BlbihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGNvbnRleHRWaWRlby5fdXBsb2FkRmlsZUxlbmd0aCA9IGZpbGVzLmxlbmd0aDtcblxuICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgICAgaW5wdXRXaWR0aDogY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0SGVpZ2h0OiBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGNvbnRleHRWaWRlby5fYWxpZ24sXG4gICAgICAgICAgICBpc1VwZGF0ZTogdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGNvbnRleHRWaWRlby5fZWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEJlZm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEJlZm9yZShmaWxlcywgaW5mbywgdGhpcywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiB0aGlzLl93LkFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5yZWdpc3Rlci5jYWxsKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby51cGxvYWQuY2FsbCh0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIGZpbGVzID0gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnVwbG9hZC5jYWxsKHRoaXMsIGluZm8sIGZpbGVzKTtcbiAgICB9LFxuXG4gICAgZXJyb3I6IGZ1bmN0aW9uIChtZXNzYWdlLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWRFcnJvciAhPT0gJ2Z1bmN0aW9uJyB8fCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkRXJyb3IobWVzc2FnZSwgcmVzcG9uc2UsIHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5ub3RpY2VPcGVuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IucGx1Z2luLnZpZGVvLmVycm9yXSByZXNwb25zZTogJyArIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwbG9hZDogZnVuY3Rpb24gKGluZm8sIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmaWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5lcnJvci5jYWxsKHRoaXMsIGZpbGVzLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpZGVvVXBsb2FkVXJsID0gdGhpcy5vcHRpb25zLnZpZGVvVXBsb2FkVXJsO1xuICAgICAgICBjb25zdCBmaWxlc0xlbiA9IHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPyAxIDogZmlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIHNlcnZlciB1cGxvYWRcbiAgICAgICAgaWYgKHR5cGVvZiB2aWRlb1VwbG9hZFVybCA9PT0gJ3N0cmluZycgJiYgdmlkZW9VcGxvYWRVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZS0nICsgaSwgZmlsZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnVwbG9hZC5jYWxsKHRoaXMsIHZpZGVvVXBsb2FkVXJsLCB0aGlzLm9wdGlvbnMudmlkZW9VcGxvYWRIZWFkZXIsIGZvcm1EYXRhLCB0aGlzLnBsdWdpbnMudmlkZW8uY2FsbEJhY2tfdmlkZW9VcGxvYWQuYmluZCh0aGlzLCBpbmZvKSwgdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLnZpZGVvVXBsb2FkLmZhaWxdIGNhdXNlIDogVGhlcmUgaXMgbm8gXCJ2aWRlb1VwbG9hZFVybFwiIG9wdGlvbi4nKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjYWxsQmFja192aWRlb1VwbG9hZDogZnVuY3Rpb24gKGluZm8sIHhtbEh0dHApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy52aWRlb1VwbG9hZEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zLnZpZGVvVXBsb2FkSGFuZGxlcih4bWxIdHRwLCBpbmZvLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4bWxIdHRwLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmVycm9yLmNhbGwodGhpcywgcmVzcG9uc2UuZXJyb3JNZXNzYWdlLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5yZWdpc3Rlci5jYWxsKHRoaXMsIGluZm8sIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWdpc3RlcjogZnVuY3Rpb24gKGluZm8sIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVMaXN0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICBjb25zdCB2aWRlb1RhZyA9IHRoaXMucGx1Z2lucy52aWRlby5jcmVhdGVWaWRlb1RhZy5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWxlTGlzdC5sZW5ndGgsIGZpbGU7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHsgbmFtZTogZmlsZUxpc3RbaV0ubmFtZSwgc2l6ZTogZmlsZUxpc3RbaV0uc2l6ZSB9O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmNyZWF0ZV92aWRlby5jYWxsKHRoaXMsIChpbmZvLmlzVXBkYXRlID8gaW5mby5lbGVtZW50IDogdmlkZW9UYWcuY2xvbmVOb2RlKGZhbHNlKSksIGZpbGVMaXN0W2ldLnVybCwgaW5mby5pbnB1dFdpZHRoLCBpbmZvLmlucHV0SGVpZ2h0LCBpbmZvLmFsaWduLCBmaWxlLCBpbmZvLmlzVXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgfSxcblxuICAgIHNldHVwX3VybDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICAgICAgbGV0IHVybCA9IGNvbnRleHRWaWRlby5fbGlua1ZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodXJsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAvKiogaWZyYW1lIHNvdXJjZSAqL1xuICAgICAgICAgICAgaWYgKC9ePGlmcmFtZS4qXFwvaWZyYW1lPiQvLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9JZnJhbWUgPSAobmV3IHRoaXMuX3cuRE9NUGFyc2VyKCkpLnBhcnNlRnJvbVN0cmluZyh1cmwsICd0ZXh0L2h0bWwnKS5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBvSWZyYW1lLnNyYztcbiAgICAgICAgICAgICAgICBpZiAodXJsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogeW91dHViZSAqL1xuICAgICAgICAgICAgaWYgKC95b3V0dVxcLj9iZS8udGVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvXmh0dHAvLnRlc3QodXJsKSkgdXJsID0gJ2h0dHBzOi8vJyArIHVybDtcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnd2F0Y2g/dj0nLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKCEvXlxcL1xcLy4rXFwvZW1iZWRcXC8vLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSh1cmwubWF0Y2goL1xcL1xcLy4rXFwvLylbMF0sICcvL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nKS5yZXBsYWNlKCcmJywgJz8mJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRWaWRlby5feW91dHViZVF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXD8vLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRVcmwgPSB1cmwuc3BsaXQoJz8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHNwbGl0VXJsWzBdICsgJz8nICsgY29udGV4dFZpZGVvLl95b3V0dWJlUXVlcnkgKyAnJicgKyBzcGxpdFVybFsxXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnPycgKyBjb250ZXh0VmlkZW8uX3lvdXR1YmVRdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL3ZpbWVvXFwuY29tLy50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8nICsgdXJsLnNsaWNlKHVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5jcmVhdGVfdmlkZW8uY2FsbCh0aGlzLCB0aGlzLnBsdWdpbnMudmlkZW8uY3JlYXRlSWZyYW1lVGFnLmNhbGwodGhpcyksIHVybCwgY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSwgY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSwgY29udGV4dFZpZGVvLl9hbGlnbiwgbnVsbCwgdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi52aWRlby51cGxvYWQuZmFpbF0gY2F1c2UgOiBcIicgKyBlcnJvci5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZV92aWRlbzogZnVuY3Rpb24gKG9GcmFtZSwgc3JjLCB3aWR0aCwgaGVpZ2h0LCBhbGlnbiwgZmlsZSwgaXNVcGRhdGUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luID0gJ3ZpZGVvJztcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBcbiAgICAgICAgbGV0IGNvdmVyID0gbnVsbDtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGxldCBpbml0ID0gZmFsc2U7XG5cbiAgICAgICAgLyoqIHVwZGF0ZSAqL1xuICAgICAgICBpZiAoaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIG9GcmFtZSA9IGNvbnRleHRWaWRlby5fZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChvRnJhbWUuc3JjICE9PSBzcmMpIHtcbiAgICAgICAgICAgICAgICBpbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1lvdXR1YmUgPSAveW91dHVcXC4/YmUvLnRlc3Qoc3JjKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ZpbWVvID0gL3ZpbWVvXFwuY29tLy50ZXN0KHNyYyk7XG4gICAgICAgICAgICAgICAgaWYgKChpc1lvdXR1YmUgfHwgaXNWaW1lbykgJiYgIS9eaWZyYW1lJC9pLnRlc3Qob0ZyYW1lLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSB0aGlzLnBsdWdpbnMudmlkZW8uY3JlYXRlSWZyYW1lVGFnLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RhZy5zcmMgPSBzcmM7XG4gICAgICAgICAgICAgICAgICAgIG9GcmFtZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdUYWcsIG9GcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudCA9IG9GcmFtZSA9IG5ld1RhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1lvdXR1YmUgJiYgIWlzVmltZW8gJiYgIS9edmlkZW9vJC9pLnRlc3Qob0ZyYW1lLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSB0aGlzLnBsdWdpbnMudmlkZW8uY3JlYXRlVmlkZW9UYWcuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFnLnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICAgICAgb0ZyYW1lLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld1RhZywgb0ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50ID0gb0ZyYW1lID0gbmV3VGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9GcmFtZS5zcmMgPSBzcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGV4dFZpZGVvLl9jb250YWluZXI7XG4gICAgICAgICAgICBjb3ZlciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KG9GcmFtZSwgJ0ZJR1VSRScpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBjcmVhdGUgKi9cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG9GcmFtZS5zcmMgPSBzcmM7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQgPSBvRnJhbWU7XG4gICAgICAgICAgICBjb3ZlciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvdmVyLmNhbGwodGhpcywgb0ZyYW1lKTtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvbnRhaW5lci5jYWxsKHRoaXMsIGNvdmVyLCAnc2UtdmlkZW8tY29udGFpbmVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogcmVuZGVyaW5nICovXG4gICAgICAgIGNvbnRleHRWaWRlby5fY292ZXIgPSBjb3ZlcjtcbiAgICAgICAgY29udGV4dFZpZGVvLl9jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICAgICAgY29uc3QgaW5wdXRVcGRhdGUgPSAodGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVguY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pICE9PSAod2lkdGggfHwgY29udGV4dFZpZGVvLl9kZWZhdWx0U2l6ZVgpKSB8fCAodGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVkuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pICE9PSAoaGVpZ2h0IHx8IGNvbnRleHRWaWRlby5fdmlkZW9SYXRpbykpO1xuICAgICAgICBjb25zdCBjaGFuZ2VTaXplID0gIWlzVXBkYXRlIHx8IGlucHV0VXBkYXRlO1xuXG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8uX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQudmlkZW8uX3Byb3BvcnRpb25DaGVja2VkID0gY29udGV4dFZpZGVvLnByb3BvcnRpb24uY2hlY2tlZDtcbiAgICAgICAgICAgIG9GcmFtZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvcG9ydGlvbicsIGNvbnRleHRWaWRlby5fcHJvcG9ydGlvbkNoZWNrZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2l6ZVxuICAgICAgICBsZXQgaXNQZXJjZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChjaGFuZ2VTaXplKSB7XG4gICAgICAgICAgICBpc1BlcmNlbnQgPSB0aGlzLnBsdWdpbnMudmlkZW8uYXBwbHlTaXplLmNhbGwodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGlnblxuICAgICAgICBpZiAoIShpc1BlcmNlbnQgJiYgYWxpZ24gPT09ICdjZW50ZXInKSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgb0ZyYW1lLCBjb3ZlciwgY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc1VwZGF0ZSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRoaXMuaW5zZXJ0Q29tcG9uZW50KGNvbnRhaW5lciwgZmFsc2UsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VmlkZW8uX3Jlc2l6aW5nICYmIHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwgJiYgY2hhbmdlU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnNldFRyYW5zZm9ybVNpemUuY2FsbCh0aGlzLCBvRnJhbWUsIG51bGwsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBvRnJhbWUsIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWQsIGZpbGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQob0ZyYW1lLCAndmlkZW8nKTtcbiAgICAgICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luID0gJyc7XG4gICAgfSxcblxuICAgIF91cGRhdGVfdmlkZW9Db3ZlcjogZnVuY3Rpb24gKG9GcmFtZSkge1xuICAgICAgICBpZiAoIW9GcmFtZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgXG4gICAgICAgIGlmICgvXnZpZGVvJC9pLnRlc3Qob0ZyYW1lLm5vZGVOYW1lKSkgdGhpcy5wbHVnaW5zLnZpZGVvLl9zZXRUYWdBdHRycy5jYWxsKHRoaXMsIG9GcmFtZSk7XG4gICAgICAgIGVsc2UgdGhpcy5wbHVnaW5zLnZpZGVvLl9zZXRJZnJhbWVBdHRycy5jYWxsKHRoaXMsIG9GcmFtZSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBleGlzdEVsZW1lbnQgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChvRnJhbWUsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KSB8fCBcbiAgICAgICAgICAgIHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KG9GcmFtZSwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1d5c2l3eWdEaXYoY3VycmVudC5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLnV0aWwpKTtcblxuICAgICAgICBvRnJhbWUgPSBvRnJhbWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICBjb25zdCBjb3ZlciA9IGNvbnRleHRWaWRlby5fY292ZXIgPSB0aGlzLnBsdWdpbnMuY29tcG9uZW50LnNldF9jb3Zlci5jYWxsKHRoaXMsIG9GcmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRleHRWaWRlby5fY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS12aWRlby1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBmaWdjYXB0aW9uID0gZXhpc3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2ZpZ2NhcHRpb24nKTtcbiAgICAgICAgbGV0IGNhcHRpb24gPSBudWxsO1xuICAgICAgICBpZiAoISFmaWdjYXB0aW9uKSB7XG4gICAgICAgICAgICBjYXB0aW9uID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgY2FwdGlvbi5pbm5lckhUTUwgPSBmaWdjYXB0aW9uLmlubmVySFRNTDtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKGZpZ2NhcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IChvRnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLXNpemUnKSB8fCBvRnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbicpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uYXBwbHlTaXplLmNhbGwodGhpcywgc2l6ZVswXSwgc2l6ZVsxXSk7XG5cbiAgICAgICAgaWYgKHRoaXMudXRpbC5pc0Zvcm1hdEVsZW1lbnQoZXhpc3RFbGVtZW50KSAmJiBleGlzdEVsZW1lbnQudGV4dENvbnRlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlSXRlbShjb250ZXh0VmlkZW8uX2VsZW1lbnQpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50ID0gb0ZyYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIWNhcHRpb24pIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjYXB0aW9uLCBjb250YWluZXIubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBvRnJhbWUsIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWQsIG51bGwsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIG9uTW9kaWZ5TW9kZTogZnVuY3Rpb24gKGVsZW1lbnQsIHNpemUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgJ0ZJR1VSRScpO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KTtcbiAgICAgICAgY29udGV4dFZpZGVvLl9hbGlnbiA9IGVsZW1lbnQuc3R5bGUuZmxvYXQgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nKSB8fCAnbm9uZSc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZmxvYXQgPSAnJztcblxuICAgICAgICBpZiAoc2l6ZSkge1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50X3cgPSBzaXplLnc7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnRfaCA9IHNpemUuaDtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudF90ID0gc2l6ZS50O1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50X2wgPSBzaXplLmw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luID0gY29udGV4dFZpZGVvLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykgfHwgY29udGV4dFZpZGVvLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKTtcbiAgICAgICAgaWYgKG9yaWdpbikge1xuICAgICAgICAgICAgb3JpZ2luID0gb3JpZ2luLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX29yaWdpbl93ID0gb3JpZ2luWzBdO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9vcmlnaW5faCA9IG9yaWdpblsxXTtcbiAgICAgICAgfSBlbHNlIGlmIChzaXplKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX29yaWdpbl93ID0gc2l6ZS53O1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9vcmlnaW5faCA9IHNpemUuaDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIG9wZW5Nb2RpZnk6IGZ1bmN0aW9uIChub3RPcGVuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcblxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSkgY29udGV4dFZpZGVvLl9saW5rVmFsdWUgPSBjb250ZXh0VmlkZW8ucHJldmlldy50ZXh0Q29udGVudCA9IGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUudmFsdWUgPSAoY29udGV4dFZpZGVvLl9lbGVtZW50LnNyYyB8fCAoY29udGV4dFZpZGVvLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NvdXJjZScpIHx8ICcnKS5zcmMgfHwgJycpO1xuICAgICAgICBjb250ZXh0VmlkZW8ubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl92aWRlb19yYWRpb1wiXVt2YWx1ZT1cIicgKyBjb250ZXh0VmlkZW8uX2FsaWduICsgJ1wiXScpLmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8uX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRNb2RpZnlJbnB1dFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8sIHRoaXMucGx1Z2lucy52aWRlbyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb250ZXh0VmlkZW8uX3ZpZGVvUmF0aW8gPSB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGNvbnRleHRWaWRlbyk7XG4gICAgICAgICAgICBjb25zdCByYXRpb1NlbGVjdGVkID0gdGhpcy5wbHVnaW5zLnZpZGVvLnNldFZpZGVvUmF0aW9TZWxlY3QuY2FsbCh0aGlzLCB5KTtcbiAgICAgICAgICAgIGlmICghcmF0aW9TZWxlY3RlZCkgY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSA9IGNvbnRleHRWaWRlby5fb25seVBlcmNlbnRhZ2UgPyB0aGlzLnV0aWwuZ2V0TnVtYmVyKHksIDIpIDogeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm90T3BlbikgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ3ZpZGVvJywgdHJ1ZSk7XG4gICAgfSxcbiAgICBcbiAgICBzZXRWaWRlb1JhdGlvU2VsZWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHJhdGlvU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb25zdCByYXRpb09wdGlvbnMgPSBjb250ZXh0VmlkZW8udmlkZW9SYXRpb09wdGlvbi5vcHRpb25zO1xuXG4gICAgICAgIGlmICgvJSQvLnRlc3QodmFsdWUpIHx8IGNvbnRleHRWaWRlby5fb25seVBlcmNlbnRhZ2UpIHZhbHVlID0gKHRoaXMudXRpbC5nZXROdW1iZXIodmFsdWUsIDIpIC8gMTAwKSArICcnO1xuICAgICAgICBlbHNlIGlmICghdGhpcy51dGlsLmlzTnVtYmVyKHZhbHVlKSB8fCAodmFsdWUgKiAxKSA+PSAxKSB2YWx1ZSA9ICcnO1xuXG4gICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhdGlvT3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHJhdGlvT3B0aW9uc1tpXS52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByYXRpb1NlbGVjdGVkID0gcmF0aW9PcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnBsYWNlaG9sZGVyID0gIXZhbHVlID8gJycgOiAodmFsdWUgKiAxMDApICsgJyUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSByYXRpb09wdGlvbnNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByYXRpb1NlbGVjdGVkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBjaGVja0ZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5jaGVja0luZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBbJ2lmcmFtZScsICd2aWRlbyddLCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkLCB0aGlzLnBsdWdpbnMudmlkZW8uX3VwZGF0ZV92aWRlb0NvdmVyLmJpbmQodGhpcyksIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICByZXNldEZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5yZXNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICovXG4gICAgYXBwbHlTaXplOiBmdW5jdGlvbiAodywgaCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG5cbiAgICAgICAgaWYgKCF3KSB3ID0gY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSB8fCB0aGlzLm9wdGlvbnMudmlkZW9XaWR0aDtcbiAgICAgICAgaWYgKCFoKSBoID0gY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSB8fCB0aGlzLm9wdGlvbnMudmlkZW9IZWlnaHQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9vbmx5UGVyY2VudGFnZSB8fCAvJSQvLnRlc3QodykgfHwgIXcpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRQZXJjZW50U2l6ZS5jYWxsKHRoaXMsICh3IHx8ICcxMDAlJyksIChoIHx8ICgvJSQvLnRlc3QoY29udGV4dFZpZGVvLl92aWRlb1JhdGlvKSA/IGNvbnRleHRWaWRlby5fdmlkZW9SYXRpbyA6IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKCF3IHx8IHcgPT09ICdhdXRvJykgJiYgKCFoIHx8IGggPT09ICdhdXRvJykpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRBdXRvU2l6ZS5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldFNpemUuY2FsbCh0aGlzLCB3LCAoaCB8fCBjb250ZXh0VmlkZW8uX3ZpZGVvUmF0aW8gfHwgY29udGV4dFZpZGVvLl9kZWZhdWx0UmF0aW8pLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNpemVSZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2l6ZVJldmVydC5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC52aWRlbyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3LCBoLCBub3RSZXNldFBlcmNlbnRhZ2UsIGRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGNvbnN0IG9ubHlXID0gL14ocnd8bHcpJC8udGVzdChkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBvbmx5SCA9IC9eKHRofGJoKSQvLnRlc3QoZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoIW9ubHlIKSB3ID0gdGhpcy51dGlsLmdldE51bWJlcih3LCAwKTtcbiAgICAgICAgaWYgKCFvbmx5VykgaCA9IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0VmlkZW8uc2l6ZVVuaXQgOiAhaCA/ICcnIDogaDtcblxuICAgICAgICBpZiAoIW9ubHlIKSBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUud2lkdGggPSB3ID8gdyArIGNvbnRleHRWaWRlby5zaXplVW5pdCA6ICcnO1xuICAgICAgICBpZiAoIW9ubHlXKSBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLmhlaWdodCA9IGg7XG5cbiAgICAgICAgaWYgKCFvbmx5SCAmJiAhLyUkLy50ZXN0KHcpKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvbmx5VyAmJiAhLyUkLy50ZXN0KGgpKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm90UmVzZXRQZXJjZW50YWdlKSBjb250ZXh0VmlkZW8uX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBlcmNlbnRhZ2UnKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRBdXRvU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0UGVyY2VudFNpemUuY2FsbCh0aGlzLCAxMDAsIHRoaXMuY29udGV4dC52aWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0T3JpZ2luU2l6ZTogZnVuY3Rpb24gKGRhdGFTaXplKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJyk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnJlc2V0VHJhbnNmb3JtLmNhbGwodGhpcywgY29udGV4dFZpZGVvLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmNhbmNlbFBlcmNlbnRBdHRyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luU2l6ZSA9ICgoZGF0YVNpemUgPyBjb250ZXh0VmlkZW8uX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNpemUnKSA6ICcnKSB8fCBjb250ZXh0VmlkZW8uX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbicpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICBcbiAgICAgICAgaWYgKG9yaWdpblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBvcmlnaW5TaXplWzBdO1xuICAgICAgICAgICAgY29uc3QgaCA9IG9yaWdpblNpemVbMV07XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VmlkZW8uX29ubHlQZXJjZW50YWdlIHx8ICgvJSQvLnRlc3QodykgJiYgKC8lJC8udGVzdChoKSB8fCAhL1xcZC8udGVzdChoKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldFBlcmNlbnRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNhdmUgY3VycmVudCBzaXplXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFBlcmNlbnRTaXplOiBmdW5jdGlvbiAodywgaCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGggPSAhIWggJiYgIS8lJC8udGVzdChoKSAmJiAhdGhpcy51dGlsLmdldE51bWJlcihoLCAwKSA/IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyAnJScgOiBoIDogdGhpcy51dGlsLmlzTnVtYmVyKGgpID8gaCArIGNvbnRleHRWaWRlby5zaXplVW5pdCA6IChoIHx8IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcblxuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IHRoaXMudXRpbC5pc051bWJlcih3KSA/IHcgKyAnJScgOiB3O1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgY29udGV4dFZpZGVvLl9jb3Zlci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29udGV4dFZpZGVvLl9jb3Zlci5zdHlsZS5oZWlnaHQgPSBoO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8uX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLnZpZGVvLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScsIHcgKyAnLCcgKyBoKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBjYW5jZWxQZXJjZW50QXR0cjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIFxuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9ICcnO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnJztcblxuICAgICAgICB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dFZpZGVvLl9jb250YWluZXIsIHRoaXMuY29udGV4dC52aWRlby5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0VmlkZW8uX2NvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBjb250ZXh0VmlkZW8uX2FsaWduKTtcblxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9hbGlnbiA9PT0gJ2NlbnRlcicpIHRoaXMucGx1Z2lucy52aWRlby5zZXRBbGlnbi5jYWxsKHRoaXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRBbGlnbjogZnVuY3Rpb24gKGFsaWduLCBlbGVtZW50LCBjb3ZlciwgY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgXG4gICAgICAgIGlmICghYWxpZ24pIGFsaWduID0gY29udGV4dFZpZGVvLl9hbGlnbjtcbiAgICAgICAgaWYgKCFlbGVtZW50KSBlbGVtZW50ID0gY29udGV4dFZpZGVvLl9lbGVtZW50O1xuICAgICAgICBpZiAoIWNvdmVyKSBjb3ZlciA9IGNvbnRleHRWaWRlby5fY292ZXI7XG4gICAgICAgIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBjb250ZXh0VmlkZW8uX2NvbnRhaW5lcjtcblxuICAgICAgICBpZiAoYWxpZ24gJiYgYWxpZ24gIT09ICdub25lJykge1xuICAgICAgICAgICAgY292ZXIuc3R5bGUubWFyZ2luID0gJ2F1dG8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY292ZXIuc3R5bGUubWFyZ2luID0gJzAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8lJC8udGVzdChlbGVtZW50LnN0eWxlLndpZHRoKSAmJiBhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gY29udGFpbmVyLnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUuaGVpZ2h0ID0gY292ZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgICAgY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9ICEvJSQvLnRlc3QoY292ZXIuc3R5bGUuaGVpZ2h0KSA/IGNvdmVyLnN0eWxlLmhlaWdodCA6IHRoaXMudXRpbC5nZXROdW1iZXIoKHRoaXMudXRpbC5nZXROdW1iZXIoY292ZXIuc3R5bGUuaGVpZ2h0LCAyKSAvIDEwMCkgKiB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvdmVyLnN0eWxlLndpZHRoLCAyKSwgMikgKyAnJSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSAnJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA/IChlbGVtZW50LnN0eWxlLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCkgOiAoZWxlbWVudC5zdHlsZS53aWR0aCB8fCAnMTAwJScpO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IGNvdmVyLnN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy51dGlsLmhhc0NsYXNzKGNvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBhbGlnbikpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250YWluZXIsIGNvbnRleHRWaWRlby5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGFsaWduKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nLCBhbGlnbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSkgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlLnZhbHVlID0gJyc7XG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlKSBjb250ZXh0VmlkZW8uX2xpbmtWYWx1ZSA9IGNvbnRleHRWaWRlby5wcmV2aWV3LnRleHRDb250ZW50ID0gY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZS52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlICYmIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRWaWRlby5fb3JpZ2luX3cgPSB0aGlzLm9wdGlvbnMudmlkZW9XaWR0aDtcbiAgICAgICAgY29udGV4dFZpZGVvLl9vcmlnaW5faCA9IHRoaXMub3B0aW9ucy52aWRlb0hlaWdodDtcbiAgICAgICAgY29udGV4dFZpZGVvLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIl1bdmFsdWU9XCJub25lXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9yZXNpemluZykge1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSA9IHRoaXMub3B0aW9ucy52aWRlb1dpZHRoID09PSBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWCA/ICcnIDogdGhpcy5vcHRpb25zLnZpZGVvV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlID0gdGhpcy5vcHRpb25zLnZpZGVvSGVpZ2h0ID09PSBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWSA/ICcnIDogdGhpcy5vcHRpb25zLnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnByb3BvcnRpb24uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0VmlkZW9SYXRpb1NlbGVjdC5jYWxsKHRoaXMsIGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRpYWxvZyBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZyc7XG5pbXBvcnQgY29tcG9uZW50IGZyb20gJy4uL21vZHVsZXMvY29tcG9uZW50JztcbmltcG9ydCBmaWxlTWFuYWdlciBmcm9tICcuLi9tb2R1bGVzL2ZpbGVNYW5hZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdhdWRpbycsXG4gICAgZGlzcGxheTogJ2RpYWxvZycsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZGlhbG9nLCBjb21wb25lbnQsIGZpbGVNYW5hZ2VyXSk7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gY29udGV4dC5hdWRpbyA9IHtcbiAgICAgICAgICAgIF9pbmZvTGlzdDogW10sIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgX2luZm9JbmRleDogMCwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBfdXBsb2FkRmlsZUxlbmd0aDogMCwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQ6IG51bGwsIC8vIEBPdmVycmlkZSBkaWFsb2cgLy8gVGhpcyBlbGVtZW50IGhhcyBmb2N1cyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLlxuICAgICAgICAgICAgdGFyZ2V0U2VsZWN0OiBudWxsLFxuICAgICAgICAgICAgX29yaWdpbl93OiBjb3JlLm9wdGlvbnMuYXVkaW9XaWR0aCxcbiAgICAgICAgICAgIF9vcmlnaW5faDogY29yZS5vcHRpb25zLmF1ZGlvSGVpZ2h0LFxuICAgICAgICAgICAgX2xpbmtWYWx1ZTogJycsXG4gICAgICAgICAgICAvLyBAcmVxdWlyZSBAT3ZlcnJpZGUgY29tcG9uZW50XG4gICAgICAgICAgICBfZWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgIF9jb3ZlcjogbnVsbCxcbiAgICAgICAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIGRpYWxvZyAqL1xuICAgICAgICBsZXQgYXVkaW9fZGlhbG9nID0gdGhpcy5zZXREaWFsb2coY29yZSk7XG4gICAgICAgIGNvbnRleHRBdWRpby5tb2RhbCA9IGF1ZGlvX2RpYWxvZztcbiAgICAgICAgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlID0gYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfYXVkaW9fZmlsZXMnKTtcbiAgICAgICAgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSA9IGF1ZGlvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtaW5wdXQtdXJsJyk7XG4gICAgICAgIGNvbnRleHRBdWRpby5mb2N1c0VsZW1lbnQgPSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgfHwgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZTtcbiAgICAgICAgY29udGV4dEF1ZGlvLnByZXZpZXcgPSBhdWRpb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWxpbmstcHJldmlldycpO1xuXG4gICAgICAgIC8qKiBjb250cm9sbGVyICovXG4gICAgICAgIGxldCBhdWRpb19jb250cm9sbGVyID0gdGhpcy5zZXRDb250cm9sbGVyKGNvcmUpO1xuICAgICAgICBjb250ZXh0QXVkaW8uY29udHJvbGxlciA9IGF1ZGlvX2NvbnRyb2xsZXI7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpKTtcbiAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZSkgYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3JlbW92ZVNlbGVjdGVkRmlsZXMuYmluZChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUsIGNvbnRleHRBdWRpby5hdWRpb1VybEZpbGUsIGNvbnRleHRBdWRpby5wcmV2aWV3KSk7XG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSkgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2ZpbGVJbnB1dENoYW5nZS5iaW5kKGNvbnRleHRBdWRpbykpO1xuICAgICAgICBhdWRpb19jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrX2NvbnRyb2xsZXIuYmluZChjb3JlKSk7XG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25MaW5rUHJldmlldy5iaW5kKGNvbnRleHRBdWRpby5wcmV2aWV3LCBjb250ZXh0QXVkaW8sIGNvcmUub3B0aW9ucy5saW5rUHJvdG9jb2wpKTtcblxuICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWwuYXBwZW5kQ2hpbGQoYXVkaW9fZGlhbG9nKTtcblxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFwcGVuZENoaWxkKGF1ZGlvX2NvbnRyb2xsZXIpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgYXVkaW9fZGlhbG9nID0gbnVsbCwgYXVkaW9fY29udHJvbGxlciA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBIVE1MIC0gZGlhbG9nICovXG4gICAgc2V0RGlhbG9nOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBjb3JlLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBkaWFsb2cuY2xhc3NOYW1lID0gJ3NlLWRpYWxvZy1jb250ZW50JztcbiAgICAgICAgZGlhbG9nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGxldCBodG1sID0gJycgK1xuICAgICAgICAgICAgJzxmb3JtIG1ldGhvZD1cInBvc3RcIiBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiY2xvc2VcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5jbG9zZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2FuY2VsICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1tb2RhbC10aXRsZVwiPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC50aXRsZSArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWJvZHlcIj4nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5hdWRpb0ZpbGVJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC5maWxlICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybS1maWxlc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBfc2VfYXVkaW9fZmlsZXNcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIicgKyBvcHRpb24uYXVkaW9BY2NlcHQgKyAnXCInICsgKG9wdGlvbi5hdWRpb011bHRpcGxlRmlsZSA/ICcgbXVsdGlwbGU9XCJtdWx0aXBsZVwiJyA6ICcnKSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiZmlsZXNSZW1vdmVcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24gc2UtZmlsZS1yZW1vdmVcIiB0aXRsZT1cIicgKyBsYW5nLmNvbnRyb2xsZXIucmVtb3ZlICsgJ1wiPicgKyBjb3JlLmljb25zLmNhbmNlbCArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24uYXVkaW9VcmxJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC51cmwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBzZS1pbnB1dC11cmxcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIj48L3ByZT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZS1idG4tcHJpbWFyeVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICdcIj48c3Bhbj4nICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJzwvc3Bhbj48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9mb3JtPic7XG5cbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9LFxuXG4gICAgLyoqIEhUTUwgLSBjb250cm9sbGVyICovXG4gICAgc2V0Q29udHJvbGxlcjogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBsaW5rX2J0biA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsaW5rX2J0bi5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLWxpbmsnO1xuICAgICAgICBsaW5rX2J0bi5pbm5lckhUTUwgPSAnJyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWFycm93IHNlLWFycm93LXVwXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cImxpbmstY29udGVudFwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJ1cGRhdGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5lZGl0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuZWRpdCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5kZWxldGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaW5rX2J0bjtcbiAgICB9LFxuXG4gICAgLy8gRGlzYWJsZSB1cmwgaW5wdXQgd2hlbiB1cGxvYWRpbmcgZmlsZXNcbiAgICBfZmlsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0lucHV0RmlsZS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3LnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvVXJsRmlsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBEaXNhYmxlIHVybCBpbnB1dCB3aGVuIHVwbG9hZGluZyBmaWxlc1xuICAgIF9yZW1vdmVTZWxlY3RlZEZpbGVzOiBmdW5jdGlvbiAodXJsSW5wdXQsIHByZXZpZXcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAodXJsSW5wdXQpIHtcbiAgICAgICAgICAgIHVybElucHV0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBjcmVhdGUgbmV3IGF1ZGlvIHRhZ1xuICAgIF9jcmVhdGVBdWRpb1RhZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvQXVkaW8gPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnQVVESU8nKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLl9zZXRUYWdBdHRycy5jYWxsKHRoaXMsIG9BdWRpbyk7XG5cbiAgICAgICAgY29uc3QgdyA9IHRoaXMuY29udGV4dC5hdWRpby5fb3JpZ2luX3c7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLmNvbnRleHQuYXVkaW8uX29yaWdpbl9oO1xuICAgICAgICBvQXVkaW8uc2V0QXR0cmlidXRlKCdvcmlnaW4tc2l6ZScsIHcgKyAnLCcgKyBoKTtcbiAgICAgICAgb0F1ZGlvLnN0eWxlLmNzc1RleHQgPSAodyA/ICgnd2lkdGg6JyArIHcgKyAnOyAnKSA6ICcnKSArIChoID8gKCdoZWlnaHQ6JyArIGggKyAnOycpIDogJycpO1xuXG4gICAgICAgIHJldHVybiBvQXVkaW87XG4gICAgfSxcblxuICAgIF9zZXRUYWdBdHRyczogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRyb2xzJywgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLm9wdGlvbnMuYXVkaW9UYWdBdHRycztcbiAgICAgICAgaWYgKCFhdHRycykgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBhdHRycykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWwuaGFzT3duKGF0dHJzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uTGlua1ByZXZpZXc6IGZ1bmN0aW9uIChjb250ZXh0LCBwcm90b2NvbCwgZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29udGV4dC5fbGlua1ZhbHVlID0gdGhpcy50ZXh0Q29udGVudCA9ICF2YWx1ZSA/ICcnIDogKHByb3RvY29sICYmIHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSAmJiB2YWx1ZS5pbmRleE9mKCcjJykgIT09IDApID8gcHJvdG9jb2wgKyB2YWx1ZSA6IHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSA/ICcvJyArIHZhbHVlIDogdmFsdWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBmaWxlVGFnczogWydhdWRpbyddLFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmUsIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBjYWxsZWQgZnJvbSBjb3JlLnNlbGVjdENvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcbiAgICAgKi9cbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZyBcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCB8fCB0aGlzLmNvbnRleHQuYXVkaW8uX2VsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMudXRpbC5pc0NvbXBvbmVudCkgfHwgZWxlbWVudDtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKSAqIDE7XG4gICAgICAgIGNvbnN0IGZvY3VzRWwgPSAoY29udGFpbmVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgY29udGFpbmVyLm5leHRFbGVtZW50U2libGluZyk7XG5cbiAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuXG4gICAgICAgIGlmIChlbXB0eURpdiAhPT0gdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5ZykgdGhpcy51dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKGVtcHR5RGl2LCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMDsgfSwgbnVsbCk7XG5cbiAgICAgICAgLy8gZm9jdXNcbiAgICAgICAgdGhpcy5mb2N1c0VkZ2UoZm9jdXNFbCk7XG5cbiAgICAgICAgLy8gZmlsZU1hbmFnZXIgZXZlbnRcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmRlbGV0ZUluZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBkYXRhSW5kZXgsIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQpO1xuXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBjaGVja0ZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5jaGVja0luZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBbJ2F1ZGlvJ10sIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQsIHRoaXMucGx1Z2lucy5hdWRpby51cGRhdGVDb3Zlci5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAqL1xuICAgIHJlc2V0RmlsZUluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnJlc2V0SW5mby5jYWxsKHRoaXMsICdhdWRpbycsIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcblxuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUuc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRBdWRpby5fZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0QXVkaW8uX2xpbmtWYWx1ZSA9IGNvbnRleHRBdWRpby5wcmV2aWV3LnRleHRDb250ZW50ID0gY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZS52YWx1ZSA9IGNvbnRleHRBdWRpby5fZWxlbWVudC5zcmM7XG4gICAgICAgICAgICBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlICYmIHRoaXMub3B0aW9ucy5hdWRpb011bHRpcGxlRmlsZSkgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLnJlbW92ZUF0dHJpYnV0ZSgnbXVsdGlwbGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUucmVtb3ZlQXR0cmlidXRlKCdtdWx0aXBsZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnYXVkaW8nLCAnYXVkaW8nID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZSAmJiBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uc3VibWl0QWN0aW9uLmNhbGwodGhpcywgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLmZpbGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSAmJiBjb250ZXh0QXVkaW8uX2xpbmtWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5zZXR1cFVybC5jYWxsKHRoaXMsIGNvbnRleHRBdWRpby5fbGlua1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5hdWRpby5zdWJtaXQuZmFpbF0gY2F1c2UgOiBcIicgKyBlcnJvci5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIHN1Ym1pdEFjdGlvbjogZnVuY3Rpb24gKGZpbGVMaXN0KSB7XG4gICAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQgZmlsZVNpemUgPSAwO1xuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoL2F1ZGlvL2kudGVzdChmaWxlTGlzdFtpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZUxpc3RbaV0pO1xuICAgICAgICAgICAgICAgIGZpbGVTaXplICs9IGZpbGVMaXN0W2ldLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW1pdFNpemUgPSB0aGlzLm9wdGlvbnMuYXVkaW9VcGxvYWRTaXplTGltaXQ7XG4gICAgICAgIGlmIChsaW1pdFNpemUgPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5mb1NpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgYXVkaW9zSW5mbyA9IHRoaXMuY29udGV4dC5hdWRpby5faW5mb0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXVkaW9zSW5mby5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGluZm9TaXplICs9IGF1ZGlvc0luZm9baV0uc2l6ZSAqIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoZmlsZVNpemUgKyBpbmZvU2l6ZSkgPiBsaW1pdFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9ICdbU1VORURJVE9SLmF1ZGlvVXBsb2FkLmZhaWxdIFNpemUgb2YgdXBsb2FkYWJsZSB0b3RhbCBhdWRpb3M6ICcgKyAobGltaXRTaXplLzEwMDApICsgJ0tCJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvbnMub25BdWRpb1VwbG9hZEVycm9yICE9PSAnZnVuY3Rpb24nIHx8IHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWRFcnJvcihlcnIsIHsgJ2xpbWl0U2l6ZSc6IGxpbWl0U2l6ZSwgJ2N1cnJlbnRTaXplJzogaW5mb1NpemUsICd1cGxvYWRTaXplJzogZmlsZVNpemUgfSwgdGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMubm90aWNlT3BlbihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0QXVkaW8gPSB0aGlzLmNvbnRleHQuYXVkaW87XG4gICAgICAgIGNvbnRleHRBdWRpby5fdXBsb2FkRmlsZUxlbmd0aCA9IGZpbGVzLmxlbmd0aDtcblxuICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgICAgaXNVcGRhdGU6IHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwsXG4gICAgICAgICAgICBlbGVtZW50OiBjb250ZXh0QXVkaW8uX2VsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWRCZWZvcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWRCZWZvcmUoZmlsZXMsIGluZm8sIHRoaXMsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgdGhpcy5fdy5BcnJheS5pc0FycmF5KGRhdGEucmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8ucmVnaXN0ZXIuY2FsbCh0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8udXBsb2FkLmNhbGwodGhpcywgaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5sZW5ndGggPiAwKSBmaWxlcyA9IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby51cGxvYWQuY2FsbCh0aGlzLCBpbmZvLCBmaWxlcyk7XG4gICAgfSxcblxuICAgIGVycm9yOiBmdW5jdGlvbiAobWVzc2FnZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkRXJyb3IgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5mdW5jdGlvbnMub25BdWRpb1VwbG9hZEVycm9yKG1lc3NhZ2UsIHJlc3BvbnNlLCB0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMubm90aWNlT3BlbihtZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLnBsdWdpbi5hdWRpby5leGNlcHRpb25dIHJlc3BvbnNlOiAnICsgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgZmlsZXMpIHtcbiAgICAgICAgaWYgKCFmaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZpbGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmVycm9yLmNhbGwodGhpcywgZmlsZXMsIG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXVkaW9VcGxvYWRVcmwgPSB0aGlzLm9wdGlvbnMuYXVkaW9VcGxvYWRVcmw7XG4gICAgICAgIGNvbnN0IGZpbGVzTGVuID0gdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCA/IDEgOiBmaWxlcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gY3JlYXRlIGZvcm1EYXRhXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNMZW47IGkrKykge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlLScgKyBpLCBmaWxlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXJ2ZXIgdXBsb2FkXG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci51cGxvYWQuY2FsbCh0aGlzLCBhdWRpb1VwbG9hZFVybCwgdGhpcy5vcHRpb25zLmF1ZGlvVXBsb2FkSGVhZGVyLCBmb3JtRGF0YSwgdGhpcy5wbHVnaW5zLmF1ZGlvLmNhbGxCYWNrX3VwbG9hZC5iaW5kKHRoaXMsIGluZm8pLCB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkRXJyb3IpO1xuICAgIH0sXG5cbiAgICBjYWxsQmFja191cGxvYWQ6IGZ1bmN0aW9uIChpbmZvLCB4bWxIdHRwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mdW5jdGlvbnMuYXVkaW9VcGxvYWRIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5hdWRpb1VwbG9hZEhhbmRsZXIoeG1sSHR0cCwgaW5mbywgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoeG1sSHR0cC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5lcnJvci5jYWxsKHRoaXMsIHJlc3BvbnNlLmVycm9yTWVzc2FnZSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8ucmVnaXN0ZXIuY2FsbCh0aGlzLCBpbmZvLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVnaXN0ZXI6IGZ1bmN0aW9uIChpbmZvLCByZXNwb25zZSkge1xuICAgICAgICBjb25zdCBmaWxlTGlzdCA9IHJlc3BvbnNlLnJlc3VsdDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZmlsZUxpc3QubGVuZ3RoLCBmaWxlLCBvQXVkaW87IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGluZm8uaXNVcGRhdGUpIG9BdWRpbyA9IGluZm8uZWxlbWVudDtcbiAgICAgICAgICAgIGVsc2Ugb0F1ZGlvID0gdGhpcy5wbHVnaW5zLmF1ZGlvLl9jcmVhdGVBdWRpb1RhZy5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICBmaWxlID0geyBuYW1lOiBmaWxlTGlzdFtpXS5uYW1lLCBzaXplOiBmaWxlTGlzdFtpXS5zaXplIH07XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uY3JlYXRlX2F1ZGlvLmNhbGwodGhpcywgb0F1ZGlvLCBmaWxlTGlzdFtpXS51cmwsIGZpbGUsIGluZm8uaXNVcGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICB9LFxuXG4gICAgc2V0dXBVcmw6IGZ1bmN0aW9uIChzcmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzcmMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uY3JlYXRlX2F1ZGlvLmNhbGwodGhpcywgdGhpcy5wbHVnaW5zLmF1ZGlvLl9jcmVhdGVBdWRpb1RhZy5jYWxsKHRoaXMpLCBzcmMsIG51bGwsIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuYXVkaW8uYXVkaW8uZmFpbF0gY2F1c2UgOiBcIicgKyBlcnJvci5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZV9hdWRpbzogZnVuY3Rpb24gKGVsZW1lbnQsIHNyYywgZmlsZSwgaXNVcGRhdGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuICAgICAgICBcbiAgICAgICAgLy8gY3JlYXRlIG5ldyB0YWdcbiAgICAgICAgaWYgKCFpc1VwZGF0ZSkge1xuICAgICAgICAgICAgZWxlbWVudC5zcmMgPSBzcmM7XG4gICAgICAgICAgICBjb25zdCBjb3ZlciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvdmVyLmNhbGwodGhpcywgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBsdWdpbnMuY29tcG9uZW50LnNldF9jb250YWluZXIuY2FsbCh0aGlzLCBjb3ZlciwgJycpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluc2VydENvbXBvbmVudChjb250YWluZXIsIGZhbHNlLCB0cnVlLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIHVwZGF0ZVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0QXVkaW8uX2VsZW1lbnQpIGVsZW1lbnQgPSBjb250ZXh0QXVkaW8uX2VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LnNyYyAhPT0gc3JjKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zcmMgPSBzcmM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGVsZW1lbnQsICdhdWRpbycpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5zZXRJbmZvLmNhbGwodGhpcywgJ2F1ZGlvJywgZWxlbWVudCwgdGhpcy5mdW5jdGlvbnMub25BdWRpb1VwbG9hZCwgZmlsZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChlbGVtZW50LCAnYXVkaW8nKTtcbiAgICAgICAgaWYgKGlzVXBkYXRlKSB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgfSxcblxuICAgIHVwZGF0ZUNvdmVyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0QXVkaW8gPSB0aGlzLmNvbnRleHQuYXVkaW87XG4gICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5fc2V0VGFnQXR0cnMuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIGZpbmQgY29tcG9uZW50IGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhpc3RFbGVtZW50ID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgdGhpcy51dGlsLmlzTWVkaWFDb21wb25lbnQpIHx8IFxuICAgICAgICAgICAgdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1d5c2l3eWdEaXYoY3VycmVudC5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLnV0aWwpKTtcblxuICAgICAgICAvLyBjbG9uZSBlbGVtZW50XG4gICAgICAgIGNvbnRleHRBdWRpby5fZWxlbWVudCA9IGVsZW1lbnQgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS1hdWRpby1jb250YWluZXInKTtcblxuICAgICAgICBleGlzdEVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGFpbmVyLCBleGlzdEVsZW1lbnQpO1xuICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuc2V0SW5mby5jYWxsKHRoaXMsICdhdWRpbycsIGVsZW1lbnQsIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQsIG51bGwsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBvbk1vZGlmeU1vZGU6IGZ1bmN0aW9uIChzZWxlY3Rpb25UYWcpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5zZXRDb250cm9sbGVyUG9zaXRpb24oY29udGV4dEF1ZGlvLmNvbnRyb2xsZXIsIHNlbGVjdGlvblRhZywgJ2JvdHRvbScsIHtsZWZ0OiAwLCB0b3A6IDB9KTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc09uKGNvbnRleHRBdWRpby5jb250cm9sbGVyLCBzZWxlY3Rpb25UYWcsIHRoaXMucGx1Z2lucy5hdWRpby5vbkNvbnRyb2xsZXJPZmYuYmluZCh0aGlzLCBzZWxlY3Rpb25UYWcpLCAnYXVkaW8nKTtcblxuICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3Moc2VsZWN0aW9uVGFnLCAnYWN0aXZlJyk7XG4gICAgICAgIGNvbnRleHRBdWRpby5fZWxlbWVudCA9IHNlbGVjdGlvblRhZztcbiAgICAgICAgY29udGV4dEF1ZGlvLl9jb3ZlciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHNlbGVjdGlvblRhZywgJ0ZJR1VSRScpO1xuICAgICAgICBjb250ZXh0QXVkaW8uX2NvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHNlbGVjdGlvblRhZywgdGhpcy51dGlsLmlzQ29tcG9uZW50KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBvcGVuTW9kaWZ5OiBmdW5jdGlvbiAobm90T3Blbikge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmF1ZGlvLmF1ZGlvVXJsRmlsZSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuICAgICAgICAgICAgY29udGV4dEF1ZGlvLl9saW5rVmFsdWUgPSBjb250ZXh0QXVkaW8ucHJldmlldy50ZXh0Q29udGVudCA9IGNvbnRleHRBdWRpby5hdWRpb1VybEZpbGUudmFsdWUgPSBjb250ZXh0QXVkaW8uX2VsZW1lbnQuc3JjO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm90T3BlbikgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ2F1ZGlvJywgdHJ1ZSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfY29udHJvbGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICgvdXBkYXRlLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8ub3Blbk1vZGlmeS5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLyoqIGRlbGV0ZSAqL1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmRlc3Ryb3kuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuYXVkaW8uX2VsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuICAgIH0sXG5cbiAgICBvbkNvbnRyb2xsZXJPZmY6IGZ1bmN0aW9uIChzZWxlY3Rpb25UYWcpIHtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHNlbGVjdGlvblRhZywgJ2FjdGl2ZScpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYXVkaW8uY29udHJvbGxlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUpIGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZS52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSkgY29udGV4dEF1ZGlvLl9saW5rVmFsdWUgPSBjb250ZXh0QXVkaW8ucHJldmlldy50ZXh0Q29udGVudCA9IGNvbnRleHRBdWRpby5hdWRpb1VybEZpbGUudmFsdWUgPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZSAmJiBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlKSB7XG4gICAgICAgICAgICBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIGNvbnRleHRBdWRpby5wcmV2aWV3LnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0QXVkaW8uX2VsZW1lbnQgPSBudWxsO1xuICAgIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgZGlhbG9nIGZyb20gJy4uL21vZHVsZXMvZGlhbG9nJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdtYXRoJyxcbiAgICBkaXNwbGF5OiAnZGlhbG9nJyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvcmUuYWRkTW9kdWxlKFtkaWFsb2ddKTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0Lm1hdGggPSB7XG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQ6IG51bGwsIC8vIEBPdmVycmlkZSBkaWFsb2cgLy8gVGhpcyBlbGVtZW50IGhhcyBmb2N1cyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLlxuICAgICAgICAgICAgcHJldmlld0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBmb250U2l6ZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBfbWF0aEV4cDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBtYXRoIGRpYWxvZyAqL1xuICAgICAgICBsZXQgbWF0aF9kaWFsb2cgPSB0aGlzLnNldERpYWxvZyhjb3JlKTtcbiAgICAgICAgY29udGV4dC5tYXRoLm1vZGFsID0gbWF0aF9kaWFsb2c7XG4gICAgICAgIGNvbnRleHQubWF0aC5mb2N1c0VsZW1lbnQgPSBtYXRoX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtbWF0aC1leHAnKTtcbiAgICAgICAgY29udGV4dC5tYXRoLnByZXZpZXdFbGVtZW50ID0gbWF0aF9kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLW1hdGgtcHJldmlldycpO1xuICAgICAgICBjb250ZXh0Lm1hdGguZm9udFNpemVFbGVtZW50ID0gbWF0aF9kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLW1hdGgtc2l6ZScpO1xuICAgICAgICBjb250ZXh0Lm1hdGguZm9jdXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fcmVuZGVyTWF0aEV4cC5iaW5kKGNvcmUsIGNvbnRleHQubWF0aCksIGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5tYXRoLmZvY3VzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9yZW5kZXJNYXRoRXhwLmJpbmQoY29yZSwgY29udGV4dC5tYXRoKSwgZmFsc2UpO1xuICAgICAgICBjb250ZXh0Lm1hdGguZm9udFNpemVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7IHRoaXMuZm9udFNpemUgPSBlLnRhcmdldC52YWx1ZTsgfS5iaW5kKGNvbnRleHQubWF0aC5wcmV2aWV3RWxlbWVudC5zdHlsZSksIGZhbHNlKTtcblxuICAgICAgICAvKiogbWF0aCBjb250cm9sbGVyICovXG4gICAgICAgIGxldCBtYXRoX2NvbnRyb2xsZXIgPSB0aGlzLnNldENvbnRyb2xsZXJfTWF0aEJ1dHRvbihjb3JlKTtcbiAgICAgICAgY29udGV4dC5tYXRoLm1hdGhDb250cm9sbGVyID0gbWF0aF9jb250cm9sbGVyO1xuICAgICAgICBjb250ZXh0Lm1hdGguX21hdGhFeHAgPSBudWxsO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIG1hdGhfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpLCBmYWxzZSk7XG4gICAgICAgIG1hdGhfY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja19tYXRoQ29udHJvbGxlci5iaW5kKGNvcmUpKTtcblxuICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWwuYXBwZW5kQ2hpbGQobWF0aF9kaWFsb2cpO1xuICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQobWF0aF9jb250cm9sbGVyKTtcblxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIG1hdGhfZGlhbG9nID0gbnVsbCwgbWF0aF9jb250cm9sbGVyID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqIGRpYWxvZyAqL1xuICAgIHNldERpYWxvZzogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgZGlhbG9nID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAnc2UtZGlhbG9nLWNvbnRlbnQnO1xuICAgICAgICBkaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9ICcnICtcbiAgICAgICAgJzxmb3JtPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImNsb3NlXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guY2xvc2UgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2FuY2VsICtcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtbW9kYWwtdGl0bGVcIj4nICsgbGFuZy5kaWFsb2dCb3gubWF0aEJveC50aXRsZSArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1ib2R5XCI+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5tYXRoQm94LmlucHV0TGFiZWwgKyAnICg8YSBocmVmPVwiaHR0cHM6Ly9rYXRleC5vcmcvZG9jcy9zdXBwb3J0ZWQuaHRtbFwiIHRhcmdldD1cIl9ibGFua1wiPkthVGVYPC9hPik8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHRleHRhcmVhIGNsYXNzPVwic2UtaW5wdXQtZm9ybSBzZS1tYXRoLWV4cFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5tYXRoQm94LmZvbnRTaXplTGFiZWwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxzZWxlY3QgY2xhc3M9XCJzZS1pbnB1dC1zZWxlY3Qgc2UtbWF0aC1zaXplXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT1cIjFlbVwiPjE8L29wdGlvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPVwiMS41ZW1cIj4xLjU8L29wdGlvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPVwiMmVtXCI+Mjwvb3B0aW9uPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9XCIyLjVlbVwiPjIuNTwvb3B0aW9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9zZWxlY3Q+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gubWF0aEJveC5wcmV2aWV3TGFiZWwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxwIGNsYXNzPVwic2UtbWF0aC1wcmV2aWV3XCI+PC9wPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNlLWJ0bi1wcmltYXJ5XCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJ1wiPjxzcGFuPicgKyBsYW5nLmRpYWxvZ0JveC5zdWJtaXRCdXR0b24gKyAnPC9zcGFuPjwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPC9mb3JtPic7XG5cbiAgICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9LFxuXG4gICAgLyoqIG1vZGlmeSBjb250cm9sbGVyIGJ1dHRvbiAqL1xuICAgIHNldENvbnRyb2xsZXJfTWF0aEJ1dHRvbjogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgbWF0aF9idG4gPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgbWF0aF9idG4uY2xhc3NOYW1lID0gJ3NlLWNvbnRyb2xsZXIgc2UtY29udHJvbGxlci1saW5rJztcbiAgICAgICAgbWF0aF9idG4uaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWFycm93IHNlLWFycm93LXVwXCI+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibGluay1jb250ZW50XCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWJ0bi1ncm91cFwiPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJ1cGRhdGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICBjb3JlLmljb25zLmVkaXQgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLmVkaXQgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImRlbGV0ZVwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuZGVsZXRlICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJyc7XG5cbiAgICAgICAgcmV0dXJuIG1hdGhfYnRuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9wZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ21hdGgnLCAnbWF0aCcgPT09IHRoaXMuY3VycmVudENvbnRyb2xsZXJOYW1lKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmUgLSBtYW5hZ2VkVGFnc0luZm9cbiAgICAgKi9cbiAgICBtYW5hZ2VkVGFnczogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAna2F0ZXgnLFxuICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwJykpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBkb20gPSB0aGlzLl9kLmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRoaXMucGx1Z2lucy5tYXRoLl9yZW5kZXJlci5jYWxsKHRoaXMsIHRoaXMudXRpbC5IVE1MRGVjb2RlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1leHAnKSkpKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGRvbS5xdWVyeVNlbGVjdG9yKCcua2F0ZXgnKS5pbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIF9yZW5kZXJlcjogZnVuY3Rpb24gKGV4cCkge1xuICAgICAgICBjb25zdCBrYXRleCA9IHRoaXMub3B0aW9ucy5rYXRleDtcbiAgICAgICAgcmV0dXJuIGthdGV4LnNyYy5yZW5kZXJUb1N0cmluZyhleHAsIGthdGV4Lm9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBfcmVuZGVyTWF0aEV4cDogZnVuY3Rpb24gKGNvbnRleHRNYXRoLCBlKSB7XG4gICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LmlubmVySFRNTCA9IHRoaXMucGx1Z2lucy5tYXRoLl9yZW5kZXJlci5jYWxsKHRoaXMsIGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuXG4gICAgc3VibWl0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1pdEFjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQubWF0aC5mb2N1c0VsZW1lbnQudmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0TWF0aCA9IHRoaXMuY29udGV4dC5tYXRoO1xuICAgICAgICAgICAgY29uc3QgbWF0aEV4cCA9IGNvbnRleHRNYXRoLmZvY3VzRWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGthdGV4RWwgPSBjb250ZXh0TWF0aC5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcua2F0ZXgnKTtcblxuICAgICAgICAgICAgaWYgKCFrYXRleEVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBrYXRleEVsLmNsYXNzTmFtZSA9ICdfX3NlX19rYXRleCAnICsga2F0ZXhFbC5jbGFzc05hbWU7XG4gICAgICAgICAgICBrYXRleEVsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xuICAgICAgICAgICAga2F0ZXhFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwJywgdGhpcy51dGlsLkhUTUxFbmNvZGVyKG1hdGhFeHApKTtcbiAgICAgICAgICAgIGthdGV4RWwuc2V0QXR0cmlidXRlKCdkYXRhLWZvbnQtc2l6ZScsIGNvbnRleHRNYXRoLmZvbnRTaXplRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICBrYXRleEVsLnN0eWxlLmZvbnRTaXplID0gY29udGV4dE1hdGguZm9udFNpemVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvRm9ybWF0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzWzBdLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb0Zvcm1hdC5hcHBlbmRDaGlsZChrYXRleEVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluc2VydE5vZGUob0Zvcm1hdCwgbnVsbCwgdHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5zZXJ0Tm9kZShrYXRleEVsLCBudWxsLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0gdGhpcy51dGlsLmNyZWF0ZVRleHROb2RlKHRoaXMudXRpbC56ZXJvV2lkdGhTcGFjZSk7XG4gICAgICAgICAgICAgICAga2F0ZXhFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eSwga2F0ZXhFbC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShrYXRleEVsLCAwLCBrYXRleEVsLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChjb250ZXh0TWF0aC5fbWF0aEV4cCwgJy5rYXRleCcpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGthdGV4RWwsIGNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGthdGV4RWwsIDAsIGthdGV4RWwsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250ZXh0TWF0aC5mb2N1c0VsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGNvbnRleHRNYXRoLmZvbnRTaXplRWxlbWVudC52YWx1ZSA9ICcxZW0nO1xuICAgICAgICAgICAgY29udGV4dE1hdGgucHJldmlld0VsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMWVtJztcbiAgICAgICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc3VibWl0QWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXJBcnJheS5pbmRleE9mKHRoaXMuY29udGV4dC5tYXRoLm1hdGhDb250cm9sbGVyKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWV4cCcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyQXJyYXkuaW5kZXhPZih0aGlzLmNvbnRleHQubWF0aC5tYXRoQ29udHJvbGxlcikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShlbGVtZW50LCAwLCBlbGVtZW50LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubWF0aC5jYWxsX2NvbnRyb2xsZXIuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLm1hdGguaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dE1hdGggPSB0aGlzLmNvbnRleHQubWF0aDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0TWF0aC5fbWF0aEV4cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cCA9IHRoaXMudXRpbC5IVE1MRGVjb2Rlcihjb250ZXh0TWF0aC5fbWF0aEV4cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gY29udGV4dE1hdGguX21hdGhFeHAuZ2V0QXR0cmlidXRlKCdkYXRhLWZvbnQtc2l6ZScpIHx8ICcxZW0nO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRleHRNYXRoLmZvY3VzRWxlbWVudC52YWx1ZSA9IGV4cDtcbiAgICAgICAgICAgICAgICBjb250ZXh0TWF0aC5mb250U2l6ZUVsZW1lbnQudmFsdWUgPSBmb250U2l6ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0TWF0aC5wcmV2aWV3RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnBsdWdpbnMubWF0aC5fcmVuZGVyZXIuY2FsbCh0aGlzLCBleHApO1xuICAgICAgICAgICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsbF9jb250cm9sbGVyOiBmdW5jdGlvbiAobWF0aFRhZykge1xuICAgICAgICB0aGlzLmNvbnRleHQubWF0aC5fbWF0aEV4cCA9IG1hdGhUYWc7XG4gICAgICAgIGNvbnN0IG1hdGhCdG4gPSB0aGlzLmNvbnRleHQubWF0aC5tYXRoQ29udHJvbGxlcjtcblxuICAgICAgICB0aGlzLnNldENvbnRyb2xsZXJQb3NpdGlvbihtYXRoQnRuLCBtYXRoVGFnLCAnYm90dG9tJywge2xlZnQ6IDAsIHRvcDogMH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24obWF0aEJ0biwgbWF0aFRhZywgJ21hdGgnKTtcbiAgICB9LFxuXG4gICAgb25DbGlja19tYXRoQ29udHJvbGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKSB8fCBlLnRhcmdldC5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoL3VwZGF0ZS8udGVzdChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1hdGguZm9jdXNFbGVtZW50LnZhbHVlID0gdGhpcy51dGlsLkhUTUxEZWNvZGVyKHRoaXMuY29udGV4dC5tYXRoLl9tYXRoRXhwLmdldEF0dHJpYnV0ZSgnZGF0YS1leHAnKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnbWF0aCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyoqIGRlbGV0ZSAqL1xuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGhpcy5jb250ZXh0Lm1hdGguX21hdGhFeHApO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1hdGguX21hdGhFeHAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dE1hdGggPSB0aGlzLmNvbnRleHQubWF0aDtcbiAgICAgICAgY29udGV4dE1hdGgubWF0aENvbnRyb2xsZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29udGV4dE1hdGguX21hdGhFeHAgPSBudWxsO1xuICAgICAgICBjb250ZXh0TWF0aC5mb2N1c0VsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dE1hdGgucHJldmlld0VsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gY29tbWFuZFxuaW1wb3J0IGJsb2NrcXVvdGUgZnJvbSAnLi9jb21tYW5kL2Jsb2NrcXVvdGUnO1xuXG4vLyBzdWJtZW51XG5pbXBvcnQgYWxpZ24gZnJvbSAnLi9zdWJtZW51L2FsaWduJztcbmltcG9ydCBmb250IGZyb20gJy4vc3VibWVudS9mb250JztcbmltcG9ydCBmb250U2l6ZSBmcm9tICcuL3N1Ym1lbnUvZm9udFNpemUnO1xuaW1wb3J0IGZvbnRDb2xvciBmcm9tICcuL3N1Ym1lbnUvZm9udENvbG9yJztcbmltcG9ydCBoaWxpdGVDb2xvciBmcm9tICcuL3N1Ym1lbnUvaGlsaXRlQ29sb3InO1xuaW1wb3J0IGhvcml6b250YWxSdWxlIGZyb20gJy4vc3VibWVudS9ob3Jpem9udGFsUnVsZSc7XG5pbXBvcnQgbGlzdCBmcm9tICcuL3N1Ym1lbnUvbGlzdCc7XG5pbXBvcnQgdGFibGUgZnJvbSAnLi9zdWJtZW51L3RhYmxlJztcbmltcG9ydCBmb3JtYXRCbG9jayBmcm9tICcuL3N1Ym1lbnUvZm9ybWF0QmxvY2snO1xuaW1wb3J0IGxpbmVIZWlnaHQgZnJvbSAnLi9zdWJtZW51L2xpbmVIZWlnaHQnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJy4vc3VibWVudS90ZW1wbGF0ZSc7XG5pbXBvcnQgcGFyYWdyYXBoU3R5bGUgZnJvbSAnLi9zdWJtZW51L3BhcmFncmFwaFN0eWxlJztcbmltcG9ydCB0ZXh0U3R5bGUgZnJvbSAnLi9zdWJtZW51L3RleHRTdHlsZSc7XG5cbi8vIGRpYWxvZ1xuaW1wb3J0IGxpbmsgZnJvbSAnLi9kaWFsb2cvbGluayc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi9kaWFsb2cvaW1hZ2UnO1xuaW1wb3J0IHZpZGVvIGZyb20gJy4vZGlhbG9nL3ZpZGVvJztcbmltcG9ydCBhdWRpbyBmcm9tICcuL2RpYWxvZy9hdWRpbyc7XG5pbXBvcnQgbWF0aCBmcm9tICcuL2RpYWxvZy9tYXRoJztcblxuLy8gZmlsZSBicm93c2VyXG5pbXBvcnQgaW1hZ2VHYWxsZXJ5IGZyb20gJy4vZmlsZUJyb3dzZXIvaW1hZ2VHYWxsZXJ5JztcblxuZXhwb3J0IHsgYmxvY2txdW90ZSwgYWxpZ24sIGZvbnQsIGZvbnRTaXplLCBmb250Q29sb3IsIGhpbGl0ZUNvbG9yLCBob3Jpem9udGFsUnVsZSwgbGlzdCwgdGFibGUsIGZvcm1hdEJsb2NrLCBsaW5lSGVpZ2h0LCB0ZW1wbGF0ZSwgcGFyYWdyYXBoU3R5bGUsIHRleHRTdHlsZSwgbGluaywgaW1hZ2UsIHZpZGVvLCBhdWRpbywgbWF0aCwgaW1hZ2VHYWxsZXJ5IH07XG5leHBvcnQgZGVmYXVsdCB7IGJsb2NrcXVvdGUsIGFsaWduLCBmb250LCBmb250U2l6ZSwgZm9udENvbG9yLCBoaWxpdGVDb2xvciwgaG9yaXpvbnRhbFJ1bGUsIGxpc3QsIHRhYmxlLCBmb3JtYXRCbG9jaywgbGluZUhlaWdodCwgdGVtcGxhdGUsIHBhcmFncmFwaFN0eWxlLCB0ZXh0U3R5bGUsIGxpbmssIGltYWdlLCB2aWRlbywgYXVkaW8sIG1hdGgsIGltYWdlR2FsbGVyeSB9O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnYmxvY2txdW90ZScsXG4gICAgZGlzcGxheTogJ2NvbW1hbmQnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5ibG9ja3F1b3RlID0ge1xuICAgICAgICAgICAgdGFyZ2V0QnV0dG9uOiB0YXJnZXRFbGVtZW50LFxuICAgICAgICAgICAgdGFnOiBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnQkxPQ0tRVU9URScpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRleHQuYmxvY2txdW90ZS50YXJnZXRCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIGlmICgvYmxvY2txdW90ZS9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0aGlzLmNvbnRleHQuYmxvY2txdW90ZS50YXJnZXRCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCbG9ja3F1b3RlID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCksICdibG9ja3F1b3RlJyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCbG9ja3F1b3RlKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50QmxvY2txdW90ZSwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSYW5nZUZvcm1hdEVsZW1lbnQodGhpcy5jb250ZXh0LmJsb2NrcXVvdGUudGFnLmNsb25lTm9kZShmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxufTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdhbGlnbicsXG4gICAgZGlzcGxheTogJ3N1Ym1lbnUnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmFsaWduID0ge1xuICAgICAgICAgICAgdGFyZ2V0QnV0dG9uOiB0YXJnZXRFbGVtZW50LFxuICAgICAgICAgICAgX2FsaWduTGlzdDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRBbGlnbjogJycsXG4gICAgICAgICAgICBkZWZhdWx0RGlyOiBjb3JlLm9wdGlvbnMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JywgXG4gICAgICAgICAgICBpY29uczoge1xuICAgICAgICAgICAgICAgIGp1c3RpZnk6IGljb25zLmFsaWduX2p1c3RpZnksXG4gICAgICAgICAgICAgICAgbGVmdDogaWNvbnMuYWxpZ25fbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodDogaWNvbnMuYWxpZ25fcmlnaHQsXG4gICAgICAgICAgICAgICAgY2VudGVyOiBpY29ucy5hbGlnbl9jZW50ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQuYWxpZ24uX2FsaWduTGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICBjb25zdCBsZWZ0RGlyID0gY29yZS5jb250ZXh0LmFsaWduLmRlZmF1bHREaXIgPT09ICdsZWZ0JztcblxuICAgICAgICBjb25zdCBsZWZ0TWVudSA9ICc8bGk+JyArXG4gICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS1idG4tYWxpZ25cIiBkYXRhLWNvbW1hbmQ9XCJqdXN0aWZ5bGVmdFwiIGRhdGEtdmFsdWU9XCJsZWZ0XCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLmFsaWduTGVmdCArICdcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1saXN0LWljb25cIj4nICsgaWNvbnMuYWxpZ25fbGVmdCArICc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnbkxlZnQgK1xuICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAnPC9saT4nO1xuXG4gICAgICAgIGNvbnN0IHJpZ2h0TWVudSA9ICc8bGk+JyArXG4gICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS1idG4tYWxpZ25cIiBkYXRhLWNvbW1hbmQ9XCJqdXN0aWZ5cmlnaHRcIiBkYXRhLXZhbHVlPVwicmlnaHRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25SaWdodCArICdcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1saXN0LWljb25cIj4nICsgaWNvbnMuYWxpZ25fcmlnaHQgKyc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnblJpZ2h0ICtcbiAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvbGk+JztcblxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXIgc2UtbGlzdC1hbGlnbic7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgKGxlZnREaXIgPyBsZWZ0TWVudSA6IHJpZ2h0TWVudSkgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3Qgc2UtYnRuLWFsaWduXCIgZGF0YS1jb21tYW5kPVwianVzdGlmeWNlbnRlclwiIGRhdGEtdmFsdWU9XCJjZW50ZXJcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25DZW50ZXIgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtbGlzdC1pY29uXCI+JyArIGljb25zLmFsaWduX2NlbnRlciArICc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnbkNlbnRlciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAobGVmdERpcj8gcmlnaHRNZW51IDogbGVmdE1lbnUpICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0IHNlLWJ0bi1hbGlnblwiIGRhdGEtY29tbWFuZD1cImp1c3RpZnlmdWxsXCIgZGF0YS12YWx1ZT1cImp1c3RpZnlcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25KdXN0aWZ5ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLWxpc3QtaWNvblwiPicgKyBpY29ucy5hbGlnbl9qdXN0aWZ5ICsgJzwvc3Bhbj4nICsgbGFuZy50b29sYmFyLmFsaWduSnVzdGlmeSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBhbGlnbkNvbnRleHQgPSB0aGlzLmNvbnRleHQuYWxpZ247XG4gICAgICAgIGNvbnN0IHRhcmdldEJ1dHRvbiA9IGFsaWduQ29udGV4dC50YXJnZXRCdXR0b247XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldEJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VFbGVtZW50KHRhcmdldCwgYWxpZ25Db250ZXh0Lmljb25zW2FsaWduQ29udGV4dC5kZWZhdWx0RGlyXSk7XG4gICAgICAgICAgICB0YXJnZXRCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZvY3VzJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51dGlsLmlzRm9ybWF0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dEFsaWduID0gZWxlbWVudC5zdHlsZS50ZXh0QWxpZ247XG4gICAgICAgICAgICBpZiAodGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZUVsZW1lbnQodGFyZ2V0LCBhbGlnbkNvbnRleHQuaWNvbnNbdGV4dEFsaWduXSB8fCBhbGlnbkNvbnRleHQuaWNvbnNbYWxpZ25Db250ZXh0LmRlZmF1bHREaXJdKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWZvY3VzJywgdGV4dEFsaWduKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhbGlnbkNvbnRleHQgPSB0aGlzLmNvbnRleHQuYWxpZ247XG4gICAgICAgIGNvbnN0IGFsaWduTGlzdCA9IGFsaWduQ29udGV4dC5fYWxpZ25MaXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50QWxpZ24gPSBhbGlnbkNvbnRleHQudGFyZ2V0QnV0dG9uLmdldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cycpIHx8IGFsaWduQ29udGV4dC5kZWZhdWx0RGlyO1xuXG4gICAgICAgIGlmIChjdXJyZW50QWxpZ24gIT09IGFsaWduQ29udGV4dC5jdXJyZW50QWxpZ24pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhbGlnbkxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEFsaWduID09PSBhbGlnbkxpc3RbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGFsaWduTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhhbGlnbkxpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFsaWduQ29udGV4dC5jdXJyZW50QWxpZ24gPSBjdXJyZW50QWxpZ247XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICghdmFsdWUgJiYgIS9VTC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHREaXIgPSB0aGlzLmNvbnRleHQuYWxpZ24uZGVmYXVsdERpcjtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1zdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5zZXRTdHlsZShzZWxlY3RlZEZvcm1zdHNbaV0sICd0ZXh0QWxpZ24nLCAodmFsdWUgPT09IGRlZmF1bHREaXIgPyAnJyA6IHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVmZmVjdE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICBcbiAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ZvbnQnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQuZm9udCA9IHtcbiAgICAgICAgICAgIHRhcmdldFRleHQ6IHRhcmdldEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnR4dCcpLFxuICAgICAgICAgICAgdGFyZ2V0VG9vbHRpcDogdGFyZ2V0RWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5zZS10b29sdGlwLXRleHQnKSxcbiAgICAgICAgICAgIF9mb250TGlzdDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRGb250OiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJy5zZS1saXN0LWlubmVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2t1cC5iaW5kKGNvcmUpKTtcblxuICAgICAgICBjb250ZXh0LmZvbnQuX2ZvbnRMaXN0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yQWxsKCd1bCBsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllciBzZS1saXN0LWZvbnQtZmFtaWx5JztcblxuICAgICAgICBsZXQgZm9udCwgdGV4dCwgaSwgbGVuO1xuICAgICAgICBsZXQgZm9udExpc3QgPSAhb3B0aW9uLmZvbnQgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICdBcmlhbCcsXG4gICAgICAgICAgICAgICAgJ0NvbWljIFNhbnMgTVMnLFxuICAgICAgICAgICAgICAgICdDb3VyaWVyIE5ldycsXG4gICAgICAgICAgICAgICAgJ0ltcGFjdCcsXG4gICAgICAgICAgICAgICAgJ0dlb3JnaWEnLFxuICAgICAgICAgICAgICAgICd0YWhvbWEnLFxuICAgICAgICAgICAgICAgICdUcmVidWNoZXQgTVMnLFxuICAgICAgICAgICAgICAgICdWZXJkYW5hJ1xuICAgICAgICAgICAgXSA6IG9wdGlvbi5mb250O1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRlZmF1bHRfdmFsdWUgc2UtYnRuLWxpc3RcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuZGVmYXVsdCArICdcIj4oJyArIGxhbmcudG9vbGJhci5kZWZhdWx0ICsgJyk8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGZvbnRMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb250ID0gZm9udExpc3RbaV07XG4gICAgICAgICAgICB0ZXh0ID0gZm9udC5zcGxpdCgnLCcpWzBdO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIGZvbnQgKyAnXCIgZGF0YS10eHQ9XCInICsgdGV4dCArICdcIiB0aXRsZT1cIicgKyB0ZXh0ICsgJ1wiIHN0eWxlPVwiZm9udC1mYW1pbHk6JyArIGZvbnQgKyAnO1wiPicgKyB0ZXh0ICsgJzwvYnV0dG9uPjwvbGk+JztcbiAgICAgICAgfVxuICAgICAgICBsaXN0ICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRleHQuZm9udC50YXJnZXRUZXh0O1xuICAgICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5jb250ZXh0LmZvbnQudGFyZ2V0VG9vbHRpcDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmxhbmcudG9vbGJhci5mb250O1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0YXJnZXQsIGZvbnQpO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0b29sdGlwLCBmb250KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnN0eWxlICYmIGVsZW1lbnQuc3R5bGUuZm9udEZhbWlseS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RGb250ID0gZWxlbWVudC5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoL1tcIiddL2csJycpO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0YXJnZXQsIHNlbGVjdEZvbnQpO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0b29sdGlwLCBzZWxlY3RGb250KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBmb250Q29udGV4dCA9IHRoaXMuY29udGV4dC5mb250O1xuICAgICAgICBjb25zdCBmb250TGlzdCA9IGZvbnRDb250ZXh0Ll9mb250TGlzdDtcbiAgICAgICAgY29uc3QgY3VycmVudEZvbnQgPSBmb250Q29udGV4dC50YXJnZXRUZXh0LnRleHRDb250ZW50O1xuXG4gICAgICAgIGlmIChjdXJyZW50Rm9udCAhPT0gZm9udENvbnRleHQuY3VycmVudEZvbnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmb250TGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Rm9udCA9PT0gZm9udExpc3RbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGZvbnRMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGZvbnRMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb250Q29udGV4dC5jdXJyZW50Rm9udCA9IGN1cnJlbnRGb250O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHBpY2t1cDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCEvXkJVVFRPTiQvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcbiAgICAgICAgICAgIG5ld05vZGUuc3R5bGUuZm9udEZhbWlseSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKG5ld05vZGUsIFsnZm9udC1mYW1pbHknXSwgbnVsbCwgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobnVsbCwgWydmb250LWZhbWlseSddLCBbJ3NwYW4nXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdmb250U2l6ZScsXG4gICAgZGlzcGxheTogJ3N1Ym1lbnUnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5mb250U2l6ZSA9IHtcbiAgICAgICAgICAgIHRhcmdldFRleHQ6IHRhcmdldEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnR4dCcpLFxuICAgICAgICAgICAgX3NpemVMaXN0OiBudWxsLFxuICAgICAgICAgICAgY3VycmVudFNpemU6ICcnXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXG4gICAgICAgIGxldCBsaXN0RGl2ID0gdGhpcy5zZXRTdWJtZW51KGNvcmUpO1xuICAgICAgICBsZXQgbGlzdFVsID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCd1bCcpO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIGxpc3RVbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja3VwLmJpbmQoY29yZSkpO1xuICAgICAgICBjb250ZXh0LmZvbnRTaXplLl9zaXplTGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllciBzZS1saXN0LWZvbnQtc2l6ZSc7XG5cbiAgICAgICAgY29uc3Qgc2l6ZUxpc3QgPSAhb3B0aW9uLmZvbnRTaXplID8gWzgsIDksIDEwLCAxMSwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzYsIDQ4LCA3Ml0gOiBvcHRpb24uZm9udFNpemU7XG5cbiAgICAgICAgbGV0IGxpc3QgPSAnPGRpdiBjbGFzcz1cInNlLWxpc3QtaW5uZXJcIj4nICtcbiAgICAgICAgICAgICAgICAnPHVsIGNsYXNzPVwic2UtbGlzdC1iYXNpY1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGVmYXVsdF92YWx1ZSBzZS1idG4tbGlzdFwiIHRpdGxlPVwiJyArIGxhbmcudG9vbGJhci5kZWZhdWx0ICsgJ1wiPignICsgbGFuZy50b29sYmFyLmRlZmF1bHQgKyAnKTwvYnV0dG9uPjwvbGk+JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHVuaXQgPSBvcHRpb24uZm9udFNpemVVbml0LCBsZW4gPSBzaXplTGlzdC5sZW5ndGgsIHNpemU7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgc2l6ZSA9IHNpemVMaXN0W2ldO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIHNpemUgKyB1bml0ICsgJ1wiIHRpdGxlPVwiJyArIHNpemUgKyB1bml0ICsgJ1wiIHN0eWxlPVwiZm9udC1zaXplOicgKyBzaXplICsgdW5pdCArICc7XCI+JyArIHNpemUgKyAnPC9idXR0b24+PC9saT4nO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QgKz0gJzwvdWw+PC9kaXY+JztcblxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9IGxpc3Q7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgY29yZVxuICAgICAqL1xuICAgIGFjdGl2ZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRoaXMuY29udGV4dC5mb250U2l6ZS50YXJnZXRUZXh0LCB0aGlzLmxhbmcudG9vbGJhci5mb250U2l6ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zdHlsZSAmJiBlbGVtZW50LnN0eWxlLmZvbnRTaXplLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VUeHQodGhpcy5jb250ZXh0LmZvbnRTaXplLnRhcmdldFRleHQsIGVsZW1lbnQuc3R5bGUuZm9udFNpemUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplQ29udGV4dCA9IHRoaXMuY29udGV4dC5mb250U2l6ZTtcbiAgICAgICAgY29uc3Qgc2l6ZUxpc3QgPSBmb250U2l6ZUNvbnRleHQuX3NpemVMaXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50U2l6ZSA9IGZvbnRTaXplQ29udGV4dC50YXJnZXRUZXh0LnRleHRDb250ZW50O1xuXG4gICAgICAgIGlmIChjdXJyZW50U2l6ZSAhPT0gZm9udFNpemVDb250ZXh0LmN1cnJlbnRTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2l6ZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPT09IHNpemVMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9udFNpemVDb250ZXh0LmN1cnJlbnRTaXplID0gY3VycmVudFNpemU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIS9eQlVUVE9OJC9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdTUEFOJyk7XG4gICAgICAgICAgICBuZXdOb2RlLnN0eWxlLmZvbnRTaXplID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobmV3Tm9kZSwgWydmb250LXNpemUnXSwgbnVsbCwgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobnVsbCwgWydmb250LXNpemUnXSwgWydzcGFuJ10sIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2hvcml6b250YWxSdWxlJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdERpdi5xdWVyeVNlbGVjdG9yKCd1bCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5ob3Jpem9udGFsUnVsZVBpY2suYmluZChjb3JlKSk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGxpc3REaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtbGluZSc7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0IGJ0bl9saW5lXCIgZGF0YS1jb21tYW5kPVwiaG9yaXpvbnRhbFJ1bGVcIiBkYXRhLXZhbHVlPVwic29saWRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuaHJfc29saWQgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociBzdHlsZT1cImJvcmRlci13aWR0aDogMXB4IDAgMDsgYm9yZGVyLXN0eWxlOiBzb2xpZCBub25lIG5vbmU7IGJvcmRlci1jb2xvcjogYmxhY2s7IGJvcmRlci1pbWFnZTogaW5pdGlhbDsgaGVpZ2h0OiAxcHg7XCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvbGk+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGk+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBidG5fbGluZVwiIGRhdGEtY29tbWFuZD1cImhvcml6b250YWxSdWxlXCIgZGF0YS12YWx1ZT1cImRvdHRlZFwiIHRpdGxlPVwiJyArIGxhbmcudG9vbGJhci5ocl9kb3R0ZWQgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociBzdHlsZT1cImJvcmRlci13aWR0aDogMXB4IDAgMDsgYm9yZGVyLXN0eWxlOiBkb3R0ZWQgbm9uZSBub25lOyBib3JkZXItY29sb3I6IGJsYWNrOyBib3JkZXItaW1hZ2U6IGluaXRpYWw7IGhlaWdodDogMXB4O1wiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3QgYnRuX2xpbmVcIiBkYXRhLWNvbW1hbmQ9XCJob3Jpem9udGFsUnVsZVwiIGRhdGEtdmFsdWU9XCJkYXNoZWRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuaHJfZGFzaGVkICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aHIgc3R5bGU9XCJib3JkZXItd2lkdGg6IDFweCAwIDA7IGJvcmRlci1zdHlsZTogZGFzaGVkIG5vbmUgbm9uZTsgYm9yZGVyLWNvbG9yOiBibGFjazsgYm9yZGVyLWltYWdlOiBpbml0aWFsOyBoZWlnaHQ6IDFweDtcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9saT4nICtcbiAgICAgICAgICAgICAgICAnPC91bD4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xuICAgIH0sXG5cbiAgICBhcHBlbmRIcjogZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgICBjb25zdCBvSHIgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnSFInKTtcbiAgICAgICAgb0hyLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRDb21wb25lbnQob0hyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBob3Jpem9udGFsUnVsZVBpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoIXZhbHVlICYmICEvVUwvaS50ZXN0KHRhcmdldC50YWdOYW1lKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyk7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBvTm9kZSA9IHRoaXMucGx1Z2lucy5ob3Jpem9udGFsUnVsZS5hcHBlbmRIci5jYWxsKHRoaXMsICdfX3NlX18nICsgdmFsdWUpO1xuICAgICAgICBpZiAob05vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uob05vZGUsIDAsIG9Ob2RlLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2xpc3QnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQubGlzdCA9IHtcbiAgICAgICAgICAgIHRhcmdldEJ1dHRvbjogdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgICAgIF9saXN0OiBudWxsLFxuICAgICAgICAgICAgY3VycmVudExpc3Q6ICcnLFxuICAgICAgICAgICAgaWNvbnM6IHtcbiAgICAgICAgICAgICAgICBidWxsZXRzOiBjb3JlLmljb25zLmxpc3RfYnVsbGV0cyxcbiAgICAgICAgICAgICAgICBudW1iZXI6IGNvcmUuaWNvbnMubGlzdF9udW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQubGlzdC5fbGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXInO1xuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9ICcnICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPicgK1xuICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS10b29sdGlwXCIgZGF0YS1jb21tYW5kPVwiT0xcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIub3JkZXJMaXN0ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5saXN0X251bWJlciArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3Qgc2UtdG9vbHRpcFwiIGRhdGEtY29tbWFuZD1cIlVMXCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLnVub3JkZXJMaXN0ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5saXN0X2J1bGxldHMgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+PC9saT4nICtcbiAgICAgICAgICAgICAgICAnPC91bD4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xuICAgIH0sXG5cbiAgICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmVcbiAgICAgKi9cbiAgICBhY3RpdmU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuY29udGV4dC5saXN0LnRhcmdldEJ1dHRvbjtcbiAgICAgICAgY29uc3QgaWNvbiA9IGJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZm9jdXMnKTtcbiAgICAgICAgICAgIHV0aWwuY2hhbmdlRWxlbWVudChpY29uLCB0aGlzLmNvbnRleHQubGlzdC5pY29ucy5udW1iZXIpO1xuICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhidXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmlzTGlzdChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cycsIG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoYnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICBpZiAoL1VML2kudGVzdChub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZUVsZW1lbnQoaWNvbiwgdGhpcy5jb250ZXh0Lmxpc3QuaWNvbnMuYnVsbGV0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlRWxlbWVudChpY29uLCB0aGlzLmNvbnRleHQubGlzdC5pY29ucy5udW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbGlzdENvbnRleHQgPSB0aGlzLmNvbnRleHQubGlzdDtcbiAgICAgICAgY29uc3QgbGlzdCA9IGxpc3RDb250ZXh0Ll9saXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IGxpc3RDb250ZXh0LnRhcmdldEJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtZm9jdXMnKSB8fCAnJztcblxuICAgICAgICBpZiAoY3VycmVudExpc3QgIT09IGxpc3RDb250ZXh0LmN1cnJlbnRMaXN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGlzdCA9PT0gbGlzdFtpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhsaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGxpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpc3RDb250ZXh0LmN1cnJlbnRMaXN0ID0gY3VycmVudExpc3Q7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZWRpdExpc3Q6IGZ1bmN0aW9uIChjb21tYW5kLCBzZWxlY3RlZENlbGxzLCBkZXRhY2gpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRGb3JtYXRzID0gIXNlbGVjdGVkQ2VsbHMgPyB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHNBbmRDb21wb25lbnRzKGZhbHNlKSA6IHNlbGVjdGVkQ2VsbHM7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENlbGxzKSByZXR1cm47XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2VfYWRkTGluZShyYW5nZSwgbnVsbCk7XG4gICAgICAgICAgICBzZWxlY3RlZEZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHNBbmRDb21wb25lbnRzKGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XG4gICAgICAgIHV0aWwuc29ydEJ5RGVwdGgoc2VsZWN0ZWRGb3JtYXRzLCB0cnVlKTtcblxuICAgICAgICAvLyBtZXJnZVxuICAgICAgICBsZXQgZmlyc3RTZWwgPSBzZWxlY3RlZEZvcm1hdHNbMF07XG4gICAgICAgIGxldCBsYXN0U2VsID0gc2VsZWN0ZWRGb3JtYXRzW3NlbGVjdGVkRm9ybWF0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHRvcEVsID0gKHV0aWwuaXNMaXN0Q2VsbChmaXJzdFNlbCkgfHwgdXRpbC5pc0NvbXBvbmVudChmaXJzdFNlbCkpICYmICFmaXJzdFNlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID8gZmlyc3RTZWwucGFyZW50Tm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIDogZmlyc3RTZWwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgbGV0IGJvdHRvbUVsID0gKHV0aWwuaXNMaXN0Q2VsbChsYXN0U2VsKSB8fCB1dGlsLmlzQ29tcG9uZW50KGxhc3RTZWwpKSAmJiAhbGFzdFNlbC5uZXh0RWxlbWVudFNpYmxpbmcgPyBsYXN0U2VsLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nIDogbGFzdFNlbC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luUmFuZ2UgPSB7XG4gICAgICAgICAgICBzYzogcmFuZ2Uuc3RhcnRDb250YWluZXIsXG4gICAgICAgICAgICBzbzogcmFuZ2Uuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICBlYzogcmFuZ2UuZW5kQ29udGFpbmVyLFxuICAgICAgICAgICAgZW86IHJhbmdlLmVuZE9mZnNldFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBpc1JlbW92ZSA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkRm9ybWF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKCF1dGlsLmlzTGlzdCh1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sIGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGN1cnJlbnQpICYmIGN1cnJlbnQgIT09IHNlbGVjdGVkRm9ybWF0c1tpXTtcbiAgICAgICAgICAgIH0uYmluZCh1dGlsKSkpKSB7XG4gICAgICAgICAgICAgICAgaXNSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlbW92ZSAmJiAoIXRvcEVsIHx8IChmaXJzdFNlbC50YWdOYW1lICE9PSB0b3BFbC50YWdOYW1lIHx8IGNvbW1hbmQgIT09IHRvcEVsLnRhZ05hbWUudG9VcHBlckNhc2UoKSkpICYmICghYm90dG9tRWwgfHwgKGxhc3RTZWwudGFnTmFtZSAhPT0gYm90dG9tRWwudGFnTmFtZSB8fCBjb21tYW5kICE9PSBib3R0b21FbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkpKSkge1xuICAgICAgICAgICAgaWYgKGRldGFjaCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0c1tqXS5jb250YWlucyhzZWxlY3RlZEZvcm1hdHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtYXRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07IGxlbi0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Rm9ybWF0ID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZmlyc3RTZWwpO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsID0gY3VycmVudEZvcm1hdCAmJiBjdXJyZW50Rm9ybWF0LnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2VBcnIsIHRlbXBMaXN0O1xuICAgICAgICAgICAgY29uc3QgcGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgfS5iaW5kKHV0aWwpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWNhbmNlbCkgdGVtcExpc3QgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoY29tbWFuZCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoLCByLCBvOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzW2ldLCBwYXNzQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIW8gfHwgIXV0aWwuaXNMaXN0KG8pKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGlmICghcikge1xuICAgICAgICAgICAgICAgICAgICByID0gbztcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIgPSB7cjogciwgZjogW3V0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpXX07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhY2ggJiYgdXRpbC5pc0xpc3RDZWxsKG8ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGlzdC5fZGV0YWNoTmVzdGVkLmNhbGwodGhpcywgcmFuZ2VBcnIuZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlQXJyLmZbMF0ucGFyZW50Tm9kZSwgcmFuZ2VBcnIuZiwgdGVtcExpc3QsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHNlbGVjdGVkRm9ybWF0c1tpXS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWwpIHRlbXBMaXN0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByID0gbztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQXJyID0ge3I6IHIsIGY6IFt1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzW2ldLCAnTEknKV19O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIuZi5wdXNoKHV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWNoICYmIHV0aWwuaXNMaXN0Q2VsbChvLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGlzdC5fZGV0YWNoTmVzdGVkLmNhbGwodGhpcywgcmFuZ2VBcnIuZik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUFyci5mWzBdLnBhcmVudE5vZGUsIHJhbmdlQXJyLmYsIHRlbXBMaXN0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0b3BFbFBhcmVudCA9IHRvcEVsID8gdG9wRWwucGFyZW50Tm9kZSA6IHRvcEVsO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tRWxQYXJlbnQgPSBib3R0b21FbCA/IGJvdHRvbUVsLnBhcmVudE5vZGUgOiBib3R0b21FbDtcbiAgICAgICAgICAgIHRvcEVsID0gdG9wRWxQYXJlbnQgJiYgIXV0aWwuaXNXeXNpd3lnRGl2KHRvcEVsUGFyZW50KSAmJiB0b3BFbFBhcmVudC5ub2RlTmFtZSA9PT0gY29tbWFuZCA/IHRvcEVsUGFyZW50IDogdG9wRWw7XG4gICAgICAgICAgICBib3R0b21FbCA9IGJvdHRvbUVsUGFyZW50ICYmICF1dGlsLmlzV3lzaXd5Z0Rpdihib3R0b21FbFBhcmVudCkgJiYgYm90dG9tRWxQYXJlbnQubm9kZU5hbWUgPT09IGNvbW1hbmQgPyBib3R0b21FbFBhcmVudCA6IGJvdHRvbUVsO1xuXG4gICAgICAgICAgICBjb25zdCBtZXJnZVRvcCA9IHRvcEVsICYmIHRvcEVsLnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBjb25zdCBtZXJnZUJvdHRvbSA9IGJvdHRvbUVsICYmIGJvdHRvbUVsLnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbWVyZ2VUb3AgPyB0b3BFbCA6IHV0aWwuY3JlYXRlRWxlbWVudChjb21tYW5kKTtcbiAgICAgICAgICAgIGxldCBmaXJzdExpc3QgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGxhc3RMaXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0b3BOdW1iZXIgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGJvdHRvbU51bWJlciA9IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0NvbXBvbmVudChjdXJyZW50KSAmJiAhdGhpcy5pc0xpc3QoY3VycmVudCk7XG4gICAgICAgICAgICB9LmJpbmQodXRpbCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoLCBuZXdDZWxsLCBmVGFnLCBpc0NlbGwsIG5leHQsIG9yaWdpblBhcmVudCwgbmV4dFBhcmVudCwgcGFyZW50VGFnLCBzaWJsaW5nVGFnLCByYW5nZVRhZzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZlRhZyA9IHNlbGVjdGVkRm9ybWF0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZlRhZy5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhdXRpbC5faXNJZ25vcmVOb2RlQ2hhbmdlKGZUYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShmVGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBzZWxlY3RlZEZvcm1hdHNbaSArIDFdO1xuICAgICAgICAgICAgICAgIG9yaWdpblBhcmVudCA9IGZUYWcucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBuZXh0UGFyZW50ID0gbmV4dCA/IG5leHQucGFyZW50Tm9kZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaXNDZWxsID0gdXRpbC5pc0xpc3RDZWxsKGZUYWcpO1xuICAgICAgICAgICAgICAgIHJhbmdlVGFnID0gdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChvcmlnaW5QYXJlbnQpID8gb3JpZ2luUGFyZW50IDogbnVsbDtcbiAgICAgICAgICAgICAgICBwYXJlbnRUYWcgPSBpc0NlbGwgJiYgIXV0aWwuaXNXeXNpd3lnRGl2KG9yaWdpblBhcmVudCkgPyBvcmlnaW5QYXJlbnQucGFyZW50Tm9kZSA6IG9yaWdpblBhcmVudDtcbiAgICAgICAgICAgICAgICBzaWJsaW5nVGFnID0gaXNDZWxsICYmICF1dGlsLmlzV3lzaXd5Z0RpdihvcmlnaW5QYXJlbnQpID8gKCFuZXh0IHx8IHV0aWwuaXNMaXN0Q2VsbChwYXJlbnRUYWcpKSA/IG9yaWdpblBhcmVudCA6IG9yaWdpblBhcmVudC5uZXh0U2libGluZyA6IGZUYWcubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICBuZXdDZWxsID0gdXRpbC5jcmVhdGVFbGVtZW50KCdMSScpO1xuICAgICAgICAgICAgICAgIHV0aWwuY29weUZvcm1hdEF0dHJpYnV0ZXMobmV3Q2VsbCwgZlRhZyk7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNDb21wb25lbnQoZlRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIUiA9IC9eSFIkL2kudGVzdChmVGFnLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0hSKSBuZXdDZWxsLmlubmVySFRNTCA9ICc8YnI+JztcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbC5pbm5lckhUTUwgKz0gZlRhZy5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hSKSBuZXdDZWxsLmlubmVySFRNTCArPSAnPGJyPic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZkNoaWxkcmVuID0gZlRhZy5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZkNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLmFwcGVuZENoaWxkKGZDaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChuZXdDZWxsKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmV4dCkgbGFzdExpc3QgPSBsaXN0O1xuICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCBwYXJlbnRUYWcgIT09IG5leHRQYXJlbnQgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChzaWJsaW5nVGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0TGlzdCkgZmlyc3RMaXN0ID0gbGlzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghbWVyZ2VUb3AgfHwgIW5leHQgfHwgcGFyZW50VGFnICE9PSBuZXh0UGFyZW50KSAmJiAhKG5leHQgJiYgdXRpbC5pc0xpc3QobmV4dFBhcmVudCkgJiYgbmV4dFBhcmVudCA9PT0gb3JpZ2luUGFyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QucGFyZW50Tm9kZSAhPT0gcGFyZW50VGFnKSBwYXJlbnRUYWcuaW5zZXJ0QmVmb3JlKGxpc3QsIHNpYmxpbmdUYWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGZUYWcpO1xuICAgICAgICAgICAgICAgIGlmIChtZXJnZVRvcCAmJiB0b3BOdW1iZXIgPT09IG51bGwpIHRvcE51bWJlciA9IGxpc3QuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiAodXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQobmV4dFBhcmVudCwgcGFzc0NvbXBvbmVudCkgIT09IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KG9yaWdpblBhcmVudCwgcGFzc0NvbXBvbmVudCkgfHwgKHV0aWwuaXNMaXN0KG5leHRQYXJlbnQpICYmIHV0aWwuaXNMaXN0KG9yaWdpblBhcmVudCkgJiYgdXRpbC5nZXRFbGVtZW50RGVwdGgobmV4dFBhcmVudCkgIT09IHV0aWwuZ2V0RWxlbWVudERlcHRoKG9yaWdpblBhcmVudCkpKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyYW5nZVRhZyAmJiByYW5nZVRhZy5jaGlsZHJlbi5sZW5ndGggPT09IDApIHV0aWwucmVtb3ZlSXRlbShyYW5nZVRhZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b3BOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBmaXJzdExpc3QgPSBmaXJzdExpc3QuY2hpbGRyZW5bdG9wTnVtYmVyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1lcmdlQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTnVtYmVyID0gbGlzdC5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGxpc3QuaW5uZXJIVE1MICs9IGJvdHRvbUVsLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICBsYXN0TGlzdCA9IGxpc3QuY2hpbGRyZW5bYm90dG9tTnVtYmVyXTtcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oYm90dG9tRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVmZmVjdE5vZGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gb3JpZ2luUmFuZ2U7XG4gICAgfSxcblxuICAgIF9kZXRhY2hOZXN0ZWQ6IGZ1bmN0aW9uIChjZWxscykge1xuICAgICAgICBjb25zdCBmaXJzdCA9IGNlbGxzWzBdO1xuICAgICAgICBjb25zdCBsYXN0ID0gY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IG5leHQgPSBsYXN0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgY29uc3Qgb3JpZ2luTGlzdCA9IGZpcnN0LnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBvcmlnaW5MaXN0LnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gb3JpZ2luTGlzdC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNlbGxzW2NdLCBzaWJsaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIG9yaWdpbkxpc3QuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3TGlzdCA9IG9yaWdpbkxpc3QuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JpZ2luTGlzdC5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnV0aWwuZ2V0UG9zaXRpb25JbmRleChuZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlbltpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBuZXdMaXN0LmFwcGVuZENoaWxkKGNoaWxkcmVuW2luZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0LmFwcGVuZENoaWxkKG5ld0xpc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yaWdpbkxpc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB0aGlzLnV0aWwucmVtb3ZlSXRlbShvcmlnaW5MaXN0KTtcbiAgICAgICAgdGhpcy51dGlsLm1lcmdlU2FtZVRhZ3MocGFyZW50Tm9kZSk7XG5cbiAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMudXRpbC5nZXRFZGdlQ2hpbGROb2RlcyhmaXJzdCwgbGFzdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNjOiBmaXJzdC5wYXJlbnROb2RlLFxuICAgICAgICAgICAgc2M6IGVkZ2Uuc2MsXG4gICAgICAgICAgICBlYzogZWRnZS5lY1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBlZGl0SW5zaWRlTGlzdDogZnVuY3Rpb24gKHJlbW92ZSwgc2VsZWN0ZWRDZWxscykge1xuICAgICAgICBzZWxlY3RlZENlbGxzID0gIXNlbGVjdGVkQ2VsbHMgPyB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzLmlzTGlzdENlbGwoZWwpOyB9LmJpbmQodGhpcy51dGlsKSkgOiBzZWxlY3RlZENlbGxzO1xuICAgICAgICBjb25zdCBjZWxsc0xlbiA9IHNlbGVjdGVkQ2VsbHMubGVuZ3RoO1xuICAgICAgICBpZiAoY2VsbHNMZW4gPT09IDAgfHwgKCFyZW1vdmUgJiYgKCF0aGlzLnV0aWwuaXNMaXN0Q2VsbChzZWxlY3RlZENlbGxzWzBdLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpICYmICF0aGlzLnV0aWwuaXNMaXN0Q2VsbChzZWxlY3RlZENlbGxzW2NlbGxzTGVuIC0gMV0ubmV4dEVsZW1lbnRTaWJsaW5nKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNjOiBzZWxlY3RlZENlbGxzWzBdLFxuICAgICAgICAgICAgICAgIHNvOiAwLFxuICAgICAgICAgICAgICAgIGVjOiBzZWxlY3RlZENlbGxzW2NlbGxzTGVuIC0gMV0sXG4gICAgICAgICAgICAgICAgZW86IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luTGlzdCA9IHNlbGVjdGVkQ2VsbHNbMF0ucGFyZW50Tm9kZTtcbiAgICAgICAgbGV0IGxhc3RDZWxsID0gc2VsZWN0ZWRDZWxsc1tjZWxsc0xlbiAtIDFdO1xuICAgICAgICBsZXQgcmFuZ2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5MaXN0ICE9PSBsYXN0Q2VsbC5wYXJlbnROb2RlICYmIHRoaXMudXRpbC5pc0xpc3QobGFzdENlbGwucGFyZW50Tm9kZS5wYXJlbnROb2RlKSAmJiBsYXN0Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2VsbCA9IGxhc3RDZWxsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAobGFzdENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5wdXNoKGxhc3RDZWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdENlbGwgPSBsYXN0Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnBsdWdpbnMubGlzdC5lZGl0TGlzdC5jYWxsKHRoaXMsIG9yaWdpbkxpc3Qubm9kZU5hbWUudG9VcHBlckNhc2UoKSwgc2VsZWN0ZWRDZWxscywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW5uZXJMaXN0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQob3JpZ2luTGlzdC5ub2RlTmFtZSk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHNlbGVjdGVkQ2VsbHNbMF0ucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbGFzdENlbGwubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVBhdGggPSB7IHM6IG51bGwsIGU6IG51bGwsIHNsOiBvcmlnaW5MaXN0LCBlbDogb3JpZ2luTGlzdCB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2VsbHNMZW4sIGM7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGMgPSBzZWxlY3RlZENlbGxzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjLnBhcmVudE5vZGUgIT09IG9yaWdpbkxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmxpc3QuX2luc2llZExpc3QuY2FsbCh0aGlzLCBvcmlnaW5MaXN0LCBpbm5lckxpc3QsIHByZXYsIG5leHQsIG5vZGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGlzdCA9IGMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJMaXN0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQob3JpZ2luTGlzdC5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByZXYgPSBjLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGMubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlubmVyTGlzdC5hcHBlbmRDaGlsZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmxpc3QuX2luc2llZExpc3QuY2FsbCh0aGlzLCBvcmlnaW5MaXN0LCBpbm5lckxpc3QsIHByZXYsIG5leHQsIG5vZGVQYXRoKTtcblxuICAgICAgICAgICAgY29uc3Qgc2MgPSB0aGlzLnV0aWwuZ2V0Tm9kZUZyb21QYXRoKG5vZGVQYXRoLnMsIG5vZGVQYXRoLnNsKTtcbiAgICAgICAgICAgIGNvbnN0IGVjID0gdGhpcy51dGlsLmdldE5vZGVGcm9tUGF0aChub2RlUGF0aC5lLCBub2RlUGF0aC5lbCk7XG4gICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzYzogc2MsXG4gICAgICAgICAgICAgICAgc286IDAsXG4gICAgICAgICAgICAgICAgZWM6IGVjLFxuICAgICAgICAgICAgICAgIGVvOiBlYy50ZXh0Q29udGVudC5sZW5ndGhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfSxcblxuICAgIF9pbnNpZWRMaXN0OiBmdW5jdGlvbiAob3JpZ2luTGlzdCwgaW5uZXJMaXN0LCBwcmV2LCBuZXh0LCBub2RlUGF0aCkge1xuICAgICAgICBsZXQgaW5zZXJ0UHJldiA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcmV2ICYmIGlubmVyTGlzdC50YWdOYW1lID09PSBwcmV2LnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gaW5uZXJMaXN0LmNoaWxkcmVuO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgcHJldi5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlubmVyTGlzdCA9IHByZXY7XG4gICAgICAgICAgICBpbnNlcnRQcmV2ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIGlubmVyTGlzdC50YWdOYW1lID09PSBuZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgIGlubmVyTGlzdC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIG5leHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0KTtcbiAgICAgICAgICAgIG5leHQgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpbnNlcnRQcmV2KSB7XG4gICAgICAgICAgICBpZiAodGhpcy51dGlsLmlzTGlzdENlbGwocHJldikpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5MaXN0ID0gcHJldjtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JpZ2luTGlzdC5pbnNlcnRCZWZvcmUoaW5uZXJMaXN0LCBuZXh0KTtcblxuICAgICAgICAgICAgaWYgKCFub2RlUGF0aC5zKSB7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGgucyA9IHRoaXMudXRpbC5nZXROb2RlUGF0aChpbm5lckxpc3QuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RDaGlsZCwgb3JpZ2luTGlzdCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGguc2wgPSBvcmlnaW5MaXN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzbFBhdGggPSBvcmlnaW5MaXN0LmNvbnRhaW5zKG5vZGVQYXRoLnNsKSA/IHRoaXMudXRpbC5nZXROb2RlUGF0aChub2RlUGF0aC5zbCwgb3JpZ2luTGlzdCkgOiBudWxsO1xuICAgICAgICAgICAgbm9kZVBhdGguZSA9IHRoaXMudXRpbC5nZXROb2RlUGF0aChpbm5lckxpc3QubGFzdEVsZW1lbnRDaGlsZC5maXJzdENoaWxkLCBvcmlnaW5MaXN0LCBudWxsKTtcbiAgICAgICAgICAgIG5vZGVQYXRoLmVsID0gb3JpZ2luTGlzdDtcblxuICAgICAgICAgICAgdGhpcy51dGlsLm1lcmdlU2FtZVRhZ3Mob3JpZ2luTGlzdCwgW25vZGVQYXRoLnMsIG5vZGVQYXRoLmUsIHNsUGF0aF0sIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMudXRpbC5tZXJnZU5lc3RlZFRhZ3Mob3JpZ2luTGlzdCk7XG4gICAgICAgICAgICBpZiAoc2xQYXRoKSBub2RlUGF0aC5zbCA9IHRoaXMudXRpbC5nZXROb2RlRnJvbVBhdGgoc2xQYXRoLCBvcmlnaW5MaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbm5lckxpc3Q7XG4gICAgfSxcblxuICAgIHBpY2t1cDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgbGV0IGNvbW1hbmQgPSAnJztcblxuICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9eVUwkL2kudGVzdCh0YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnBsdWdpbnMubGlzdC5lZGl0TGlzdC5jYWxsKHRoaXMsIGNvbW1hbmQsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJhbmdlKSB0aGlzLnNldFJhbmdlKHJhbmdlLnNjLCByYW5nZS5zbywgcmFuZ2UuZWMsIHJhbmdlLmVvKTtcblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICd0YWJsZScsXHJcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcclxuICAgICAgICBsZXQgY29udGV4dFRhYmxlID0gY29udGV4dC50YWJsZSA9IHtcclxuICAgICAgICAgICAgX2VsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ZEVsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ckVsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ckVsZW1lbnRzOiBudWxsLFxyXG4gICAgICAgICAgICBfdGFibGVYWTogW10sXHJcbiAgICAgICAgICAgIF9tYXhXaWR0aDogdHJ1ZSxcclxuICAgICAgICAgICAgX2ZpeGVkQ29sdW1uOiBmYWxzZSxcclxuICAgICAgICAgICAgX3J0bDogY29yZS5vcHRpb25zLnJ0bCxcclxuICAgICAgICAgICAgY2VsbENvbnRyb2xsZXJUb3A6IGNvcmUub3B0aW9ucy50YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24gPT09ICd0b3AnLFxyXG4gICAgICAgICAgICByZXNpemVUZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBoZWFkZXJCdXR0b246IG51bGwsXHJcbiAgICAgICAgICAgIG1lcmdlQnV0dG9uOiBudWxsLFxyXG4gICAgICAgICAgICBzcGxpdEJ1dHRvbjogbnVsbCxcclxuICAgICAgICAgICAgc3BsaXRNZW51OiBudWxsLFxyXG4gICAgICAgICAgICBtYXhUZXh0OiBjb3JlLmxhbmcuY29udHJvbGxlci5tYXhTaXplLFxyXG4gICAgICAgICAgICBtaW5UZXh0OiBjb3JlLmxhbmcuY29udHJvbGxlci5taW5TaXplLFxyXG4gICAgICAgICAgICBfcGh5c2ljYWxfY2VsbENudDogMCxcclxuICAgICAgICAgICAgX2xvZ2ljYWxfY2VsbENudDogMCxcclxuICAgICAgICAgICAgX3Jvd0NudDogMCxcclxuICAgICAgICAgICAgX3Jvd0luZGV4OiAwLFxyXG4gICAgICAgICAgICBfcGh5c2ljYWxfY2VsbEluZGV4OiAwLFxyXG4gICAgICAgICAgICBfbG9naWNhbF9jZWxsSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIF9jdXJyZW50X2NvbFNwYW46IDAsXHJcbiAgICAgICAgICAgIF9jdXJyZW50X3Jvd1NwYW46IDAsXHJcbiAgICAgICAgICAgIGljb25zOiB7XHJcbiAgICAgICAgICAgICAgICBleHBhbnNpb246IGNvcmUuaWNvbnMuZXhwYW5zaW9uLFxyXG4gICAgICAgICAgICAgICAgcmVkdWN0aW9uOiBjb3JlLmljb25zLnJlZHVjdGlvblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXHJcbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XHJcbiAgICAgICAgbGV0IHRhYmxlUGlja2VyID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtY29udHJvbGxlci10YWJsZS1waWNrZXInKTtcclxuXHJcbiAgICAgICAgY29udGV4dFRhYmxlLnRhYmxlSGlnaGxpZ2h0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtdGFibGUtc2l6ZS1oaWdobGlnaHRlZCcpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZVVuSGlnaGxpZ2h0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtdGFibGUtc2l6ZS11bmhpZ2hsaWdodGVkJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLnRhYmxlRGlzcGxheSA9IGxpc3REaXYucXVlcnlTZWxlY3RvcignLnNlLXRhYmxlLXNpemUtZGlzcGxheScpO1xyXG4gICAgICAgIGlmIChjb3JlLm9wdGlvbnMucnRsKSBjb250ZXh0VGFibGUudGFibGVIaWdobGlnaHQuc3R5bGUubGVmdCA9ICgxMCAqIDE4IC0gMTMpICsgJ3B4JztcclxuXHJcbiAgICAgICAgLyoqIHNldCB0YWJsZSBjb250cm9sbGVyICovXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udHJvbGxlciA9IHRoaXMuc2V0Q29udHJvbGxlcl90YWJsZShjb3JlKTtcclxuICAgICAgICBjb250ZXh0VGFibGUudGFibGVDb250cm9sbGVyID0gdGFibGVDb250cm9sbGVyO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5yZXNpemVCdXR0b24gPSB0YWJsZUNvbnRyb2xsZXIucXVlcnlTZWxlY3RvcignLl9zZV90YWJsZV9yZXNpemUnKTtcclxuICAgICAgICBjb250ZXh0VGFibGUucmVzaXplVGV4dCA9IHRhYmxlQ29udHJvbGxlci5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX3Jlc2l6ZSA+IHNwYW4gPiBzcGFuJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdGFibGVfZml4ZWRfY29sdW1uJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLmhlYWRlckJ1dHRvbiA9IHRhYmxlQ29udHJvbGxlci5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2hlYWRlcicpO1xyXG5cclxuICAgICAgICAvKiogc2V0IHJlc2l6aW5nICovXHJcbiAgICAgICAgbGV0IHJlc2l6ZURpdiA9IHRoaXMuc2V0Q29udHJvbGxlcl90YWJsZUVkaXRvcihjb3JlLCBjb250ZXh0VGFibGUuY2VsbENvbnRyb2xsZXJUb3ApO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5yZXNpemVEaXYgPSByZXNpemVEaXY7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLnNwbGl0TWVudSA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuc2UtYnRuLWdyb3VwLXN1YicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5tZXJnZUJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX21lcmdlX2J1dHRvbicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5zcGxpdEJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX3NwbGl0X2J1dHRvbicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dBYm92ZUJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2luc2VydF9yb3dfYScpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dCZWxvd0J1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2luc2VydF9yb3dfYicpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgdGFibGVQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZV90YWJsZVBpY2tlci5iaW5kKGNvcmUsIGNvbnRleHRUYWJsZSkpO1xyXG4gICAgICAgIHRhYmxlUGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hcHBlbmRUYWJsZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICByZXNpemVEaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfdGFibGVDb250cm9sbGVyLmJpbmQoY29yZSkpO1xyXG4gICAgICAgIHRhYmxlQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja190YWJsZUNvbnRyb2xsZXIuYmluZChjb3JlKSk7XHJcblxyXG4gICAgICAgIC8qKiBhcHBlbmQgdGFyZ2V0IGJ1dHRvbiBtZW51ICovXHJcbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xyXG5cclxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQocmVzaXplRGl2KTtcclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQodGFibGVDb250cm9sbGVyKTtcclxuXHJcbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xyXG4gICAgICAgIGxpc3REaXYgPSBudWxsLCB0YWJsZVBpY2tlciA9IG51bGwsIHJlc2l6ZURpdiA9IG51bGwsIHRhYmxlQ29udHJvbGxlciA9IG51bGwsIGNvbnRleHRUYWJsZSA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XHJcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLXNlbGVjdG9yLXRhYmxlJztcclxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9ICcnICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS10YWJsZS1zaXplXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXRhYmxlLXNpemUtcGlja2VyIHNlLWNvbnRyb2xsZXItdGFibGUtcGlja2VyXCI+PC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXRhYmxlLXNpemUtaGlnaGxpZ2h0ZWRcIj48L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtdGFibGUtc2l6ZS11bmhpZ2hsaWdodGVkXCI+PC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS10YWJsZS1zaXplLWRpc3BsYXlcIj4xIHggMTwvZGl2Pic7XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRDb250cm9sbGVyX3RhYmxlOiBmdW5jdGlvbiAoY29yZSkge1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUmVzaXplID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICB0YWJsZVJlc2l6ZS5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLXRhYmxlJztcclxuICAgICAgICB0YWJsZVJlc2l6ZS5pbm5lckhUTUwgPSAnJyArXHJcbiAgICAgICAgICAgICc8ZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1idG4tZ3JvdXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwicmVzaXplXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfcmVzaXplXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmV4cGFuc2lvbiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIubWF4U2l6ZSArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwibGF5b3V0XCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfZml4ZWRfY29sdW1uXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmZpeGVkX2NvbHVtbl93aWR0aCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuZml4ZWRDb2x1bW5XaWR0aCArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiaGVhZGVyXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfaGVhZGVyXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLnRhYmxlX2hlYWRlciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIudGFibGVIZWFkZXIgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cInJlbW92ZVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuZGVsZXRlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVSZXNpemU7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldENvbnRyb2xsZXJfdGFibGVFZGl0b3I6IGZ1bmN0aW9uIChjb3JlLCBjZWxsQ29udHJvbGxlclRvcCkge1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUmVzaXplID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICB0YWJsZVJlc2l6ZS5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLXRhYmxlLWNlbGwnO1xyXG4gICAgICAgIHRhYmxlUmVzaXplLmlubmVySFRNTCA9IChjZWxsQ29udHJvbGxlclRvcCA/ICcnIDogJzxkaXYgY2xhc3M9XCJzZS1hcnJvdyBzZS1hcnJvdy11cFwiPjwvZGl2PicpICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1idG4tZ3JvdXBcIj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwicm93XCIgZGF0YS1vcHRpb249XCJ1cFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXAgX3NlX3RhYmxlX2luc2VydF9yb3dfYVwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLmluc2VydF9yb3dfYWJvdmUgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Um93QWJvdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwicm93XCIgZGF0YS1vcHRpb249XCJkb3duXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfaW5zZXJ0X3Jvd19iXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbnMuaW5zZXJ0X3Jvd19iZWxvdyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5pbnNlcnRSb3dCZWxvdyArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImRlbGV0ZVwiIGRhdGEtdmFsdWU9XCJyb3dcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbnMuZGVsZXRlX3JvdyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5kZWxldGVSb3cgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJtZXJnZVwiIGNsYXNzPVwiX3NlX3RhYmxlX21lcmdlX2J1dHRvbiBzZS1idG4gc2UtdG9vbHRpcFwiIGRpc2FibGVkPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLm1lcmdlX2NlbGwgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIubWVyZ2VDZWxscyArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDtcIj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwiY2VsbFwiIGRhdGEtb3B0aW9uPVwibGVmdFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5pbnNlcnRfY29sdW1uX2xlZnQgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Q29sdW1uQmVmb3JlICsgJzwvc3Bhbj48L3NwYW4+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiaW5zZXJ0XCIgZGF0YS12YWx1ZT1cImNlbGxcIiBkYXRhLW9wdGlvbj1cInJpZ2h0XCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLmluc2VydF9jb2x1bW5fcmlnaHQgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Q29sdW1uQWZ0ZXIgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiBkYXRhLXZhbHVlPVwiY2VsbFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5kZWxldGVfY29sdW1uICtcclxuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLmRlbGV0ZUNvbHVtbiArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cIm9uc3BsaXRcIiBjbGFzcz1cIl9zZV90YWJsZV9zcGxpdF9idXR0b24gc2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5zcGxpdF9jZWxsICtcclxuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnNwbGl0Q2VsbHMgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwLXN1YiBzdW4tZWRpdG9yLWNvbW1vbiBzZS1saXN0LWxheWVyIHNlLXRhYmxlLXNwbGl0XCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLWNvbW1hbmQ9XCJzcGxpdFwiIGRhdGEtdmFsdWU9XCJ2ZXJ0aWNhbFwiIHN0eWxlPVwibGluZS1oZWlnaHQ6MzJweDtcIiB0aXRsZT1cIicgKyBsYW5nLmNvbnRyb2xsZXIuVmVydGljYWxTcGxpdCArICdcIj4nICsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5jb250cm9sbGVyLlZlcnRpY2FsU3BsaXQgKyAnPC9saT4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9XCJzZS1idG4tbGlzdFwiIGRhdGEtY29tbWFuZD1cInNwbGl0XCIgZGF0YS12YWx1ZT1cImhvcml6b250YWxcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OjMycHg7XCIgdGl0bGU9XCInICsgbGFuZy5jb250cm9sbGVyLkhvcml6b250YWxTcGxpdCArICdcIj4nICsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5jb250cm9sbGVyLkhvcml6b250YWxTcGxpdCArICc8L2xpPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC91bD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVSZXNpemU7XHJcbiAgICB9LFxyXG5cclxuICAgIGFwcGVuZFRhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3Qgb1RhYmxlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1RBQkxFJyk7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlQ2VsbHMgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHM7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmNvbnRleHQudGFibGUuX3RhYmxlWFlbMF07XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLmNvbnRleHQudGFibGUuX3RhYmxlWFlbMV07XHJcbiAgICAgICAgbGV0IHRhYmxlSFRNTCA9ICc8dGJvZHk+JztcclxuICAgICAgICB3aGlsZSAoeSA+IDApIHtcclxuICAgICAgICAgICAgdGFibGVIVE1MICs9ICc8dHI+JyArIGNyZWF0ZUNlbGxzLmNhbGwodGhpcywgJ3RkJywgeCkgKyAnPC90cj4nO1xyXG4gICAgICAgICAgICAtLXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYmxlSFRNTCArPSAnPC90Ym9keT4nO1xyXG4gICAgICAgIG9UYWJsZS5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmluc2VydENvbXBvbmVudChvVGFibGUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RUZCA9IG9UYWJsZS5xdWVyeVNlbGVjdG9yKCd0ZCBkaXYnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShmaXJzdFRkLCAwLCBmaXJzdFRkLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnJlc2V0X3RhYmxlX3BpY2tlci5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY3JlYXRlQ2VsbHM6IGZ1bmN0aW9uIChub2RlTmFtZSwgY250LCByZXR1cm5FbGVtZW50KSB7XHJcbiAgICAgICAgbm9kZU5hbWUgPSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXJldHVybkVsZW1lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGNlbGxzSFRNTCA9ICcnO1xyXG4gICAgICAgICAgICB3aGlsZSAoY250ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbHNIVE1MICs9ICc8JyArbm9kZU5hbWUgKyAnPjxkaXY+PGJyPjwvZGl2PjwvJyArIG5vZGVOYW1lICsgJz4nO1xyXG4gICAgICAgICAgICAgICAgY250LS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNlbGxzSFRNTDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xyXG4gICAgICAgICAgICBjZWxsLmlubmVySFRNTCA9ICc8ZGl2Pjxicj48L2Rpdj4nO1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIG9uTW91c2VNb3ZlX3RhYmxlUGlja2VyOiBmdW5jdGlvbiAoY29udGV4dFRhYmxlLCBlKSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHggPSB0aGlzLl93Lk1hdGguY2VpbChlLm9mZnNldFggLyAxOCk7XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLl93Lk1hdGguY2VpbChlLm9mZnNldFkgLyAxOCk7XHJcbiAgICAgICAgeCA9IHggPCAxID8gMSA6IHg7XHJcbiAgICAgICAgeSA9IHkgPCAxID8gMSA6IHk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbnRleHRUYWJsZS5fcnRsKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gKHggKiAxOCAtIDEzKSArICdweCc7XHJcbiAgICAgICAgICAgIHggPSAxMSAtIHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IHggKyAnZW0nO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS5oZWlnaHQgPSB5ICsgJ2VtJztcclxuXHJcbiAgICAgICAgLy8gbGV0IHhfdSA9IHggPCA1ID8gNSA6ICh4ID4gOSA/IDEwIDogeCArIDEpO1xyXG4gICAgICAgIC8vIGxldCB5X3UgPSB5IDwgNSA/IDUgOiAoeSA+IDkgPyAxMCA6IHkgKyAxKTtcclxuICAgICAgICAvLyBjb250ZXh0VGFibGUudGFibGVVbkhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IHhfdSArICdlbSc7XHJcbiAgICAgICAgLy8gY29udGV4dFRhYmxlLnRhYmxlVW5IaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0geV91ICsgJ2VtJztcclxuXHJcbiAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dChjb250ZXh0VGFibGUudGFibGVEaXNwbGF5LCB4ICsgJyB4ICcgKyB5KTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3RhYmxlWFkgPSBbeCwgeV07XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0X3RhYmxlX3BpY2tlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LnRhYmxlLnRhYmxlSGlnaGxpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodCA9IHRoaXMuY29udGV4dC50YWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZTtcclxuICAgICAgICBjb25zdCB1bkhpZ2hsaWdodCA9IHRoaXMuY29udGV4dC50YWJsZS50YWJsZVVuSGlnaGxpZ2h0LnN0eWxlO1xyXG5cclxuICAgICAgICBoaWdobGlnaHQud2lkdGggPSAnMWVtJztcclxuICAgICAgICBoaWdobGlnaHQuaGVpZ2h0ID0gJzFlbSc7XHJcbiAgICAgICAgdW5IaWdobGlnaHQud2lkdGggPSAnMTBlbSc7XHJcbiAgICAgICAgdW5IaWdobGlnaHQuaGVpZ2h0ID0gJzEwZW0nO1xyXG5cclxuICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRoaXMuY29udGV4dC50YWJsZS50YWJsZURpc3BsYXksICcxIHggMScpO1xyXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xyXG4gICAgfSxcclxuXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fcmVtb3ZlRXZlbnRzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucXVlcnlTZWxlY3RvckFsbCgnLnNlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkQ2VsbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZENlbGxzW2ldLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fdG9nZ2xlRWRpdG9yLmNhbGwodGhpcywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fZWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl90ZEVsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fdHJFbGVtZW50ID0gbnVsbDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3RyRWxlbWVudHMgPSBudWxsO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fdGFibGVYWSA9IFtdO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSB0cnVlO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fZml4ZWRDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxDbnQgPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsQ250ID0gMDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3Jvd0NudCA9IDA7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl9yb3dJbmRleCA9IDA7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl9waHlzaWNhbF9jZWxsSW5kZXggPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXggPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fY3VycmVudF9jb2xTcGFuID0gMDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfcm93U3BhbiA9IDA7XHJcblxyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zaGlmdCA9IGZhbHNlO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGxzID0gbnVsbDtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSA9IG51bGw7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3JlZiA9IG51bGw7XHJcblxyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGxOYW1lID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqIHRhYmxlIGVkaXQgY29udHJvbGxlciAqL1xyXG4gICAgY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdDogZnVuY3Rpb24gKHRkRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdldFNlbGVjdGlvbigpLmlzQ29sbGFwc2VkICYmICF0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRkRWxlbWVudCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0gY29udGV4dFRhYmxlLl9lbGVtZW50IHx8IHRoaXMucGx1Z2lucy50YWJsZS5fc2VsZWN0ZWRUYWJsZSB8fCB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudCh0ZEVsZW1lbnQsICdUQUJMRScpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSB0aGlzLnV0aWwuaGFzQ2xhc3ModGFibGVFbGVtZW50LCAnc2UtdGFibGUtc2l6ZS0xMDAnKSB8fCB0YWJsZUVsZW1lbnQuc3R5bGUud2lkdGggPT09ICcxMDAlJyB8fCAoIXRhYmxlRWxlbWVudC5zdHlsZS53aWR0aCAmJiAhdGhpcy51dGlsLmhhc0NsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpKTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX2ZpeGVkQ29sdW1uID0gdGhpcy51dGlsLmhhc0NsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLWxheW91dC1maXhlZCcpIHx8IHRhYmxlRWxlbWVudC5zdHlsZS50YWJsZUxheW91dCA9PT0gJ2ZpeGVkJztcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRUYWJsZVN0eWxlLmNhbGwodGhpcywgY29udGV4dFRhYmxlLl9tYXhXaWR0aCA/ICd3aWR0aHxjb2x1bW4nIDogJ3dpZHRoJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGFibGVQbHVnaW4uc2V0UG9zaXRpb25Db250cm9sbGVyVG9wLmNhbGwodGhpcywgdGFibGVFbGVtZW50KTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCB0ZEVsZW1lbnQsIHRhYmxlUGx1Z2luLl9zaGlmdCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0YWJsZVBsdWdpbi5fc2hpZnQpIHRoaXMuY29udHJvbGxlcnNPbihjb250ZXh0VGFibGUucmVzaXplRGl2LCBjb250ZXh0VGFibGUudGFibGVDb250cm9sbGVyLCB0YWJsZVBsdWdpbi5pbml0LmJpbmQodGhpcyksIHRkRWxlbWVudCwgJ3RhYmxlJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFBvc2l0aW9uQ29udHJvbGxlclRvcDogZnVuY3Rpb24gKHRhYmxlRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29udHJvbGxlclBvc2l0aW9uKHRoaXMuY29udGV4dC50YWJsZS50YWJsZUNvbnRyb2xsZXIsIHRhYmxlRWxlbWVudCwgJ3RvcCcsIHtsZWZ0OiAwLCB0b3A6IDB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0UG9zaXRpb25Db250cm9sbGVyRGl2OiBmdW5jdGlvbiAodGRFbGVtZW50LCByZXNldCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuICAgICAgICBjb25zdCByZXNpemVEaXYgPSBjb250ZXh0VGFibGUucmVzaXplRGl2O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucGx1Z2lucy50YWJsZS5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIHRkRWxlbWVudCwgcmVzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb250ZXh0VGFibGUuY2VsbENvbnRyb2xsZXJUb3ApIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sbGVyUG9zaXRpb24ocmVzaXplRGl2LCBjb250ZXh0VGFibGUuX2VsZW1lbnQsICd0b3AnLCB7bGVmdDogY29udGV4dFRhYmxlLnRhYmxlQ29udHJvbGxlci5vZmZzZXRXaWR0aCwgdG9wOiAwfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sbGVyUG9zaXRpb24ocmVzaXplRGl2LCB0ZEVsZW1lbnQsICdib3R0b20nLCB7bGVmdDogMCwgdG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRDZWxsSW5mbzogZnVuY3Rpb24gKHRkRWxlbWVudCwgcmVzZXQpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSBjb250ZXh0VGFibGUuX2VsZW1lbnQgPSB0aGlzLnBsdWdpbnMudGFibGUuX3NlbGVjdGVkVGFibGUgfHwgdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGRFbGVtZW50LCAnVEFCTEUnKTtcclxuXHJcbiAgICAgICAgaWYgKC9USEVBRC9pLnRlc3QodGFibGUuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0VGFibGUuaGVhZGVyQnV0dG9uLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGNvbnRleHRUYWJsZS5oZWFkZXJCdXR0b24sICdhY3RpdmUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNldCB8fCBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxDbnQgPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHRUYWJsZS5fdGRFbGVtZW50ICE9PSB0ZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fdGRFbGVtZW50ID0gdGRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLl90ckVsZW1lbnQgPSB0ZEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm93cyA9IGNvbnRleHRUYWJsZS5fdHJFbGVtZW50cyA9IHRhYmxlLnJvd3M7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IHRkRWxlbWVudC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2VsbENudCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjZWxscyA9IHJvd3NbMF0uY2VsbHMsIGxlbiA9IHJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNlbGxDbnQgKz0gY2VsbHNbaV0uY29sU3BhbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcm93IGNudCwgcm93IGluZGV4XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gY29udGV4dFRhYmxlLl9yb3dJbmRleCA9IGNvbnRleHRUYWJsZS5fdHJFbGVtZW50LnJvd0luZGV4O1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX3Jvd0NudCA9IHJvd3MubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gY2VsbCBjbnQsIHBoeXNpY2FsIGNlbGwgaW5kZXhcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLl9waHlzaWNhbF9jZWxsQ250ID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnQuY2VsbHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbENudCA9IGNlbGxDbnQ7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fcGh5c2ljYWxfY2VsbEluZGV4ID0gY2VsbEluZGV4O1xyXG5cclxuICAgICAgICAgICAgLy8gc3BhblxyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfY29sU3BhbiA9IGNvbnRleHRUYWJsZS5fdGRFbGVtZW50LmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfcm93U3BhbiAtIGNvbnRleHRUYWJsZS5fdHJFbGVtZW50LmNlbGxzW2NlbGxJbmRleF0ucm93U3BhbiAtIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBmaW5kIGxvZ2NhbCBjZWxsIGluZGV4XHJcbiAgICAgICAgICAgIGxldCByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgICAgIGxldCBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNlbGxzLCBjb2xTcGFuOyBpIDw9IHJvd0luZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgIGNvbFNwYW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGgsIGNlbGwsIGNzLCBycywgbG9nY2FsSW5kZXg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCA9IGMgKyBjb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIGFycjsgciA8IHNwYW5JbmRleC5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5yb3cgPiBpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2djYWxJbmRleCA+PSBhcnIuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGFyci5jcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY0xlbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucm93ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nY2FsIGNlbGwgaW5kZXhcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gcm93SW5kZXggJiYgYyA9PT0gY2VsbEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXggPSBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbG9nY2FsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IHJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBjcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzcGFuSW5kZXggPSBzcGFuSW5kZXguY29uY2F0KHJvd1NwYW5BcnIpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtyZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7fSk7XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBudWxsO1xyXG4gICAgICAgICAgICBzcGFuSW5kZXggPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZWRpdFRhYmxlOiBmdW5jdGlvbiAodHlwZSwgb3B0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdGFibGVQbHVnaW4gPSB0aGlzLnBsdWdpbnMudGFibGU7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGV4dFRhYmxlLl9lbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGlzUm93ID0gdHlwZSA9PT0gJ3Jvdyc7XHJcblxyXG4gICAgICAgIGlmIChpc1Jvdykge1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZUF0dHIgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBpZiAoL15USEVBRCQvaS50ZXN0KHRhYmxlQXR0ci5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICd1cCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0YWJsZUF0dHIubmV4dEVsZW1lbnRTaWJsaW5nIHx8ICEvXlRCT0RZJC9pLnRlc3QodGFibGVBdHRyLm5leHRFbGVtZW50U2libGluZy5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbm5lckhUTUwgKz0gJzx0Ym9keT48dHI+JyArIHRhYmxlUGx1Z2luLmNyZWF0ZUNlbGxzLmNhbGwodGhpcywgJ3RkJywgY29udGV4dFRhYmxlLl9sb2dpY2FsX2NlbGxDbnQsIGZhbHNlKSArICc8L3RyPjwvdGJvZHk+JztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9yZWYpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25DZWxsID0gY29udGV4dFRhYmxlLl90ZEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxscztcclxuICAgICAgICAgICAgLy8gbXVsdGkgLSByb3dcclxuICAgICAgICAgICAgaWYgKGlzUm93KSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm93XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByb3cgPSBzZWxlY3RlZENlbGxzWzBdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ2VsbHMgPSBbc2VsZWN0ZWRDZWxsc1swXV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCwgY2VsbDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwgPSBzZWxlY3RlZENlbGxzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICE9PSBjZWxsLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBjZWxsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZW1vdmVDZWxscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIHJlbW92ZUNlbGxzW2ldLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uZWRpdFJvdy5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZWRpdCByb3dcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIG9wdGlvbiA9PT0gJ3VwJyA/IHNlbGVjdGVkQ2VsbHNbMF0gOiBzZWxlY3RlZENlbGxzW3NlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLmVkaXRSb3cuY2FsbCh0aGlzLCBvcHRpb24sIHBvc2l0aW9uQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIG11bHRpIC0gY2VsbFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBzZWxlY3RlZENlbGxzWzBdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgY2VsbFxyXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDZWxscyA9IFtzZWxlY3RlZENlbGxzWzBdXTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMSwgbGVuID0gc2VsZWN0ZWRDZWxscy5sZW5ndGgsIGNlbGw7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gc2VsZWN0ZWRDZWxsc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Um93ID09PSBjZWxsLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlbW92ZUNlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldENlbGxJbmZvLmNhbGwodGhpcywgcmVtb3ZlQ2VsbHNbaV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5lZGl0Q2VsbC5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZWRpdCBjZWxsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJpZ2h0Q2VsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCAtIDE7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RSb3cgIT09IHNlbGVjdGVkQ2VsbHNbaSArIDFdLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2VsbCA9IHNlbGVjdGVkQ2VsbHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc2V0Q2VsbEluZm8uY2FsbCh0aGlzLCBvcHRpb24gPT09ICdsZWZ0JyA/IHNlbGVjdGVkQ2VsbHNbMF0gOiByaWdodENlbGwgfHwgc2VsZWN0ZWRDZWxsc1swXSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uZWRpdENlbGwuY2FsbCh0aGlzLCBvcHRpb24sIHBvc2l0aW9uQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uKSB0YWJsZVBsdWdpbi5pbml0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfSAvLyBvbmVcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGFibGVQbHVnaW5baXNSb3cgPyAnZWRpdFJvdycgOiAnZWRpdENlbGwnXS5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZnRlciByZW1vdmVcclxuICAgICAgICBpZiAoIW9wdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRhYmxlLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhYmxlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZWRpdFJvdzogZnVuY3Rpb24gKG9wdGlvbiwgcG9zaXRpb25SZXNldEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gIW9wdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3QgdXAgPSBvcHRpb24gPT09ICd1cCc7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luUm93SW5kZXggPSBjb250ZXh0VGFibGUuX3Jvd0luZGV4O1xyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gcmVtb3ZlIHx8IHVwID8gb3JpZ2luUm93SW5kZXggOiBvcmlnaW5Sb3dJbmRleCArIGNvbnRleHRUYWJsZS5fY3VycmVudF9yb3dTcGFuICsgMTtcclxuICAgICAgICBjb25zdCBzaWduID0gcmVtb3ZlID8gLTEgOiAxO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudHM7XHJcbiAgICAgICAgbGV0IGNlbGxDbnQgPSBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbENudDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9yaWdpblJvd0luZGV4ICsgKHJlbW92ZSA/IC0xIDogMCksIGNlbGw7IGkgPD0gbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY2VsbCA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgICAgIGlmIChjZWxsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxsLmxlbmd0aCwgcnMsIGNzOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBycyA9IGNlbGxbY10ucm93U3BhbjtcclxuICAgICAgICAgICAgICAgIGNzID0gY2VsbFtjXS5jb2xTcGFuO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJzIDwgMiAmJiBjcyA8IDIpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChycyArIGkgPiByb3dJbmRleCAmJiByb3dJbmRleCA+IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsW2NdLnJvd1NwYW4gPSBycyArIHNpZ247XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbENudCAtPSBjcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gcm93c1tvcmlnaW5Sb3dJbmRleCArIDFdO1xyXG4gICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhbkNlbGxzID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgY2VsbHMgPSByb3dzW29yaWdpblJvd0luZGV4XS5jZWxscztcclxuICAgICAgICAgICAgICAgIGxldCBjb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2VsbHMubGVuZ3RoLCBjZWxsLCBsb2djYWxJbmRleDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbCA9IGNlbGxzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gaSArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5yb3dTcGFuID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnJvd1NwYW4gLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkNlbGxzLnB1c2goe2NlbGw6IGNlbGwuY2xvbmVOb2RlKGZhbHNlKSwgaW5kZXg6IGxvZ2NhbEluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzcGFuQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFuQ2VsbCA9IHNwYW5DZWxscy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gbmV4dC5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgbG9nY2FsSW5kZXg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gaSArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nY2FsSW5kZXggPj0gc3BhbkNlbGwuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLSwgY29sU3Bhbi0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBzcGFuQ2VsbC5jZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbnNlcnRCZWZvcmUoc3BhbkNlbGwuY2VsbCwgY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuQ2VsbCA9IHNwYW5DZWxscy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFuQ2VsbCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmFwcGVuZENoaWxkKHNwYW5DZWxsLmNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3BhbkNlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmFwcGVuZENoaWxkKHNwYW5DZWxsc1tpXS5jZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLl9lbGVtZW50LmRlbGV0ZVJvdyhyb3dJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gY29udGV4dFRhYmxlLl9lbGVtZW50Lmluc2VydFJvdyhyb3dJbmRleCk7XHJcbiAgICAgICAgICAgIG5ld1Jvdy5pbm5lckhUTUwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCAndGQnLCBjZWxsQ250LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlbW92ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudGFibGUuc2V0UG9zaXRpb25Db250cm9sbGVyRGl2LmNhbGwodGhpcywgcG9zaXRpb25SZXNldEVsZW1lbnQgfHwgY29udGV4dFRhYmxlLl90ZEVsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGVkaXRDZWxsOiBmdW5jdGlvbiAob3B0aW9uLCBwb3NpdGlvblJlc2V0RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuICAgICAgICBjb25zdCB1dGlsID0gdGhpcy51dGlsO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9ICFvcHRpb247XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBvcHRpb24gPT09ICdsZWZ0JztcclxuICAgICAgICBjb25zdCBjb2xTcGFuID0gY29udGV4dFRhYmxlLl9jdXJyZW50X2NvbFNwYW47XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gcmVtb3ZlIHx8IGxlZnQgPyBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbEluZGV4IDogY29udGV4dFRhYmxlLl9sb2dpY2FsX2NlbGxJbmRleCArIGNvbFNwYW4gKyAxO1xyXG5cclxuICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgIGxldCByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgbGV0IHNwYW5JbmRleCA9IFtdO1xyXG4gICAgICAgIGxldCBwYXNzQ2VsbCA9IDA7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQ2VsbCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZVNwYW5BcnIgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbnRleHRUYWJsZS5fcm93Q250LCByb3csIGluc2VydEluZGV4LCBjZWxscywgbmV3Q2VsbCwgYXBwbHlTcGFuLCBjZWxsQ29sU3BhbjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHJvd3NbaV07XHJcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gY2VsbEluZGV4O1xyXG4gICAgICAgICAgICBhcHBseVNwYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgY2VsbHMgPSByb3cuY2VsbHM7XHJcbiAgICAgICAgICAgIGNlbGxDb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjZWxsLCBjTGVuID0gY2VsbHMubGVuZ3RoLCBycywgY3MsIHJlbW92ZUluZGV4OyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIHJzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgIGNzID0gY2VsbC5jb2xTcGFuIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjID49IGluc2VydEluZGV4KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzQ2VsbCA8IDEgJiYgY3MgKyBjID49IGluc2VydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNvbFNwYW4gKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NDZWxsID0gcnMgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4IC09IGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseVNwYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIGFycjsgciA8IHNwYW5JbmRleC5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5kZXggLT0gYXJyLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTcGFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGV4ID0gYyArIGNlbGxDb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdENlbGwgPSAhY2VsbHNbYyArIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIgPSBzcGFuSW5kZXhbcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJvdyA+IGkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVJbmRleCA+PSBhcnIuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ29sU3BhbiArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kZXggPSBjICsgY2VsbENvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdENlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucm93ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dTcGFuQXJyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IHJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzICsgMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiByZW1vdmVJbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlSW5kZXggPj0gaW5zZXJ0SW5kZXggJiYgcmVtb3ZlSW5kZXggKyBjcyA8PSBpbnNlcnRJbmRleCArIGNvbFNwYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2VsbC5wdXNoKGNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVtb3ZlSW5kZXggPD0gaW5zZXJ0SW5kZXggKyBjb2xTcGFuICYmIHJlbW92ZUluZGV4ICsgY3MgPj0gaW5zZXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5jb2xTcGFuIC09IHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChjZWxsSW5kZXgsIGNlbGxJbmRleCArIGNvbFNwYW4sIHJlbW92ZUluZGV4LCByZW1vdmVJbmRleCArIGNzKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycyA+IDAgJiYgKHJlbW92ZUluZGV4IDwgaW5zZXJ0SW5kZXggfHwgcmVtb3ZlSW5kZXggKyBjcyA+IGluc2VydEluZGV4ICsgY29sU3BhbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGw6IGNlbGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IGkgKyByc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzcGFuSW5kZXggPSBzcGFuSW5kZXguY29uY2F0KHJvd1NwYW5BcnIpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtyZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7fSk7XHJcbiAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFzc0NlbGwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc0NlbGwgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0SW5kZXggIT09IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0NlbGwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCBjZWxsc1swXS5ub2RlTmFtZSwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IHJvdy5pbnNlcnRCZWZvcmUobmV3Q2VsbCwgY2VsbHNbaW5zZXJ0SW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICBsZXQgcmVtb3ZlRmlyc3QsIHJlbW92ZUVuZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIHJMZW4gPSByZW1vdmVDZWxsLmxlbmd0aCwgcm93OyByIDwgckxlbjsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSByZW1vdmVDZWxsW3JdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0ocmVtb3ZlQ2VsbFtyXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVtb3ZlRmlyc3QpIHJlbW92ZUZpcnN0ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIHJvdyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW5kID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIHJvdyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHJvdyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gcmVtb3ZlU3BhbkFyci5sZW5ndGgsIHJvd1NwYW5DZWxsOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbCA9IHJlbW92ZVNwYW5BcnJbY107XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbC5jZWxsLnJvd1NwYW4gPSB1dGlsLmdldE92ZXJsYXBSYW5nZUF0SW5kZXgocmVtb3ZlRmlyc3QsIHJlbW92ZUVuZCwgcm93U3BhbkNlbGwuaSwgcm93U3BhbkNlbGwucnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnNldFBvc2l0aW9uQ29udHJvbGxlckRpdi5jYWxsKHRoaXMsIHBvc2l0aW9uUmVzZXRFbGVtZW50IHx8IGNvbnRleHRUYWJsZS5fdGRFbGVtZW50LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIF9jbG9zZVNwbGl0TWVudTogbnVsbCxcclxuICAgIG9wZW5TcGxpdE1lbnU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3ModGhpcy5jb250ZXh0LnRhYmxlLnNwbGl0QnV0dG9uLCAnb24nKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudGFibGUuc3BsaXRNZW51LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLXRhYmxlJztcclxuXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLl9jbG9zZVNwbGl0TWVudSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRoaXMuY29udGV4dC50YWJsZS5zcGxpdEJ1dHRvbiwgJ29uJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC50YWJsZS5zcGxpdE1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVEb2NFdmVudCgnY2xpY2snLCB0aGlzLnBsdWdpbnMudGFibGUuX2Nsb3NlU3BsaXRNZW51KTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLl9jbG9zZVNwbGl0TWVudSA9IG51bGw7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZERvY0V2ZW50KCdjbGljaycsIHRoaXMucGx1Z2lucy50YWJsZS5fY2xvc2VTcGxpdE1lbnUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzcGxpdENlbGxzOiBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcclxuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IGRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSBjb250ZXh0VGFibGUuX3RkRWxlbWVudDtcclxuICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudDtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXg7XHJcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSBjb250ZXh0VGFibGUuX3Jvd0luZGV4O1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbGwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCBjdXJyZW50Q2VsbC5ub2RlTmFtZSwgMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIHZlcnRpY2FsXHJcbiAgICAgICAgaWYgKHZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2xTcGFuID0gY3VycmVudENlbGwuY29sU3BhbjtcclxuICAgICAgICAgICAgbmV3Q2VsbC5yb3dTcGFuID0gY3VycmVudENlbGwucm93U3BhbjtcclxuXHJcbiAgICAgICAgICAgIC8vIGNvbHNwYW4gPiAxXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sU3BhbiA+IDEpIHtcclxuICAgICAgICAgICAgICAgIG5ld0NlbGwuY29sU3BhbiA9IHRoaXMuX3cuTWF0aC5mbG9vcihjdXJyZW50Q29sU3Bhbi8yKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDZWxsLmNvbFNwYW4gPSBjdXJyZW50Q29sU3BhbiAtIG5ld0NlbGwuY29sU3BhbjtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRSb3cuaW5zZXJ0QmVmb3JlKG5ld0NlbGwsIGN1cnJlbnRDZWxsLm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGNvbHNwYW4gLSAxXHJcbiAgICAgICAgICAgICAgICBsZXQgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwYW5JbmRleCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjb250ZXh0VGFibGUuX3Jvd0NudCwgY2VsbHMsIGNvbFNwYW47IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgY3MsIHJzLCBsb2djYWxJbmRleDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCA9IGMgKyBjb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5JbmRleC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucm93ID4gaSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4ID49IGFyci5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGFyci5jcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nY2FsSW5kZXggKz0gYXJyLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSBjTGVuIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4IDw9IGluZGV4ICYmIHJzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbG9nY2FsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzICsgMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByczogcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsICE9PSBjdXJyZW50Q2VsbCAmJiBsb2djYWxJbmRleCA8PSBpbmRleCAmJiBsb2djYWxJbmRleCArIGNzID49IGluZGV4ICsgY3VycmVudENvbFNwYW4gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNvbFNwYW4gKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nY2FsSW5kZXggPiBpbmRleCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4ID0gc3BhbkluZGV4LmNvbmNhdChyb3dTcGFuQXJyKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7cmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O30pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Um93Lmluc2VydEJlZm9yZShuZXdDZWxsLCBjdXJyZW50Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHsgLy8gaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Um93U3BhbiA9IGN1cnJlbnRDZWxsLnJvd1NwYW47XHJcbiAgICAgICAgICAgIG5ld0NlbGwuY29sU3BhbiA9IGN1cnJlbnRDZWxsLmNvbFNwYW47XHJcblxyXG4gICAgICAgICAgICAvLyByb3dzcGFuID4gMVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvd1NwYW4gPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdDZWxsLnJvd1NwYW4gPSB0aGlzLl93Lk1hdGguZmxvb3IoY3VycmVudFJvd1NwYW4vMik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dTcGFuID0gY3VycmVudFJvd1NwYW4gLSBuZXdDZWxsLnJvd1NwYW47XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIGN1cnJlbnRSb3cpICsgbmV3Um93U3BhbjtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbHMsIGNvbFNwYW47IGkgPCBuZXh0Um93SW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgY3MsIGxvZ2NhbEluZGV4OyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gYyArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2djYWxJbmRleCA+PSBpbmRleCkgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzID4gMCAmJiBjcyArIGkgPj0gbmV4dFJvd0luZGV4ICYmIGxvZ2NhbEluZGV4IDwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxvZ2NhbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjZWxsLmNvbFNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvdyA9IHJvd3NbbmV4dFJvd0luZGV4XTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDZWxscyA9IG5leHRSb3cuY2VsbHM7XHJcbiAgICAgICAgICAgICAgICBsZXQgcnMgPSByb3dTcGFuQXJyLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBuZXh0Q2VsbHMubGVuZ3RoLCBjb2xTcGFuID0gMCwgY2VsbCwgY3MsIGxvZ2NhbEluZGV4LCBpbnNlcnRJbmRleDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gYyArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbCA9IG5leHRDZWxsc1tjXTtcclxuICAgICAgICAgICAgICAgICAgICBjcyA9IGNlbGwuY29sU3BhbiAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBsb2djYWxJbmRleCArIGNzICsgMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzICYmIGluc2VydEluZGV4ID49IHJzLmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gcnMuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4ICs9IHJzLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBycyA9IHJvd1NwYW5BcnIuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEluZGV4ID49IGluZGV4IHx8IGMgPT09IGNMZW4gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSb3cuaW5zZXJ0QmVmb3JlKG5ld0NlbGwsIGNlbGwubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDZWxsLnJvd1NwYW4gPSBuZXdSb3dTcGFuO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyByb3dzcGFuIC0gMVxyXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC5yb3dTcGFuID0gY3VycmVudENlbGwucm93U3BhbjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IHV0aWwuY3JlYXRlRWxlbWVudCgnVFInKTtcclxuICAgICAgICAgICAgICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChuZXdDZWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbHM7IGkgPCByb3dJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSByb3dzW2ldLmNlbGxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyBjZWxsc1tjXS5yb3dTcGFuIC0gMSA+PSByb3dJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHNbY10ucm93U3BhbiArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBoeXNpY2FsSW5kZXggPSBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxJbmRleDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gY3VycmVudFJvdy5jZWxscztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBwaHlzaWNhbEluZGV4KSBjb250aW51ZTsgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNbY10ucm93U3BhbiArPSAxOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudFJvdy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdSb3csIGN1cnJlbnRSb3cubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c0VkZ2UoY3VycmVudENlbGwpO1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy50YWJsZS5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjdXJyZW50Q2VsbCwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIG1lcmdlQ2VsbHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVmID0gdGFibGVQbHVnaW4uX3JlZjtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbHM7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VDZWxsID0gc2VsZWN0ZWRDZWxsc1swXTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgZW1wdHlSb3dGaXJzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVtcHR5Um93TGFzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGNzID0gKHJlZi5jZSAtIHJlZi5jcykgKyAxO1xyXG4gICAgICAgIGxldCBycyA9IChyZWYucmUgLSByZWYucnMpICsgMTtcclxuICAgICAgICBsZXQgbWVyZ2VIVE1MID0gJyc7XHJcbiAgICAgICAgbGV0IHJvdyA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCwgY2VsbCwgY2g7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjZWxsID0gc2VsZWN0ZWRDZWxsc1tpXTtcclxuICAgICAgICAgICAgaWYgKHJvdyAhPT0gY2VsbC5wYXJlbnROb2RlKSByb3cgPSBjZWxsLnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgICAgICBjaCA9IGNlbGwuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gY2gubGVuZ3RoOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoY2hbY10pICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKGNoW2NdLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjaFtjXSk7XHJcbiAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbWVyZ2VIVE1MICs9IGNlbGwuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oY2VsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocm93LmNlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbXB0eVJvd0ZpcnN0KSBlbXB0eVJvd0ZpcnN0ID0gcm93O1xyXG4gICAgICAgICAgICAgICAgZWxzZSBlbXB0eVJvd0xhc3QgPSByb3c7XHJcbiAgICAgICAgICAgICAgICBycyAtPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1wdHlSb3dGaXJzdCkge1xyXG4gICAgICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgICAgICBjb25zdCByb3dJbmRleEZpcnN0ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIGVtcHR5Um93Rmlyc3QpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dJbmRleExhc3QgPSB1dGlsLmdldEFycmF5SW5kZXgocm93cywgZW1wdHlSb3dMYXN0IHx8IGVtcHR5Um93Rmlyc3QpO1xyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVSb3dzID0gW107XHJcbiAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNlbGxzOyBpIDw9IHJvd0luZGV4TGFzdDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUm93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgcnM7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChycyA+IDAgJiYgaSArIHJzID49IHJvd0luZGV4Rmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5yb3dTcGFuIC09IHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyb3dJbmRleEZpcnN0LCByb3dJbmRleExhc3QsIGksIGkgKyBycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVtb3ZlUm93cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHJlbW92ZVJvd3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtZXJnZUNlbGwuaW5uZXJIVE1MICs9IG1lcmdlSFRNTDtcclxuICAgICAgICBtZXJnZUNlbGwuY29sU3BhbiA9IGNzO1xyXG4gICAgICAgIG1lcmdlQ2VsbC5yb3dTcGFuID0gcnM7XHJcblxyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRBY3RpdmVCdXR0b24uY2FsbCh0aGlzLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdC5jYWxsKHRoaXMsIG1lcmdlQ2VsbCk7XHJcblxyXG4gICAgICAgIHV0aWwuYWRkQ2xhc3MobWVyZ2VDZWxsLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNFZGdlKG1lcmdlQ2VsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIHRvZ2dsZUhlYWRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyQnV0dG9uID0gdGhpcy5jb250ZXh0LnRhYmxlLmhlYWRlckJ1dHRvbjtcclxuICAgICAgICBjb25zdCBhY3RpdmUgPSB1dGlsLmhhc0NsYXNzKGhlYWRlckJ1dHRvbiwgJ2FjdGl2ZScpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ1RIRUFEJyk7XHJcbiAgICAgICAgICAgIGhlYWRlci5pbm5lckhUTUwgPSAnPHRyPicgKyB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCAndGgnLCB0aGlzLmNvbnRleHQudGFibGUuX2xvZ2ljYWxfY2VsbENudCwgZmFsc2UpICsgJzwvdHI+JztcclxuICAgICAgICAgICAgdGFibGUuaW5zZXJ0QmVmb3JlKGhlYWRlciwgdGFibGUuZmlyc3RFbGVtZW50Q2hpbGQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbSh0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHV0aWwudG9nZ2xlQ2xhc3MoaGVhZGVyQnV0dG9uLCAnYWN0aXZlJyk7XHJcblxyXG4gICAgICAgIGlmICgvVEgvaS50ZXN0KHRoaXMuY29udGV4dC50YWJsZS5fdGRFbGVtZW50Lm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnNldFBvc2l0aW9uQ29udHJvbGxlckRpdi5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC50YWJsZS5fdGRFbGVtZW50LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRUYWJsZVN0eWxlOiBmdW5jdGlvbiAoc3R5bGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IGNvbnRleHRUYWJsZS5fZWxlbWVudDtcclxuICAgICAgICBsZXQgaWNvbiwgc3Bhbiwgc2l6ZUljb24sIHRleHQ7XHJcblxyXG4gICAgICAgIGlmIChzdHlsZXMuaW5kZXhPZignd2lkdGgnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGljb24gPSAgY29udGV4dFRhYmxlLnJlc2l6ZUJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgc3BhbiA9IGNvbnRleHRUYWJsZS5yZXNpemVUZXh0O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjb250ZXh0VGFibGUuX21heFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBzaXplSWNvbiA9IGNvbnRleHRUYWJsZS5pY29ucy5leHBhbnNpb247XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gY29udGV4dFRhYmxlLm1heFRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0VGFibGUuY29sdW1uRml4ZWRCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1zaXplLTEwMCcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2l6ZUljb24gPSBjb250ZXh0VGFibGUuaWNvbnMucmVkdWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRUYWJsZS5taW5UZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtMTAwJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VFbGVtZW50KGljb24sIHNpemVJY29uKTtcclxuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dChzcGFuLCB0ZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdHlsZXMuaW5kZXhPZignY29sdW1uJykgPiAtMSkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRleHRUYWJsZS5fZml4ZWRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1sYXlvdXQtZml4ZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1sYXlvdXQtYXV0bycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGNvbnRleHRUYWJsZS5jb2x1bW5GaXhlZEJ1dHRvbiwgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLWxheW91dC1hdXRvJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3ModGFibGVFbGVtZW50LCAnc2UtdGFibGUtbGF5b3V0LWZpeGVkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRBY3RpdmVCdXR0b246IGZ1bmN0aW9uIChmaXhlZENlbGwsIHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgaWYgKC9eVEgkL2kudGVzdChmaXhlZENlbGwubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dBYm92ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dCZWxvd0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLmluc2VydFJvd0Fib3ZlQnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLmluc2VydFJvd0JlbG93QnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRDZWxsIHx8IGZpeGVkQ2VsbCA9PT0gc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5zcGxpdEJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5tZXJnZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLnNwbGl0QnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLm1lcmdlQnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIG11bHRpIHNlbGVjdGVcclxuICAgIF9iaW5kT25TZWxlY3Q6IG51bGwsXHJcbiAgICBfYmluZE9mZlNlbGVjdDogbnVsbCxcclxuICAgIF9iaW5kT2ZmU2hpZnQ6IG51bGwsXHJcbiAgICBfc2VsZWN0ZWRDZWxsczogbnVsbCxcclxuICAgIF9zaGlmdDogZmFsc2UsXHJcbiAgICBfZml4ZWRDZWxsOiBudWxsLFxyXG4gICAgX2ZpeGVkQ2VsbE5hbWU6IG51bGwsXHJcbiAgICBfc2VsZWN0ZWRDZWxsOiBudWxsLFxyXG4gICAgX3NlbGVjdGVkVGFibGU6IG51bGwsXHJcbiAgICBfcmVmOiBudWxsLFxyXG4gICAgX3RvZ2dsZUVkaXRvcjogZnVuY3Rpb24gKGVuYWJsZWQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZW5hYmxlZCk7XHJcbiAgICAgICAgaWYgKGVuYWJsZWQpIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc2UtZGlzYWJsZWQnKTtcclxuICAgICAgICBlbHNlIHRoaXMudXRpbC5hZGRDbGFzcyh0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc2UtZGlzYWJsZWQnKTtcclxuICAgIH0sXHJcblxyXG4gICAgX29mZkNlbGxNdWx0aVNlbGVjdDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICBpZiAoIXRhYmxlUGx1Z2luLl9zaGlmdCkge1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fcmVtb3ZlRXZlbnRzLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl90b2dnbGVFZGl0b3IuY2FsbCh0aGlzLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRhYmxlUGx1Z2luLl9pbml0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93ZC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0YWJsZVBsdWdpbi5faW5pdEJpbmQpO1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5faW5pdEJpbmQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0YWJsZVBsdWdpbi5fZml4ZWRDZWxsIHx8ICF0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRhYmxlUGx1Z2luLnNldEFjdGl2ZUJ1dHRvbi5jYWxsKHRoaXMsIHRhYmxlUGx1Z2luLl9maXhlZENlbGwsIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwpO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLmNhbGxfY29udHJvbGxlcl90YWJsZUVkaXQuY2FsbCh0aGlzLCB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsIHx8IHRhYmxlUGx1Z2luLl9maXhlZENlbGwpO1xyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxscyA9IHRhYmxlUGx1Z2luLl9zZWxlY3RlZFRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZS10YWJsZS1zZWxlY3RlZC1jZWxsJyk7XHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwgJiYgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCkgdGhpcy5mb2N1c0VkZ2UodGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbCk7XHJcblxyXG4gICAgICAgIGlmICghdGFibGVQbHVnaW4uX3NoaWZ0KSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGwgPSBudWxsO1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsID0gbnVsbDtcclxuICAgICAgICAgICAgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbE5hbWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX29uQ2VsbE11bHRpU2VsZWN0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRoaXMuX2FudGlCbHVyID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlLnRhcmdldCwgdGhpcy51dGlsLmlzQ2VsbCk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fc2hpZnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCkgdGFibGVQbHVnaW4uX3RvZ2dsZUVkaXRvci5jYWxsKHRoaXMsIHRydWUpO1xyXG4gICAgICAgICAgICBlbHNlIHRhYmxlUGx1Z2luLl90b2dnbGVFZGl0b3IuY2FsbCh0aGlzLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGFibGVQbHVnaW4uX3JlZikge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgIGVsc2UgdGFibGVQbHVnaW4uX3RvZ2dsZUVkaXRvci5jYWxsKHRoaXMsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldCA9PT0gdGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbCB8fCB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsTmFtZSAhPT0gdGFyZ2V0Lm5vZGVOYW1lIHx8IFxyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSAhPT0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0LCAnVEFCTEUnKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsID0gdGFyZ2V0O1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZXRNdWx0aUNlbGxzLmNhbGwodGhpcywgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCwgdGFyZ2V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldE11bHRpQ2VsbHM6IGZ1bmN0aW9uIChzdGFydENlbGwsIGVuZENlbGwpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCByb3dzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucm93cztcclxuICAgICAgICBjb25zdCB1dGlsID0gdGhpcy51dGlsO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucXVlcnlTZWxlY3RvckFsbCgnLnNlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VsZWN0ZWRDZWxscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHNlbGVjdGVkQ2VsbHNbaV0sICdzZS10YWJsZS1zZWxlY3RlZC1jZWxsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhcnRDZWxsID09PSBlbmRDZWxsKSB7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3Moc3RhcnRDZWxsLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgICAgICBpZiAoIXRhYmxlUGx1Z2luLl9zaGlmdCkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZpbmRTZWxlY3RlZENlbGwgPSB0cnVlO1xyXG4gICAgICAgIGxldCBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICBsZXQgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlUGx1Z2luLl9yZWYgPSB7X2k6IDAsIGNzOiBudWxsLCBjZTogbnVsbCwgcnM6IG51bGwsIHJlOiBudWxsfTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvd3MubGVuZ3RoLCBjZWxscywgY29sU3BhbjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgY29sU3BhbiA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgbG9nY2FsSW5kZXgsIGNzLCByczsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgY2VsbCA9IGNlbGxzW2NdO1xyXG4gICAgICAgICAgICAgICAgY3MgPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgbG9nY2FsSW5kZXggPSBjICsgY29sU3BhbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyciA9IHNwYW5JbmRleFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5yb3cgPiBpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4ID49IGFyci5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5yb3cgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY0xlbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5ycyAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuSW5kZXguc3BsaWNlKHIsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsID09PSBzdGFydENlbGwgfHwgY2VsbCA9PT0gZW5kQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY3MgPSByZWYuY3MgIT09IG51bGwgJiYgcmVmLmNzIDwgbG9nY2FsSW5kZXggPyByZWYuY3MgOiBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmNlID0gcmVmLmNlICE9PSBudWxsICYmIHJlZi5jZSA+IGxvZ2NhbEluZGV4ICsgY3MgPyByZWYuY2UgOiBsb2djYWxJbmRleCArIGNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYucnMgPSByZWYucnMgIT09IG51bGwgJiYgcmVmLnJzIDwgaSA/IHJlZi5ycyA6IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5yZSA9IHJlZi5yZSAhPT0gbnVsbCAmJiByZWYucmUgPiBpICsgcnMgPyByZWYucmUgOiBpICsgcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5faSArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmLl9pID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTZWxlY3RlZENlbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyZWYuY3MsIHJlZi5jZSwgbG9nY2FsSW5kZXgsIGxvZ2NhbEluZGV4ICsgY3MpICYmIHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyZWYucnMsIHJlZi5yZSwgaSwgaSArIHJzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NzID0gcmVmLmNzIDwgbG9nY2FsSW5kZXggPyByZWYuY3MgOiBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDZSA9IHJlZi5jZSA+IGxvZ2NhbEluZGV4ICsgY3MgPyByZWYuY2UgOiBsb2djYWxJbmRleCArIGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JzID0gcmVmLnJzIDwgaSA/IHJlZi5ycyA6IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UmUgPSByZWYucmUgPiBpICsgcnMgPyByZWYucmUgOiBpICsgcnM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYuY3MgIT09IG5ld0NzIHx8IHJlZi5jZSAhPT0gbmV3Q2UgfHwgcmVmLnJzICE9PSBuZXdScyB8fCByZWYucmUgIT09IG5ld1JlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5jcyA9IG5ld0NzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY2UgPSBuZXdDZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLnJzID0gbmV3UnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5yZSA9IG5ld1JlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gLTE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY2VsbCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocnMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxvZ2NhbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjczogY3MgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByczogcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogLTFcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNlbGwuY29sU3BhbiAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNwYW5JbmRleCA9IHNwYW5JbmRleC5jb25jYXQocm93U3BhbkFycikuc29ydChmdW5jdGlvbiAoYSwgYikge3JldHVybiBhLmluZGV4IC0gYi5pbmRleDt9KTtcclxuICAgICAgICAgICAgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3JlbW92ZUV2ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICBpZiAodGFibGVQbHVnaW4uX2luaXRCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRhYmxlUGx1Z2luLl9pbml0QmluZCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9pbml0QmluZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLl93ZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0YWJsZVBsdWdpbi5fYmluZE9uU2VsZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5fd2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT25TZWxlY3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0YWJsZVBsdWdpbi5fYmluZE9mZlNlbGVjdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fYmluZE9mZlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGFibGVQbHVnaW4uX2JpbmRPZmZTaGlmdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX2luaXRCaW5kOiBudWxsLFxyXG4gICAgb25UYWJsZUNlbGxNdWx0aVNlbGVjdDogZnVuY3Rpb24gKHRkRWxlbWVudCwgc2hpZnQpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuXHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3JlbW92ZUV2ZW50cy5jYWxsKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3NoaWZ0ID0gc2hpZnQ7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCA9IHRkRWxlbWVudDtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsTmFtZSA9IHRkRWxlbWVudC5ub2RlTmFtZTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHRkRWxlbWVudCwgJ1RBQkxFJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCcuc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZENlbGxzW2ldLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRkRWxlbWVudCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICBcclxuICAgICAgICB0YWJsZVBsdWdpbi5fYmluZE9uU2VsZWN0ID0gdGFibGVQbHVnaW4uX29uQ2VsbE11bHRpU2VsZWN0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2JpbmRPZmZTZWxlY3QgPSB0YWJsZVBsdWdpbi5fb2ZmQ2VsbE11bHRpU2VsZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICghc2hpZnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCwgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24odGhpcy5jb250ZXh0LnRhYmxlLnJlc2l6ZURpdiwgdGhpcy5jb250ZXh0LnRhYmxlLnRhYmxlQ29udHJvbGxlciwgdGhpcy5wbHVnaW5zLnRhYmxlLmluaXQuYmluZCh0aGlzKSwgdGRFbGVtZW50LCAndGFibGUnKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGFibGVQbHVnaW4uX3JlZikgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl93ZC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0LCBmYWxzZSk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2luaXRCaW5kID0gdGFibGVQbHVnaW4uaW5pdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3dkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRhYmxlUGx1Z2luLl9pbml0QmluZCwgZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICBvbkNsaWNrX3RhYmxlQ29udHJvbGxlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykgPyBlLnRhcmdldCA6IGUudGFyZ2V0LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW9wdGlvbicpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGFibGVQbHVnaW4uX2Nsb3NlU3BsaXRNZW51ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9jbG9zZVNwbGl0TWVudSgpO1xyXG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gJ29uc3BsaXQnKSByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbW1hbmQpIHJldHVybjtcclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2luc2VydCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5lZGl0VGFibGUuY2FsbCh0aGlzLCB2YWx1ZSwgb3B0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdoZWFkZXInOlxyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4udG9nZ2xlSGVhZGVyLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnb25zcGxpdCc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5vcGVuU3BsaXRNZW51LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnc3BsaXQnOlxyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc3BsaXRDZWxscy5jYWxsKHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtZXJnZSc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5tZXJnZUNlbGxzLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmVzaXplJzpcclxuICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSAhY29udGV4dFRhYmxlLl9tYXhXaWR0aDtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFRhYmxlU3R5bGUuY2FsbCh0aGlzLCAnd2lkdGgnKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFBvc2l0aW9uQ29udHJvbGxlclRvcC5jYWxsKHRoaXMsIGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjb250ZXh0VGFibGUuX3RkRWxlbWVudCwgdGFibGVQbHVnaW4uX3NoaWZ0KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsYXlvdXQnOlxyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLl9maXhlZENvbHVtbiA9ICFjb250ZXh0VGFibGUuX2ZpeGVkQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc2V0VGFibGVTdHlsZS5jYWxsKHRoaXMsICdjb2x1bW4nKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFBvc2l0aW9uQ29udHJvbGxlclRvcC5jYWxsKHRoaXMsIGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjb250ZXh0VGFibGUuX3RkRWxlbWVudCwgdGFibGVQbHVnaW4uX3NoaWZ0KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdyZW1vdmUnOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBjb250ZXh0VGFibGUuX2VsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVtcHR5RGl2ICE9PSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnKSB0aGlzLnV0aWwucmVtb3ZlSXRlbUFsbFBhcmVudHMoZW1wdHlEaXYsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOyB9LCBudWxsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICB9XHJcbn07XHJcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2Zvcm1hdEJsb2NrJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmZvcm1hdEJsb2NrID0ge1xuICAgICAgICAgICAgdGFyZ2V0VGV4dDogdGFyZ2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudHh0JyksXG4gICAgICAgICAgICB0YXJnZXRUb29sdGlwOiB0YXJnZXRFbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignLnNlLXRvb2x0aXAtdGV4dCcpLFxuICAgICAgICAgICAgX2Zvcm1hdExpc3Q6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50Rm9ybWF0OiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2tVcC5iaW5kKGNvcmUpKTtcbiAgICAgICAgY29udGV4dC5mb3JtYXRCbG9jay5fZm9ybWF0TGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGFuZ190b29sYmFyID0gY29yZS5sYW5nLnRvb2xiYXI7XG4gICAgICAgIGNvbnN0IGxpc3REaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllciBzZS1saXN0LWZvcm1hdCc7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdEZvcm1hdHMgPSBbJ3AnLCAnZGl2JywgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J107XG4gICAgICAgIGNvbnN0IGZvcm1hdExpc3QgPSAhb3B0aW9uLmZvcm1hdHMgfHwgb3B0aW9uLmZvcm1hdHMubGVuZ3RoID09PSAwID8gZGVmYXVsdEZvcm1hdHMgOiBvcHRpb24uZm9ybWF0cztcblxuICAgICAgICBsZXQgbGlzdCA9ICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPjx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZm9ybWF0TGlzdC5sZW5ndGgsIGZvcm1hdCwgdGFnTmFtZSwgY29tbWFuZCwgbmFtZSwgaCwgYXR0cnMsIGNsYXNzTmFtZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRMaXN0W2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiYgZGVmYXVsdEZvcm1hdHMuaW5kZXhPZihmb3JtYXQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhZ05hbWUgPT09ICdibG9ja3F1b3RlJyA/ICdyYW5nZScgOiB0YWdOYW1lID09PSAncHJlJyA/ICdmcmVlJyA6ICdyZXBsYWNlJztcbiAgICAgICAgICAgICAgICBoID0gL15oLy50ZXN0KHRhZ05hbWUpID8gdGFnTmFtZS5tYXRjaCgvXFxkKy8pWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGxhbmdfdG9vbGJhclsndGFnXycgKyAoaCA/ICdoJyA6IHRhZ05hbWUpXSArIGg7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgYXR0cnMgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFnTmFtZSA9IGZvcm1hdC50YWcudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gZm9ybWF0LmNvbW1hbmQ7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGZvcm1hdC5uYW1lIHx8IHRhZ05hbWU7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZm9ybWF0LmNsYXNzO1xuICAgICAgICAgICAgICAgIGF0dHJzID0gY2xhc3NOYW1lID8gJyBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnXCInIDogJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpc3QgKz0gJzxsaT4nICtcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdFwiIGRhdGEtY29tbWFuZD1cIicgKyBjb21tYW5kICsgJ1wiIGRhdGEtdmFsdWU9XCInICsgdGFnTmFtZSArICdcIiBkYXRhLWNsYXNzPVwiJyArIGNsYXNzTmFtZSArICdcIiB0aXRsZT1cIicgKyBuYW1lICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPCcgKyB0YWdOYW1lICsgYXR0cnMgKyAnPicgKyBuYW1lICsgJzwvJyArIHRhZ05hbWUgKyAnPicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybWF0VGl0bGUgPSB0aGlzLmxhbmcudG9vbGJhci5mb3JtYXRzO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRleHQuZm9ybWF0QmxvY2sudGFyZ2V0VGV4dDtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMuY29udGV4dC5mb3JtYXRCbG9jay50YXJnZXRUb29sdGlwO1xuXG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0YXJnZXQsIGZvcm1hdFRpdGxlKTtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VUeHQodG9vbHRpcCwgZm9ybWF0VGl0bGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXRpbC5pc0Zvcm1hdEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdENvbnRleHQgPSB0aGlzLmNvbnRleHQuZm9ybWF0QmxvY2s7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXRMaXN0ID0gZm9ybWF0Q29udGV4dC5fZm9ybWF0TGlzdDtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gKGVsZW1lbnQuY2xhc3NOYW1lLm1hdGNoKC8oXFxzfF4pX19zZV9fZm9ybWF0X19bXlxcc10rLykgfHwgWycnXSlbMF0udHJpbSgpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZm9ybWF0TGlzdC5sZW5ndGgsIGY7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGYgPSBmb3JtYXRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gZi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSAmJiBjbGFzc05hbWUgPT09IGYuZ2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0VGl0bGUgPSBmLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VUeHQodGFyZ2V0LCBmb3JtYXRUaXRsZSk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRvb2x0aXAsIGZvcm1hdFRpdGxlKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnLCBub2RlTmFtZSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJywgY2xhc3NOYW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdENvbnRleHQgPSB0aGlzLmNvbnRleHQuZm9ybWF0QmxvY2s7XG4gICAgICAgIGNvbnN0IGZvcm1hdExpc3QgPSBmb3JtYXRDb250ZXh0Ll9mb3JtYXRMaXN0O1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBmb3JtYXRDb250ZXh0LnRhcmdldFRleHQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGb3JtYXQgPSAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIHx8ICcnKSArICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJykgfHwgJycpO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0ICE9PSBmb3JtYXRDb250ZXh0LmN1cnJlbnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmb3JtYXRMaXN0Lmxlbmd0aCwgZjsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZiA9IGZvcm1hdExpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb3JtYXQgPT09IGYuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgKyBmLmdldEF0dHJpYnV0ZSgnZGF0YS1jbGFzcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhmLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGYsICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdENvbnRleHQuY3VycmVudEZvcm1hdCA9IGN1cnJlbnRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja1VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgY29tbWFuZCA9IG51bGwsIHZhbHVlID0gbnVsbCwgdGFnID0gbnVsbCwgY2xhc3NOYW1lID0gJyc7XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9VTC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xhc3MnKTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGFnID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWxlbWVudCA9IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hcHBseVJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZyZWUsIHJlcGxhY2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzQW5kQ29tcG9uZW50cyhmYWxzZSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmdldFJhbmdlX2FkZExpbmUocmFuZ2UsIG51bGwpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybXN0cyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50c0FuZENvbXBvbmVudHMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBlbmRPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBzZWxlY3RlZEZvcm1zdHNbMF07XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHNlbGVjdGVkRm9ybXN0c1tzZWxlY3RlZEZvcm1zdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhdGggPSB1dGlsLmdldE5vZGVQYXRoKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBmaXJzdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgocmFuZ2UuZW5kQ29udGFpbmVyLCBsYXN0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGxpc3RcbiAgICAgICAgICAgIGNvbnN0IHJsaXN0ID0gdGhpcy5kZXRhY2hMaXN0KHNlbGVjdGVkRm9ybXN0cywgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKHJsaXN0LnNjKSBmaXJzdCA9IHJsaXN0LnNjO1xuICAgICAgICAgICAgaWYgKHJsaXN0LmVjKSBsYXN0ID0gcmxpc3QuZWM7XG5cbiAgICAgICAgICAgIC8vIGNoYW5nZSBmb3JtYXQgdGFnXG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGZpcnN0UGF0aCwgZmlyc3QpLCBzdGFydE9mZnNldCwgdXRpbC5nZXROb2RlRnJvbVBhdGgobGFzdFBhdGgsIGxhc3QpLCBlbmRPZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzQW5kQ29tcG9uZW50cyhmYWxzZSk7XG5cbiAgICAgICAgICAgIC8vIGZyZWUgZm9ybWF0XG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gJ2ZyZWUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbW9kaWZpZWRGb3Jtc3RzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBtb2RpZmllZEZvcm1zdHNbbGVuXS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGxldCBmcmVlRWxlbWVudCA9IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzRWxlbWVudCA9IGZyZWVFbGVtZW50O1xuICAgIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZW4sIGYsIGh0bWwsIGJlZm9yZSwgbmV4dCwgaW5uZXIsIGlzQ29tcCwgZmlyc3QgPSB0cnVlOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBmID0gbW9kaWZpZWRGb3Jtc3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gKCFtb2RpZmllZEZvcm1zdHNbaSArIDFdID8gbnVsbCA6IG1vZGlmaWVkRm9ybXN0c1tpICsgMV0ucGFyZW50Tm9kZSkpIGNvbnRpbnVlO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpc0NvbXAgPSB1dGlsLmlzQ29tcG9uZW50KGYpO1xuICAgICAgICAgICAgICAgICAgICBodG1sID0gaXNDb21wID8gJycgOiBmLmlubmVySFRNTC5yZXBsYWNlKC8oPyE+KVxccysoPz08KXxcXG4vZywgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGYsIGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5wYXJlbnROb2RlID09PSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT09IGYucGFyZW50Tm9kZSB8fCBpc0NvbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJlZUVsZW1lbnQsIHBhcmVudE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyZWVFbGVtZW50LCBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gZi5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZnJlZUVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBmcmVlRWxlbWVudC5ub2RlTmFtZSA9PT0gbmV4dC5ub2RlTmFtZSAmJiB1dGlsLmlzU2FtZUF0dHJpYnV0ZXMoZnJlZUVsZW1lbnQsIG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MICs9ICc8QlI+JyArIG5leHQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQgPSB0YWcuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGZyZWVFbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MID0gKChmaXJzdCB8fCAhaHRtbCB8fCAhaW5uZXIgfHwgLzxicj4kL2kudGVzdChodG1sKSkgPyBodG1sIDogaHRtbCArICc8QlI+JykgKyBpbm5lcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJlZUVsZW1lbnQsIGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGYubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBmcmVlRWxlbWVudC5ub2RlTmFtZSA9PT0gbmV4dC5ub2RlTmFtZSAmJiB1dGlsLmlzU2FtZUF0dHJpYnV0ZXMoZnJlZUVsZW1lbnQsIG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MICs9ICc8QlI+JyArIG5leHQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IGZyZWVFbGVtZW50LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICYmIGZyZWVFbGVtZW50Lm5vZGVOYW1lID09PSBwcmV2Lm5vZGVOYW1lICYmIHV0aWwuaXNTYW1lQXR0cmlidXRlcyhmcmVlRWxlbWVudCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmlubmVySFRNTCArPSAnPEJSPicgKyBmcmVlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGZyZWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNDb21wKSB1dGlsLnJlbW92ZUl0ZW0oZik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWh0bWwpIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoZm9jdXNFbGVtZW50LCAwLCBmb2N1c0VsZW1lbnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVwbGFjZSBmb3JtYXRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtb2RpZmllZEZvcm1zdHMubGVuZ3RoLCBub2RlLCBuZXdGb3JtYXQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbW9kaWZpZWRGb3Jtc3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IHZhbHVlLnRvTG93ZXJDYXNlKCkgfHwgKG5vZGUuY2xhc3NOYW1lLm1hdGNoKC8oXFxzfF4pX19zZV9fZm9ybWF0X19bXlxcc10rLykgfHwgWycnXSlbMF0udHJpbSgpICE9PSBjbGFzc05hbWUpICYmICF1dGlsLmlzQ29tcG9uZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtYXQgPSB0YWcuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29weUZvcm1hdEF0dHJpYnV0ZXMobmV3Rm9ybWF0LCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5pbm5lckhUTUwgPSBub2RlLmlubmVySFRNTDtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Rm9ybWF0LCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgZmlyc3QgPSBuZXdGb3JtYXQgfHwgbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEpIGxhc3QgPSBuZXdGb3JtYXQgfHwgbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZSh1dGlsLmdldE5vZGVGcm9tUGF0aChmaXJzdFBhdGgsIGZpcnN0KSwgc3RhcnRPZmZzZXQsIHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGxhc3RQYXRoLCBsYXN0KSwgZW5kT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE5NyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdsaW5lSGVpZ2h0JyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmxpbmVIZWlnaHQgPSB7XG4gICAgICAgICAgICBfc2l6ZUxpc3Q6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50U2l6ZTogLTFcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG5cbiAgICAgICAgY29udGV4dC5saW5lSGVpZ2h0Ll9zaXplTGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllcic7XG5cbiAgICAgICAgY29uc3Qgc2l6ZUxpc3QgPSAhb3B0aW9uLmxpbmVIZWlnaHRzID8gW1xuICAgICAgICAgICAge3RleHQ6ICcxJywgdmFsdWU6IDF9LFxuICAgICAgICAgICAge3RleHQ6ICcxLjE1JywgdmFsdWU6IDEuMTV9LFxuICAgICAgICAgICAge3RleHQ6ICcxLjUnLCB2YWx1ZTogMS41fSxcbiAgICAgICAgICAgIHt0ZXh0OiAnMicsIHZhbHVlOiAyfVxuICAgICAgICBdIDogb3B0aW9uLmxpbmVIZWlnaHRzO1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRlZmF1bHRfdmFsdWUgc2UtYnRuLWxpc3RcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuZGVmYXVsdCArICdcIj4oJyArIGxhbmcudG9vbGJhci5kZWZhdWx0ICsgJyk8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzaXplTGlzdC5sZW5ndGgsIHRleHQsIHNpemU7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgc2l6ZSA9IHNpemVMaXN0W2ldO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIHNpemUudmFsdWUgKyAnXCIgdGl0bGU9XCInICsgc2l6ZS50ZXh0ICsgJ1wiPicgKyBzaXplLnRleHQgKyAnPC9idXR0b24+PC9saT4nO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QgKz0gJzwvdWw+PC9kaXY+JztcblxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9IGxpc3Q7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHRDb250ZXh0ID0gdGhpcy5jb250ZXh0LmxpbmVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHNpemVMaXN0ID0gbGluZUhlaWdodENvbnRleHQuX3NpemVMaXN0O1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnV0aWwuZ2V0Rm9ybWF0RWxlbWVudCh0aGlzLmdldFNlbGVjdGlvbk5vZGUoKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gIWZvcm1hdCA/ICcnIDogZm9ybWF0LnN0eWxlLmxpbmVIZWlnaHQgKyAnJztcblxuICAgICAgICBpZiAoY3VycmVudFNpemUgIT09IGxpbmVIZWlnaHRDb250ZXh0LmN1cnJlbnRTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2l6ZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPT09IHNpemVMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZUhlaWdodENvbnRleHQuY3VycmVudFNpemUgPSBjdXJyZW50U2l6ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghL15CVVRUT04kL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgfHwgJyc7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZm9ybWF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZm9ybWF0c1tpXS5zdHlsZS5saW5lSGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAncGFyYWdyYXBoU3R5bGUnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQucGFyYWdyYXBoU3R5bGUgPSB7XG4gICAgICAgICAgICBfY2xhc3NMaXN0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXG4gICAgICAgIGxldCBsaXN0RGl2ID0gdGhpcy5zZXRTdWJtZW51KGNvcmUpO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcigndWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja1VwLmJpbmQoY29yZSkpO1xuXG4gICAgICAgIGNvbnRleHQucGFyYWdyYXBoU3R5bGUuX2NsYXNzTGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtZm9ybWF0JztcblxuICAgICAgICBjb25zdCBtZW51TGFuZyA9IGNvcmUubGFuZy5tZW51O1xuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHtcbiAgICAgICAgICAgIHNwYWNlZDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1lbnVMYW5nLnNwYWNlZCxcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3Atc3BhY2VkJyxcbiAgICAgICAgICAgICAgICBfY2xhc3M6ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9yZGVyZWQ6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtZW51TGFuZy5ib3JkZXJlZCxcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3AtYm9yZGVyZWQnLFxuICAgICAgICAgICAgICAgIF9jbGFzczogJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogbWVudUxhbmcubmVvbixcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3AtbmVvbicsXG4gICAgICAgICAgICAgICAgX2NsYXNzOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSAhb3B0aW9uLnBhcmFncmFwaFN0eWxlcyB8fCBvcHRpb24ucGFyYWdyYXBoU3R5bGVzLmxlbmd0aCA9PT0gMCA/IFsnc3BhY2VkJywgJ2JvcmRlcmVkJywgJ25lb24nXSA6IG9wdGlvbi5wYXJhZ3JhcGhTdHlsZXM7XG5cbiAgICAgICAgbGV0IGxpc3QgPSAnPGRpdiBjbGFzcz1cInNlLWxpc3QtaW5uZXJcIj48dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhcmFncmFwaFN0eWxlcy5sZW5ndGgsIHAsIG5hbWUsIGF0dHJzLCBfY2xhc3M7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgcCA9IHBhcmFncmFwaFN0eWxlc1tpXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdHlsZSA9IGRlZmF1bHRMaXN0W3AudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZhdWx0U3R5bGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHAgPSBkZWZhdWx0U3R5bGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hbWUgPSBwLm5hbWU7XG4gICAgICAgICAgICBhdHRycyA9IHAuY2xhc3MgPyAnIGNsYXNzPVwiJyArIHAuY2xhc3MgKyAnXCInIDogJyc7XG4gICAgICAgICAgICBfY2xhc3MgPSBwLl9jbGFzcztcblxuICAgICAgICAgICAgbGlzdCArPSAnPGxpPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0JyArIChfY2xhc3MgPyAnICcgKyBfY2xhc3M6ICcnKSArICdcIiBkYXRhLXZhbHVlPVwiJyArIHAuY2xhc3MgKyAnXCIgdGl0bGU9XCInICsgbmFtZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYnICsgYXR0cnMgKyAnPicgKyBuYW1lICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGV4dCA9IHRoaXMuY29udGV4dC5wYXJhZ3JhcGhTdHlsZTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoTGlzdCA9IHBhcmFncmFwaENvbnRleHQuX2NsYXNzTGlzdDtcbiAgICAgICAgY29uc3QgY3VycmVudEZvcm1hdCA9IHRoaXMudXRpbC5nZXRGb3JtYXRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGFyYWdyYXBoTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5oYXNDbGFzcyhjdXJyZW50Rm9ybWF0LCBwYXJhZ3JhcGhMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhwYXJhZ3JhcGhMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhwYXJhZ3JhcGhMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja1VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICBcbiAgICAgICAgd2hpbGUgKCEvXlVMJC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgYnJlYWs7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmdldFJhbmdlX2FkZExpbmUodGhpcy5nZXRSYW5nZSgpLCBudWxsKTtcbiAgICAgICAgICAgIHNlbGVjdGVkRm9ybXN0cyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50cygpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybXN0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBmb3JtYXQgY2xhc3NcbiAgICAgICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSB0aGlzLnV0aWwuaGFzQ2xhc3ModGFyZ2V0LCAnYWN0aXZlJykgPyB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLnV0aWwpIDogdGhpcy51dGlsLmFkZENsYXNzLmJpbmQodGhpcy51dGlsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkRm9ybXN0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdG9nZ2xlQ2xhc3Moc2VsZWN0ZWRGb3Jtc3RzW2ldLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAndGV4dFN0eWxlJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRleHRTdHlsZSA9IHtcbiAgICAgICAgICAgIF9zdHlsZUxpc3Q6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG5cbiAgICAgICAgY29udGV4dC50ZXh0U3R5bGUuX3N0eWxlTGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGwsIGxpc3RVbCA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtZm9ybWF0JztcblxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHtcbiAgICAgICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb3JlLmxhbmcubWVudS5jb2RlLFxuICAgICAgICAgICAgICAgIGNsYXNzOiAnX19zZV9fdC1jb2RlJyxcbiAgICAgICAgICAgICAgICB0YWc6ICdjb2RlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2x1Y2VudDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvcmUubGFuZy5tZW51LnRyYW5zbHVjZW50LFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnb3BhY2l0eTogMC41OycsXG4gICAgICAgICAgICAgICAgdGFnOiAnc3BhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hhZG93OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogY29yZS5sYW5nLm1lbnUuc2hhZG93LFxuICAgICAgICAgICAgICAgIGNsYXNzOiAnX19zZV9fdC1zaGFkb3cnLFxuICAgICAgICAgICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdHlsZUxpc3QgPSAhb3B0aW9uLnRleHRTdHlsZXMgPyBjb3JlLl93Lk9iamVjdC5rZXlzKGRlZmF1bHRMaXN0KSA6IG9wdGlvbi50ZXh0U3R5bGVzO1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+PHVsIGNsYXNzPVwic2UtbGlzdC1iYXNpY1wiPic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUxpc3QubGVuZ3RoLCB0LCB0YWcsIG5hbWUsIGF0dHJzLCBjb21tYW5kLCB2YWx1ZSwgX2NsYXNzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHQgPSBzdHlsZUxpc3RbaV07XG4gICAgICAgICAgICBhdHRycyA9ICcnLCB2YWx1ZSA9ICcnLCBjb21tYW5kID0gW107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U3R5bGUgPSBkZWZhdWx0TGlzdFt0LnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgICAgICAgIGlmICghZGVmYXVsdFN0eWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0ID0gZGVmYXVsdFN0eWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYW1lID0gdC5uYW1lO1xuICAgICAgICAgICAgdGFnID0gdC50YWcgfHwgJ3NwYW4nO1xuICAgICAgICAgICAgX2NsYXNzID0gdC5fY2xhc3M7XG5cbiAgICAgICAgICAgIGlmICh0LnN0eWxlKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMgKz0gJyBzdHlsZT1cIicgKyB0LnN0eWxlICsgJ1wiJztcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0LnN0eWxlLnJlcGxhY2UoLzpbXjtdKyg7fCQpXFxzKi9nLCAnLCcpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQucHVzaCgnc3R5bGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0LmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMgKz0gJyBjbGFzcz1cIicgKyB0LmNsYXNzICsgJ1wiJztcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnLicgKyB0LmNsYXNzLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcsLicpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQucHVzaCgnY2xhc3MnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8sJC8sICcnKTtcblxuICAgICAgICAgICAgbGlzdCArPSAnPGxpPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0JyArIChfY2xhc3MgPyAnICcgKyBfY2xhc3M6ICcnKSArICdcIiBkYXRhLWNvbW1hbmQ9XCInICsgdGFnICsgJ1wiIGRhdGEtdmFsdWU9XCInICsgdmFsdWUgKyAnXCIgdGl0bGU9XCInICsgbmFtZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwnICsgdGFnICsgYXR0cnMgKyAnPicgKyBuYW1lICsgICc8LycgKyB0YWcgKyAnPicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcbiAgICAgICAgY29uc3QgdGV4dFN0eWxlQ29udGV4dCA9IHRoaXMuY29udGV4dC50ZXh0U3R5bGU7XG4gICAgICAgIGNvbnN0IHN0eWxlQnV0dG9uTGlzdCA9IHRleHRTdHlsZUNvbnRleHQuX3N0eWxlTGlzdDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uTm9kZSA9IHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUJ1dHRvbkxpc3QubGVuZ3RoLCBidG4sIGRhdGEsIGFjdGl2ZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBidG4gPSBzdHlsZUJ1dHRvbkxpc3RbaV07XG4gICAgICAgICAgICBkYXRhID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IHYgPSAwLCBub2RlLCB2YWx1ZTsgdiA8IGRhdGEubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc2VsZWN0aW9uTm9kZTtcbiAgICAgICAgICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAmJiAhdXRpbC5pc0Zvcm1hdEVsZW1lbnQobm9kZSkgJiYgIXV0aWwuaXNDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhW3ZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KHZhbHVlKSA/IHV0aWwuaGFzQ2xhc3Mobm9kZSwgdmFsdWUucmVwbGFjZSgvXlxcLi8sICcnKSkgOiAhIW5vZGUuc3R5bGVbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghYWN0aXZlKSBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWN0aXZlID8gdXRpbC5hZGRDbGFzcyhidG4sICdhY3RpdmUnKSA6IHV0aWwucmVtb3ZlQ2xhc3MoYnRuLCAnYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIGxldCBjb21tYW5kID0gbnVsbCwgdGFnID0gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL1VML2kudGVzdCh0YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGFnID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrU3R5bGVzID0gdGFnLnN0eWxlLmNzc1RleHQucmVwbGFjZSgvOi4rKDt8JCkvZywgJywnKS5zcGxpdCgnLCcpO1xuICAgICAgICBjaGVja1N0eWxlcy5wb3AoKTtcblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gdGFnLmNsYXNzTGlzdDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNoZWNrU3R5bGVzLnB1c2goJy4nICsgY2xhc3Nlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmhhc0NsYXNzKHRhcmdldCwgJ2FjdGl2ZScpID8gbnVsbCA6IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICBjb25zdCByZW1vdmVOb2RlcyA9IG5ld05vZGUgPyBudWxsIDogW3RhZy5ub2RlTmFtZV07XG4gICAgICAgIHRoaXMubm9kZUNoYW5nZShuZXdOb2RlLCBjaGVja1N0eWxlcywgcmVtb3ZlTm9kZXMsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGZpbGVCcm93c2VyIGZyb20gJy4uL21vZHVsZXMvZmlsZUJyb3dzZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ltYWdlR2FsbGVyeScsXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZmlsZUJyb3dzZXJdKTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmltYWdlR2FsbGVyeSA9IHtcbiAgICAgICAgICAgIHRpdGxlOiBjb3JlLmxhbmcudG9vbGJhci5pbWFnZUdhbGxlcnksIC8vIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBGaWxlIGJyb3dzZXIgd2luZG93IHRpdGxlLlxuICAgICAgICAgICAgdXJsOiBjb3JlLm9wdGlvbnMuaW1hZ2VHYWxsZXJ5VXJsLCAvLyBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVCcm93c2VyIC0gRmlsZSBzZXJ2ZXIgdXJsLlxuICAgICAgICAgICAgbGlzdENsYXNzOiAnc2UtaW1hZ2UtbGlzdCcsIC8vIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBDbGFzcyBuYW1lIG9mIGxpc3QgZGl2LlxuICAgICAgICAgICAgaXRlbVRlbXBsYXRlSGFuZGxlcjogdGhpcy5kcmF3SXRlbXMsIC8vIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBGdW5jdGlvbiB0aGF0IGRlZmluZXMgdGhlIEhUTUwgb2YgYW4gZmlsZSBpdGVtLlxuICAgICAgICAgICAgc2VsZWN0b3JIYW5kbGVyOiB0aGlzLnNldEltYWdlLmJpbmQoY29yZSksIC8vIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBGdW5jdGlvbiB0aGF0IGFjdGlvbiB3aGVuIGl0ZW0gY2xpY2suXG4gICAgICAgICAgICBjb2x1bW5TaXplOiA0IC8vIEBPcHRpb24gQE92ZXJyaWRlIGZpbGVCcm93c2VyIC0gTnVtYmVyIG9mIFwiZGl2LnNlLWZpbGUtaXRlbS1jb2x1bW5cIiB0byBiZSBjcmVhdGVkIChkZWZhdWx0OiA0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlQnJvd3NlclxuICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIGEgZmlsZSBicm93c2VyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gc2VsZWN0b3JIYW5kbGVyIFdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGFzIGFuIGFyZ3VtZW50IHZhbHVlLCBpdCBzdWJzdGl0dXRlcyBcImNvbnRleHQuc2VsZWN0b3JIYW5kbGVyXCIuXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKHNlbGVjdG9ySGFuZGxlcikge1xuICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIub3Blbi5jYWxsKHRoaXMsICdpbWFnZUdhbGxlcnknLCBzZWxlY3RvckhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVCcm93c2VyXG4gICAgICogQGRlc2NyaXB0aW9uIERlZmluZSB0aGUgSFRNTCBvZiB0aGUgaXRlbSB0byBiZSBwdXQgaW4gXCJkaXYuc2UtZmlsZS1pdGVtLWNvbHVtblwiLlxuICAgICAqIEZvcm1hdDogW1xuICAgICAqICAgICAgeyBzcmM6IFwiaW1hZ2Ugc3JjXCIsIG5hbWU6IFwibmFtZShAb3B0aW9uKVwiLCBhbHQ6IFwiaW1hZ2UgYWx0KEBvcHRpb24pXCIsIHRhZzogXCJ0YWcgbmFtZShAb3B0aW9uKVwiIH1cbiAgICAgKiBdXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gSXRlbSBvZiB0aGUgcmVzcG9uc2UgZGF0YSdzIGFycmF5XG4gICAgICovXG4gICAgZHJhd0l0ZW1zOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBjb25zdCBzcmNOYW1lID0gaXRlbS5zcmMuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICAgICAgcmV0dXJuICAnPGRpdiBjbGFzcz1cInNlLWZpbGUtaXRlbS1pbWdcIj48aW1nIHNyYz1cIicgKyBpdGVtLnNyYyArICdcIiBhbHQ9XCInICsgKGl0ZW0uYWx0IHx8IHNyY05hbWUpICsgJ1wiIGRhdGEtY29tbWFuZD1cInBpY2tcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWltZy1uYW1lIHNlLWZpbGUtbmFtZS1iYWNrXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1pbWctbmFtZSBfX3NlX19pbWdfbmFtZVwiPicgKyAoaXRlbS5uYW1lIHx8IHNyY05hbWUpICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIH0sXG5cbiAgICBzZXRJbWFnZTogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB0aGlzLmNhbGxQbHVnaW4oJ2ltYWdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHtuYW1lOiB0YXJnZXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcuX19zZV9faW1nX25hbWUnKS50ZXh0Q29udGVudCwgc2l6ZTogMH07XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW1hZ2UuX2FsdFRleHQgPSB0YXJnZXQuYWx0O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLmNyZWF0ZV9pbWFnZS5jYWxsKHRoaXMsIHRhcmdldC5zcmMsICcnLCBmYWxzZSwgdGhpcy5jb250ZXh0LmltYWdlLl9vcmlnaW5fdywgdGhpcy5jb250ZXh0LmltYWdlLl9vcmlnaW5faCwgJ25vbmUnLCBmaWxlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBudWxsKTtcbiAgICB9XG59OyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDIwIEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAvLyBydGwgaWNvblxuICAgcnRsOiB7XG4gICAgICBpdGFsaWM6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEwLjUgMTUuOFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0wLjMsMC4xYzAuMywwLDAuNSwwLDAuNywwYzEsMC4xLDEuNywwLjEsMi4yLDAuMUg0TDcuMiwwbDAuMiwxLjFIN2MtMC41LDAtMSwwLjEtMS41LDAuM3YwLjRsMC4zLDEuOUw2LDQuNEw2LjMsNiBsMC4xLDAuNGwwLjEsMC41YzAuMSwwLjIsMC4xLDAuNCwwLjIsMC43czAuMSwwLjYsMC4yLDAuOUw3LDkuMWwwLjYsMi44bDAuMywxLjRjMC4xLDAuNCwwLjIsMC43LDAuNCwxYzAuNCwwLjIsMC44LDAuMywxLjIsMC40IGwwLjgsMC4ybDAuMiwwLjlsLTEuMSwwYy0wLjktMC4xLTEuNS0wLjEtMS44LTAuMWgtMmMtMC45LDAuMS0xLjQsMC4yLTEuNSwwLjJjLTAuMSwwLTAuMiwwLTAuMywwSDMuNGMtMC4xLDAtMC4yLDAtMC4yLDAgbC0wLjEtMC40YzAtMC4yLTAuMS0wLjQtMC4xLTAuNmwwLjctMC4xYzAuNCwwLDAuOC0wLjEsMS4yLTAuMmMwLTAuMSwwLTAuMiwwLTAuM2wtMC4xLTAuNWwtMC40LTIuNEw0LDkuNkwzLjQsNi40IEMzLjIsNS43LDMsNC43LDIuNywzLjNjMC0wLjMtMC4xLTAuNS0wLjEtMC44QzIuNSwyLjEsMi40LDEuOSwyLjMsMS42QzIsMS40LDEuNiwxLjMsMS4zLDEuMkMwLjksMS4yLDAuNSwxLjEsMC4yLDAuOUwwLDAuNEwwLDAgTDAuMywwLjFMMC4zLDAuMXpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICBpbmRlbnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTIuNFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PGc+PHBhdGggZD1cIk0xNS41LDEwLjFMMTUuNSwxMC4xYzAuMSwwLDAuMywwLjEsMC4zLDAuM3YxLjdjMCwwLjEsMCwwLjEtMC4xLDAuMmMtMC4xLDAuMS0wLjEsMC4xLTAuMiwwLjFsLTE1LjIsMCBjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCwxMi4yLDAsMTIuMiwwLDEyLjFsMC0xLjdjMC0wLjEsMC0wLjEsMC4xLTAuMmMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMUMwLjMsMTAuMSwxNS41LDEwLjEsMTUuNSwxMC4xeiBNOS44LDYuN2MwLjEsMCwwLjEsMCwwLjIsMC4xQzEwLjEsNi45LDEwLjEsNywxMC4xLDd2MS43YzAsMC4xLDAsMC4yLTAuMSwwLjJDMTAsOSw5LjksOSw5LjgsOUwwLjMsOUMwLjIsOSwwLjEsOSwwLjEsOC45IEMwLDguOSwwLDguOCwwLDguN1Y3QzAsNywwLDYuOSwwLjEsNi44YzAuMS0wLjEsMC4xLTAuMSwwLjItMC4xQzAuMyw2LjcsOS44LDYuNyw5LjgsNi43eiBNMC4zLDMuNGg5LjZoMGMwLjEsMCwwLjMsMC4xLDAuMywwLjMgdjEuN3YwYzAsMC4xLTAuMSwwLjMtMC4zLDAuM0gwLjNjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCw1LjUsMCw1LjQsMCw1LjNWMy42YzAtMC4xLDAtMC4xLDAuMS0wLjJDMC4xLDMuNCwwLjIsMy40LDAuMywzLjQgTDAuMywzLjR6IE0wLjMsMGwxNS4yLDBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMC4xLDAuMSwwLjEsMC4xLDAuMlYyYzAsMC4xLDAsMC4yLTAuMSwwLjJjLTAuMSwwLjEtMC4xLDAuMS0wLjIsMC4xSDAuMyBjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCwyLjEsMCwyLDAsMmwwLTEuN2MwLTAuMSwwLTAuMSwwLjEtMC4yQzAuMSwwLDAuMiwwLDAuMywwelwiLz48L2c+PHBhdGggZD1cIk0xMy4xLDMuNUwxNS43LDZjMC4xLDAuMSwwLjEsMC4zLDAsMC40bC0yLjUsMi41QzEzLjEsOSwxMyw5LDEyLjksOWMtMC4xLDAtMC4xLDAtMC4yLTAuMWMtMC4xLTAuMS0wLjEtMC4xLTAuMS0wLjJWMy43IGMwLTAuMSwwLTAuMiwwLjEtMC4yYzAuMS0wLjEsMC4xLTAuMSwwLjItMC4xQzEzLDMuNCwxMy4xLDMuNCwxMy4xLDMuNXpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICBvdXRkZW50OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43IDEyLjRcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPjxnPjxnPjxwYXRoIGQ9XCJNMTUuNSwxMC4xTDE1LjUsMTAuMWMwLjEsMCwwLjMsMC4xLDAuMywwLjN2MS43YzAsMC4xLDAsMC4xLTAuMSwwLjJjLTAuMSwwLjEtMC4xLDAuMS0wLjIsMC4xbC0xNS4yLDAgYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsMTIuMiwwLDEyLjIsMCwxMi4xbDAtMS43YzAtMC4xLDAtMC4xLDAuMS0wLjJjMC4xLTAuMSwwLjEtMC4xLDAuMi0wLjFDMC4zLDEwLjEsMTUuNSwxMC4xLDE1LjUsMTAuMXogTTkuOCw2LjdjMC4xLDAsMC4xLDAsMC4yLDAuMUMxMC4xLDYuOSwxMC4xLDcsMTAuMSw3djEuN2MwLDAuMSwwLDAuMi0wLjEsMC4yQzEwLDksOS45LDksOS44LDlMMC4zLDlDMC4yLDksMC4xLDksMC4xLDguOSBDMCw4LjksMCw4LjgsMCw4LjdWN0MwLDcsMCw2LjksMC4xLDYuOGMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMUMwLjMsNi43LDkuOCw2LjcsOS44LDYuN3ogTTAuMywzLjRoOS42aDBjMC4xLDAsMC4zLDAuMSwwLjMsMC4zIHYxLjd2MGMwLDAuMS0wLjEsMC4zLTAuMywwLjNIMC4zYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsNS41LDAsNS40LDAsNS4zVjMuNmMwLTAuMSwwLTAuMSwwLjEtMC4yQzAuMSwzLjQsMC4yLDMuNCwwLjMsMy40IEwwLjMsMy40eiBNMC4zLDBsMTUuMiwwYzAuMSwwLDAuMSwwLDAuMiwwLjFjMC4xLDAuMSwwLjEsMC4xLDAuMSwwLjJWMmMwLDAuMSwwLDAuMi0wLjEsMC4yYy0wLjEsMC4xLTAuMSwwLjEtMC4yLDAuMUgwLjMgYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsMi4xLDAsMiwwLDJsMC0xLjdjMC0wLjEsMC0wLjEsMC4xLTAuMkMwLjEsMCwwLjIsMCwwLjMsMHpcIi8+PC9nPjxwYXRoIGQ9XCJNMTUuNSwzLjRjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMC4xLDAuMSwwLjEsMC4xLDAuMnY1LjFjMCwwLjEsMCwwLjEtMC4xLDAuMkMxNS42LDksMTUuNSw5LDE1LjUsOSBjLTAuMSwwLTAuMSwwLTAuMi0wLjFsLTIuNS0yLjVjLTAuMS0wLjEtMC4xLTAuMywwLTAuNGwyLjUtMi41QzE1LjMsMy40LDE1LjQsMy40LDE1LjUsMy40elwiLz48L2c+PC9zdmc+JyxcbiAgICAgIGxpc3RfYnVsbGV0czogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNyAxMi40XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj48Zz48cGF0aCBkPVwiTTEyLjQsMTAuN2MwLDAuOSwwLjgsMS43LDEuNywxLjdjMC45LDAsMS43LTAuOCwxLjctMS43QzE1LjcsOS44LDE1LDksMTQuMSw5Yy0wLjQsMC0wLjksMC4yLTEuMiwwLjUgQzEyLjUsOS44LDEyLjQsMTAuMiwxMi40LDEwLjdDMTIuNCwxMC43LDEyLjQsMTAuNywxMi40LDEwLjd6IE0xMi40LDYuMmMwLDAuOSwwLjgsMS43LDEuNywxLjdjMC40LDAsMC45LTAuMiwxLjItMC41IGMwLjMtMC4zLDAuNC0wLjcsMC40LTEuMWMwLTAuOS0wLjctMS43LTEuNi0xLjdDMTMuMSw0LjYsMTIuNCw1LjMsMTIuNCw2LjJDMTIuNCw2LjIsMTIuNCw2LjIsMTIuNCw2LjJ6IE0wLDkuOHYxLjcgYzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFsMTAuNywwYzAsMCwwLDAsMCwwYzAuMSwwLDAuMy0wLjEsMC4zLTAuM1Y5LjhjMC0wLjEsMC0wLjEtMC4xLTAuMiBDMTEuMSw5LjYsMTEsOS42LDExLDkuNmwtMTAuNywwYy0wLjEsMC0wLjEsMC0wLjIsMC4xQzAsOS43LDAsOS44LDAsOS44TDAsOS44eiBNMTIuOSwyLjljMC4zLDAuMywwLjcsMC41LDEuMiwwLjUgYzAuNCwwLDAuOS0wLjIsMS4yLTAuNWMwLjctMC43LDAuNy0xLjcsMC0yLjRDMTQuOSwwLjIsMTQuNSwwLDE0LjEsMGMtMC40LDAtMC45LDAuMi0xLjIsMC41Yy0wLjMsMC4zLTAuNSwwLjctMC41LDEuMiBDMTIuNCwyLjEsMTIuNSwyLjYsMTIuOSwyLjl6IE0wLDUuM1Y3YzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFIMTFjMC4xLDAsMC4xLDAsMC4yLTAuMSBjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWNS4zYzAsMCwwLDAsMCwwYzAtMC4xLTAuMS0wLjMtMC4zLTAuM0gwLjNjLTAuMSwwLTAuMSwwLTAuMiwwLjFDMCw1LjIsMCw1LjMsMCw1LjNMMCw1LjN6IE0wLDAuOHYxLjcgYzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFoMTAuN2MwLjEsMCwwLjEsMCwwLjItMC4xYzAsMCwwLjEtMC4xLDAuMS0wLjJWMC44YzAtMC4xLDAtMC4xLTAuMS0wLjIgYzAtMC4xLTAuMS0wLjEtMC4yLTAuMUgwLjNjLTAuMSwwLTAuMSwwLTAuMiwwLjFDMCwwLjcsMCwwLjgsMCwwLjhMMCwwLjh6XCIvPjwvZz48L3N2Zz4nLFxuICAgICAgbGlzdF9udW1iZXI6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTUuN1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0wLDExLjVsMCwxLjdjMCwwLjEsMCwwLjEsMC4xLDAuMmMwLjEsMC4xLDAuMSwwLjEsMC4yLDAuMUgxMWMwLjEsMCwwLjIsMCwwLjItMC4xYzAuMS0wLjEsMC4xLTAuMSwwLjEtMC4ydi0xLjcgYzAtMC4xLDAtMC4xLTAuMS0wLjJjLTAuMS0wLjEtMC4xLTAuMS0wLjItMC4xSDAuM2MtMC4xLDAtMC4yLDAtMC4yLDAuMUMwLDExLjQsMCwxMS40LDAsMTEuNUwwLDExLjV6IE0wLDguN2MwLDAuMSwwLDAuMSwwLjEsMC4yIEMwLjEsOC45LDAuMiw5LDAuMyw5SDExYzAuMSwwLDAuMiwwLDAuMi0wLjFjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWN2MwLTAuMSwwLTAuMS0wLjEtMC4yYy0wLjEtMC4xLTAuMS0wLjEtMC4yLTAuMWwtMTAuNywwIGMtMC4xLDAtMC4yLDAtMC4yLDAuMUMwLDYuOCwwLDYuOSwwLDdDMCw3LDAsOC43LDAsOC43eiBNMCwyLjV2MS43YzAsMC4xLDAsMC4xLDAuMSwwLjJjMCwwLDAuMSwwLjEsMC4yLDAuMWwxMC43LDAgYzAuMSwwLDAuMiwwLDAuMi0wLjFjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWMi40YzAtMC4xLDAtMC4xLTAuMS0wLjJjLTAuMSwwLTAuMSwwLTAuMiwwSDAuM2MtMC4xLDAtMC4xLDAtMC4yLDAgQzAsMi4zLDAsMi40LDAsMi41TDAsMi41elwiLz48L2c+PHBhdGggZD1cIk0xNS42LDE0LjJjMC0wLjMtMC4xLTAuNi0wLjMtMC44Yy0wLjItMC4yLTAuNC0wLjQtMC43LTAuNGwwLjktMXYtMC44aC0yLjl2MS4zaDAuOXYtMC41aDAuOWwwLDBjLTAuMSwwLjEtMC4yLDAuMi0wLjMsMC4zIHMtMC4yLDAuMy0wLjQsMC41bC0wLjMsMC4zbDAuMiwwLjVjMC42LDAsMC45LDAuMSwwLjksMC41YzAsMC4xLTAuMSwwLjMtMC4yLDAuNGMtMC4xLDAuMS0wLjMsMC4xLTAuNCwwLjFjLTAuMywwLTAuNy0wLjEtMC45LTAuMyBsLTAuNSwwLjhjMC40LDAuNCwwLjksMC42LDEuNSwwLjZjMC40LDAsMC45LTAuMSwxLjItMC40QzE1LjUsMTUuMSwxNS42LDE0LjcsMTUuNiwxNC4yelwiLz48cGF0aCBkPVwiTTE1LjYsOC43aC0wLjl2MC41aC0xLjFjMC0wLjIsMC4yLTAuNCwwLjQtMC41YzAuMi0wLjIsMC40LTAuMywwLjctMC40YzAuMy0wLjIsMC41LTAuMywwLjctMC42YzAuMi0wLjIsMC4zLTAuNSwwLjMtMC44IGMwLTAuNC0wLjItMC44LTAuNS0xYy0wLjYtMC40LTEuNC0wLjUtMi0wLjFjLTAuMywwLjItMC41LDAuNC0wLjYsMC43TDEzLjMsN2MwLjEtMC4zLDAuNC0wLjUsMC43LTAuNWMwLjEsMCwwLjMsMCwwLjMsMC4xIGMwLjEsMC4xLDAuMSwwLjIsMC4xLDAuM2MwLDAuMi0wLjEsMC4zLTAuMiwwLjRjLTAuMiwwLjEtMC4zLDAuMy0wLjUsMC40Yy0wLjIsMC4xLTAuNCwwLjMtMC42LDAuNGMtMC4yLDAuMi0wLjQsMC40LTAuNSwwLjYgYy0wLjEsMC4yLTAuMiwwLjUtMC4yLDAuOGMwLDAuMiwwLDAuMywwLDAuNWgzLjJMMTUuNiw4LjdMMTUuNiw4Ljd6XCIvPjxwYXRoIGQ9XCJNMTUuNiwzLjZoLTFWMGgtMC45bC0xLjIsMS4xbDAuNiwwLjdjMC4yLTAuMSwwLjMtMC4zLDAuNC0wLjVsMCwwdjIuMmgtMC45djAuOWgzTDE1LjYsMy42TDE1LjYsMy42elwiLz48L3N2Zz4nLFxuICAgICAgbGluazogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNyAxNS43XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj48Zz48cGF0aCBkPVwiTTcuNCw5LjlsMy4xLDMuMWMwLjMsMC4zLDAuOCwwLjUsMS4zLDAuNWMwLjUsMCwwLjktMC4yLDEuMy0wLjVjMCwwLDAsMCwwLDBjMC43LTAuNywwLjctMS45LDAtMi42TDkuOSw3LjMgYzAtMC4xLDAtMC4yLDAtMC4zQzkuOSw3LDEwLDcsMTAuMSw3bDIuMi0wLjJjMC4xLDAsMC4xLDAsMC4yLDAuMWwyLjEsMi4xYzAuNCwwLjQsMC43LDAuOCwwLjksMS4zYzAuMiwwLjUsMC4zLDEsMC4zLDEuNSBjMCwwLjUtMC4xLDEtMC4zLDEuNWMtMC44LDItMy4yLDMtNS4yLDIuMmMtMC41LTAuMi0wLjktMC41LTEuMy0wLjlsLTIuMS0yLjFjLTAuMSwwLTAuMS0wLjEtMC4xLTAuMkw3LDEwLjFDNywxMCw3LDkuOSw3LjEsOS45IEM3LjIsOS44LDcuMyw5LjksNy40LDkuOXogTTEuMiwxLjFDMS42LDAuNywyLDAuNCwyLjUsMC4zYzEtMC40LDIuMS0wLjQsMy4xLDBDNiwwLjQsNi41LDAuNyw2LjgsMS4xTDksMy4yQzksMy4zLDkuMSwzLjMsOSwzLjQgTDguOCw1LjZjMCwwLjEtMC4xLDAuMi0wLjIsMC4yYy0wLjEsMC4xLTAuMiwwLjEtMC4zLDBMNS4zLDIuN0M1LDIuMyw0LjUsMi4xLDQsMi4xYy0wLjUsMC0wLjksMC4yLTEuMywwLjVjMCwwLDAsMCwwLDAgQzIsMy40LDIsNC41LDIuNyw1LjJsMy4xLDMuMmMwLjEsMC4xLDAuMSwwLjIsMCwwLjNjMCwwLjEtMC4xLDAuMS0wLjIsMC4xTDMuNSw5QzMuNCw5LDMuNCw5LDMuMyw4LjlMMS4yLDYuOGMwLDAsMCwwLDAsMCBDLTAuNCw1LjItMC40LDIuNywxLjIsMS4xTDEuMiwxLjF6IE0xNC4zLDZoLTIuNmMwLDAsMCwwLDAsMGMtMC4xLDAtMC4yLTAuMS0wLjItMC4yYzAtMC4xLDAtMC4yLDAuMS0wLjNsMi41LTAuNyBjMC4xLDAsMC4xLDAsMC4yLDBjMC4xLDAsMC4xLDAuMSwwLjEsMC4ybDAuMSwwLjhjMCwwLjEsMCwwLjEtMC4xLDAuMkMxNC41LDYsMTQuNCw2LDE0LjMsNkwxNC4zLDZ6IE0xMC4yLDQuMSBjMCwwLjEtMC4xLDAuMi0wLjIsMC4ybDAsMGMwLDAsMCwwLDAsMEM5LjgsNC4yLDkuNyw0LjEsOS44LDRMOS43LDEuNGMwLTAuMSwwLTAuMSwwLjEtMC4yYzAuMSwwLDAuMSwwLDAuMiwwaDAuOCBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLDAuMSwwLDAuMSwwLDAuMkwxMC4yLDQuMUwxMC4yLDQuMXogTTEuNSw5LjdoMS4zaDEuM2MwLjEsMCwwLjIsMC4xLDAuMiwwLjJjMCwwLjEsMCwwLjItMC4xLDAuM2wtMi41LDAuNiBIMS42YzAsMC0wLjEsMC0wLjEsMGMtMC4xLDAtMC4xLTAuMS0wLjEtMC4yTDEuMiw5LjljMC0wLjEsMC0wLjEsMC4xLTAuMmMwLTAuMSwwLjEtMC4xLDAuMi0wLjFMMS41LDkuN3ogTTUuNiwxMS42IEM1LjYsMTEuNiw1LjYsMTEuNiw1LjYsMTEuNmMwLTAuMSwwLjEtMC4yLDAuMy0wLjFjMCwwLDAsMCwwLDBjMC4xLDAsMC4yLDAuMSwwLjIsMC4ydjIuNmMwLDAuMSwwLDAuMS0wLjEsMC4yIGMwLDAtMC4xLDAuMS0wLjIsMC4xTDUsMTQuNWMtMC4xLDAtMC4xLDAtMC4yLTAuMWMwLTAuMSwwLTAuMSwwLTAuMkw1LjYsMTEuNkw1LjYsMTEuNnpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICB1bmxpbms6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTUuN1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0xNC42LDE0LjZjMS42LTEuNiwxLjYtNC4xLDAtNS43bDAsMGwtMy4xLTMuMWwtMS4yLDEuNmwyLjksMi45YzAuNCwwLjQsMC42LDAuOSwwLjYsMS41YzAsMS4xLTAuOSwyLjEtMi4xLDIuMWwwLDAgYy0wLjYsMC0xLjEtMC4yLTEuNS0wLjZsLTAuNC0wLjRsLTEuNywxbDAuOCwwLjhDMTAuNCwxNi4yLDEzLDE2LjIsMTQuNiwxNC42TDE0LjYsMTQuNkwxNC42LDE0LjZ6IE0zLjYsNkMzLDUuOSwyLjYsNS41LDIuMyw1IFMxLjksNCwyLjEsMy40QzIuMywyLjksMi42LDIuNSwzLDIuMkMzLjUsMiw0LjEsMS45LDQuNiwybDMuMywxLjRsMC41LTJMNS4xLDAuMUM0LTAuMSwyLjksMCwyLDAuNUMxLjEsMS4xLDAuNCwxLjksMC4yLDMgQy0wLjEsNCwwLDUuMSwwLjYsNkMxLjEsNi45LDEuOSw3LjYsMyw3LjhsNS40LDJsMC41LTJMNi4yLDYuOUwzLjYsNnpcIi8+PC9nPjwvc3ZnPidcbiAgIH0sXG4gICAvLyBjb21tb24sIGx0ciBpY29uXG4gICByZWRvOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS41OSAxNC4xOFwiPjxnPjxwYXRoIGQ9XCJNMTEuNTgsMTguNDhhNi44NCw2Ljg0LDAsMSwxLDYuODUtNi44NXMwLC4yNiwwLC42N2E4LDgsMCwwLDEtLjIyLDEuNDRsLjkxLS41NWEuNTEuNTEsMCwwLDEsLjM2LDAsLjQ1LjQ1LDAsMCwxLC4yOS4yMi40Ny40NywwLDAsMSwuMDYuMzYuNDUuNDUsMCwwLDEtLjIyLjI5TDE3LjQyLDE1LjNsLS4xMiwwaC0uMjVsLS4xMi0uMDYtLjA5LS4wOS0uMDYtLjA3LDAtLjA2LS44Ny0yLjEyYS40My40MywwLDAsMSwwLS4zNy40OS40OSwwLDAsMSwuMjctLjI2LjQxLjQxLDAsMCwxLC4zNiwwLC41My41MywwLDAsMSwuMjcuMjZsLjQ0LDEuMDlhNi41MSw2LjUxLDAsMCwwLC4yNC0xLjM2LDQuNTgsNC41OCwwLDAsMCwwLS42NCw1LjgzLDUuODMsMCwwLDAtMS43My00LjE3LDUuODgsNS44OCwwLDAsMC04LjM0LDAsNS45LDUuOSwwLDAsMCw0LjE3LDEwLjA2LjUxLjUxLDAsMCwxLC4zMy4xNS40OC40OCwwLDAsMSwwLC42OC41My41MywwLDAsMS0uMzMuMTJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ4IC00LjU0KVwiLz48L2c+PC9zdmc+JyxcbiAgIHVuZG86ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjU5IDE0LjE4XCI+PGc+PHBhdGggZD1cIk01LDE0YS40My40MywwLDAsMS0uMjItLjI5LjQ2LjQ2LDAsMCwxLC4wNi0uMzYuNDMuNDMsMCwwLDEsLjI5LS4yMi41Ni41NiwwLDAsMSwuMzYsMGwuOTEuNTVhOC4yNyw4LjI3LDAsMCwxLS4yMi0xLjQ1LDUuMDcsNS4wNywwLDAsMSwwLS42N0E2Ljg1LDYuODUsMCwxLDEsMTMsMTguNDdhLjQ0LjQ0LDAsMCwxLS4zMy0uMTMuNDguNDgsMCwwLDEsMC0uNjguNTEuNTEsMCwwLDEsLjMzLS4xNUE1Ljg5LDUuODksMCwwLDAsMTcuMTUsNy40NWE1Ljg4LDUuODgsMCwwLDAtOC4zMywwLDUuODQsNS44NCwwLDAsMC0xLjczLDQuMTdzMCwuMjUsMCwuNjVhNi40OSw2LjQ5LDAsMCwwLC4yNCwxLjM3bC40NC0xLjA5YS41Ny41NywwLDAsMSwuMjctLjI2LjQxLjQxLDAsMCwxLC4zNiwwLC41My41MywwLDAsMSwuMjcuMjYuNDMuNDMsMCwwLDEsMCwuMzdMNy44MiwxNWwwLC4wOS0uMDkuMDktLjEuMDctLjA2LDBINy4yOGwtLjEzLDAtMS4wOS0uNjNjLS42NS0uMzYtMS0uNTctMS4xLS42M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDkgLTQuNTMpXCIvPjwvZz48L3N2Zz4nLFxuICAgYm9sZDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTEuNzYgMTUuNzVcIj48Zz48cGF0aCBkPVwiTTYuNCwzLjc2VjE5LjVoNi43NmE1LjU1LDUuNTUsMCwwLDAsMi0uMzIsNC45Myw0LjkzLDAsMCwwLDEuNTItMSw0LjI3LDQuMjcsMCwwLDAsMS40OC0zLjM0LDMuODcsMy44NywwLDAsMC0uNjktMi4zNyw1Ljc0LDUuNzQsMCwwLDAtLjcxLS44MywzLjQ0LDMuNDQsMCwwLDAtMS4xLS42NSwzLjYsMy42LDAsMCwwLDEuNTgtMS4zNiwzLjY2LDMuNjYsMCwwLDAsLjUzLTEuOTMsMy43LDMuNywwLDAsMC0xLjIxLTIuODcsNC42NSw0LjY1LDAsMCwwLTMuMjUtMS4xSDYuNFptMi40Niw2LjY1VjUuNTdoMy41MmE0LjkxLDQuOTEsMCwwLDEsMS4zNi4xNSwyLjMsMi4zLDAsMCwxLC44NS40NSwyLjA2LDIuMDYsMCwwLDEsLjc0LDEuNzEsMi4zLDIuMywwLDAsMS0uNzgsMS45MiwyLjU0LDIuNTQsMCwwLDEtLjg2LjQ2LDQuNyw0LjcsMCwwLDEtMS4zMi4xNUg4Ljg2Wm0wLDcuMjdWMTIuMTVIMTIuN2E0LjU2LDQuNTYsMCwwLDEsMS4zOC4xNywzLjQzLDMuNDMsMCwwLDEsLjk1LjQ5LDIuMjksMi4yOSwwLDAsMSwuOTIsMiwyLjczLDIuNzMsMCwwLDEtLjgzLDIuMSwyLjY2LDIuNjYsMCwwLDEtLjgzLjU4LDMuMjUsMy4yNSwwLDAsMS0xLjI2LjJIOC44NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTYuNCAtMy43NSlcIi8+PC9nPjwvc3ZnPicsXG4gICB1bmRlcmxpbmU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDkuNzggMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE0LjY0LDMuNzZoMi41MnY3LjcyYTQuNTEsNC41MSwwLDAsMS0uNTksMi4zMSwzLjc2LDMuNzYsMCwwLDEtMS43MSwxLjUzLDYuMTIsNi4xMiwwLDAsMS0yLjY0LjUzLDUsNSwwLDAsMS0zLjU3LTEuMTgsNC4xNyw0LjE3LDAsMCwxLTEuMjctMy4yNFYzLjc2SDkuOXY3LjNhMywzLDAsMCwwLC41NSwyLDIuMywyLjMsMCwwLDAsMS44My42NSwyLjI2LDIuMjYsMCwwLDAsMS44LS42NSwzLjA5LDMuMDksMCwwLDAsLjU1LTJWMy43NlptMi41MiwxMy4zMVYxOS41SDcuMzlWMTcuMDhoOS43N1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTcuMzggLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgaXRhbGljOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxMC40OSAxNS43NlwiPjxnPjxwYXRoIGQ9XCJNMTcuMTYsMy43OWwuMzcsMC0uMDYuMzgtLjE0LjUyQTEwLDEwLDAsMCwxLDE2LjIxLDVhOS4zNyw5LjM3LDAsMCwwLTEsLjMyLDYuNjgsNi42OCwwLDAsMC0uMjUuODljLS4wNi4zMS0uMTEuNTktLjE0Ljg1LS4zLDEuMzYtLjUyLDIuNDEtLjY4LDMuMTRsLS42MSwzLjE4TDEzLjEsMTVsLS40MywyLjQtLjEyLjQ2YS42Mi42MiwwLDAsMCwwLC4yOGMuNDQuMS44NS4xNywxLjIzLjIybC42OC4xMWE0LjUxLDQuNTEsMCwwLDEtLjA4LjZsLS4wOS40MmEuOTIuOTIsMCwwLDAtLjIzLDBsLS40MywwYTEuMzcsMS4zNywwLDAsMS0uMjksMGMtLjEzLDAtLjYzLS4wOC0xLjQ5LS4xNmwtMiwwYy0uMjgsMC0uODcsMC0xLjc4LjEyTDcsMTkuNWwuMTctLjg4LjgtLjJBNi42MSw2LjYxLDAsMCwwLDkuMTksMTgsMi42MiwyLjYyLDAsMCwwLDkuNjEsMTdsLjI4LTEuNDEuNTgtMi43NS4xMi0uNjZjLjA1LS4zLjExLS41OC4xNy0uODZzLjEyLS41MS4xNy0uNjlsLjEyLS40OC4xMi0uNDMuMzEtMS42LjE1LS42NS4zMS0xLjkxVjUuMTRhMy44NiwzLjg2LDAsMCwwLTEuNDgtLjI5bC0uMzgsMCwuMi0xLjA2LDMuMjQuMTQuNzUsMGMuNDUsMCwxLjE4LDAsMi4xOC0uMDkuMjMsMCwuNDYsMCwuNzEsMFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTcuMDQgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgc3RyaWtlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNC45XCI+PGc+PHBhdGggZD1cIk0xMi45NCwxM2E0LjI3LDQuMjcsMCwwLDEsMS4zMi41OCwxLjQ2LDEuNDYsMCwwLDEsLjU1LDEuMiwxLjg3LDEuODcsMCwwLDEtLjg4LDEuNjQsNC4xNyw0LjE3LDAsMCwxLTIuMzUuNTksNC40NCw0LjQ0LDAsMCwxLTIuNzQtLjcxLDIuNzIsMi43MiwwLDAsMS0xLTIuMTdINS41N2E0LjU2LDQuNTYsMCwwLDAsMS41NSwzLjcsNyw3LDAsMCwwLDQuNDcsMS4yMyw2LDYsMCwwLDAsNC4wNy0xLjMsNC4yNCw0LjI0LDAsMCwwLDEuNTItMy4zNyw0LDQsMCwwLDAtLjI2LTEuNGgtNFpNNi4zNywxMC4yNEEzLjI3LDMuMjcsMCwwLDEsNiw4LjY4YTQsNCwwLDAsMSwxLjQ4LTMuMyw1LjkyLDUuOTIsMCwwLDEsMy44OC0xLjIxLDUuNTgsNS41OCwwLDAsMSwzLjkxLDEuMjQsNC4zNiw0LjM2LDAsMCwxLDEuNDUsMy4xN0gxNC40NGEyLjEyLDIuMTIsMCwwLDAtLjkxLTEuODEsNC40NSw0LjQ1LDAsMCwwLTIuNDQtLjU1LDMuNjksMy42OSwwLDAsMC0yLC41MUExLjY0LDEuNjQsMCwwLDAsOC4zLDguMjJhMS4zLDEuMywwLDAsMCwuNDgsMS4xMSw3LDcsMCwwLDAsMi4xLjc4bC4yOC4wNi4yOC4wOEg2LjM3Wm0xMy4wOS42OGEuNzMuNzMsMCwwLDEsLjQ5LjIxLjY2LjY2LDAsMCwxLC4yLjQ4LjY0LjY0LDAsMCwxLS4yLjQ4LjcxLjcxLDAsMCwxLS40OS4xOUg1LjFhLjY3LjY3LDAsMCwxLS40OS0uMTkuNjYuNjYsMCwwLDEtLjItLjQ4LjY0LjY0LDAsMCwxLC4yLS40OC43My43MywwLDAsMSwuNDktLjIxSDE5LjQ2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4xNylcIi8+PC9nPjwvc3ZnPicsXG4gICBzdWJzY3JpcHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDE0LjYxXCI+PGc+PHBhdGggZD1cIk0xNS4zOCw0LjMzSDEyLjc0TDExLjE5LDdjLS4yOC40Ni0uNTEuODctLjY5LDEuMjFMMTAuMDcsOWgwbC0uNDQtLjhjLS4yMi0uNC0uNDUtLjgxLS43MS0xLjIzTDcuMzQsNC4zM0g0LjY4TDguMjYsMTAsNC40LDE2LjA4SDcuMWwxLjY5LTIuODNjLjM4LS42My43Mi0xLjIyLDEtMS43OGwuMjUtLjQ2aDBsLjQ5LjkyYy4yNC40NS40OC44OS43NCwxLjMyTDEzLDE2LjA4aDIuNjFMMTEuODQsMTBsMS43Ny0yLjg0LDEuNzctMi44NVptNC43NywxMy43NUgxN3YtLjE1YzAtLjQuMDUtLjY0LjE2LS43MmE0LjQyLDQuNDIsMCwwLDEsMS4xNi0uMzEsMy4zLDMuMywwLDAsMCwxLjU0LS41NkExLjg0LDEuODQsMCwwLDAsMjAuMTUsMTVhMS43OCwxLjc4LDAsMCwwLS40NC0xLjQxQTIuOCwyLjgsMCwwLDAsMTgsMTMuMjVhMi43MSwyLjcxLDAsMCwwLTEuNjkuMzcsMS44MywxLjgzLDAsMCwwLS40NCwxLjQzdi4yM0gxN3YtLjIzcTAtLjYzLjE4LS43OGExLjYyLDEuNjIsMCwwLDEsLjg4LS4xNSwxLjU5LDEuNTksMCwwLDEsLjg4LjE1cS4xOC4xNS4xOC43NXQtLjE4Ljc1YTMuNTgsMy41OCwwLDAsMS0xLjE4LjMzLDMuMzMsMy4zMywwLDAsMC0xLjUyLjUxLDEuNTcsMS41NywwLDAsMC0uMzIsMS4xOHYxLjE1aDQuMjd2LS44NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtNC4zMylcIi8+PC9nPjwvc3ZnPicsXG4gICBzdXBlcnNjcmlwdDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzUgMTUuNDJcIj48Zz48cGF0aCBkPVwiTTEyLDEzLjE0bDMuNjEtNS44MUgxMi45NEwxMS4zMywxMGMtLjI4LjQ2LS41MS44OC0uNjksMS4yNWwtLjQ1LjgzaDBsLS40NS0uODVjLS4yMi0uNDEtLjQ1LS44Mi0uNzEtMS4yNEw3LjQsNy4zM0g0LjY4bDMuNjYsNS44MUw0LjQsMTkuMzNINy4xNGwxLjc0LTIuODdxLjU4LTEsMS0xLjgzbC4yNS0uNDhoMGwuNTEuOTQuNzUsMS4zNywxLjcyLDIuODdoMi42N2wtMS45Mi0zLjA5Yy0xLjEyLTEuOC0xLjc2LTIuODMtMS45Mi0zLjFabTQuODQtNC40MWgwbDAsLjE1aDMuMjd2Ljg2SDE1Ljc3VjguNThhMS42NiwxLjY2LDAsMCwxLC4zMy0xLjIyLDMuNTEsMy41MSwwLDAsMSwxLjU2LS41MSwzLjY4LDMuNjgsMCwwLDAsMS4yMS0uMzRjLjEzLS4xLjE5LS4zNi4xOS0uNzdTMTksNS4wNywxOC44Nyw1QTEuNjMsMS42MywwLDAsMCwxOCw0LjhhMS41OCwxLjU4LDAsMCwwLS45MS4xN2MtLjEzLjExLS4xOS4zOC0uMTkuOFY2SDE1Ljc4VjUuNzZhMS44NywxLjg3LDAsMCwxLC40NS0xLjQ3QTIuODQsMi44NCwwLDAsMSwxOCwzLjkxYTIuOCwyLjgsMCwwLDEsMS43Mi4zOCwxLjg0LDEuODQsMCwwLDEsLjQ1LDEuNDQsMS45MSwxLjkxLDAsMCwxLS4zNCwxLjM1LDMuMjQsMy4yNCwwLDAsMS0xLjU4LjU3QTMuNjksMy42OSwwLDAsMCwxNyw4Yy0uMTIuMS0uMTcuMzUtLjE3Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC0zLjkxKVwiLz48L2c+PC9zdmc+JyxcbiAgIGVyYXNlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43NlwiPjxnPjxwYXRoIGQ9XCJNMTMuNjksMTcuMmg2LjQ2djEuMzFIOC41Nkw0LjQxLDE0LjM3LDE0LDQuNzVsNi4wNiw2LjA2TDE2Ljg5LDE0bC0zLjIsMy4xOVptLTQuNjEsMGgyLjc3TDE0LjA5LDE1LDkuODgsMTAuNzUsNi4yNSwxNC4zOGwxLjQxLDEuNDFjLjg0LjgyLDEuMzEsMS4yOSwxLjQyLDEuNDFaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00Ljc1KVwiLz48L2c+PC9zdmc+JyxcbiAgIGluZGVudDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTIuMzZcIj48Zz48cGF0aCBkPVwiTTE5Ljg3LDE1LjU3YS4yNy4yNywwLDAsMSwuMTkuMDguMjUuMjUsMCwwLDEsLjA4LjE5djEuNjlhLjI3LjI3LDAsMCwxLS4wOC4xOS4yNS4yNSwwLDAsMS0uMTkuMDhINC42OGEuMjcuMjcsMCwwLDEtLjE5LS4wOC4yNS4yNSwwLDAsMS0uMDgtLjE5VjE1Ljg0YS4yNy4yNywwLDAsMSwuMjctLjI3SDE5Ljg3Wk03LjUsMTQuNDVhLjI1LjI1LDAsMCwxLS4yLS4wOUw0Ljc2LDExLjg0YS4yOS4yOSwwLDAsMSwwLS40TDcuMyw4LjlhLjI5LjI5LDAsMCwxLC40LDAsLjMxLjMxLDAsMCwxLC4wNy4ydjUuMDZhLjMyLjMyLDAsMCwxLS4wOC4yMS4yNi4yNiwwLDAsMS0uMTkuMDhaTTE5Ljg3LDguODJhLjI3LjI3LDAsMCwxLC4xOS4wOC4yNS4yNSwwLDAsMSwuMDguMTl2MS42OWEuMjcuMjcsMCwwLDEtLjA4LjE5LjI1LjI1LDAsMCwxLS4xOS4wOEgxMC4zMWEuMjcuMjcsMCwwLDEtLjI3LS4yN1Y5LjFhLjI3LjI3LDAsMCwxLC4yNy0uMjdoOS41NlptMCwzLjM3YS4yNy4yNywwLDAsMSwuMTkuMDguMjguMjgsMCwwLDEsLjA4LjIxdjEuNjhhLjMyLjMyLDAsMCwxLS4wOC4yMS4yNS4yNSwwLDAsMS0uMTkuMDhIMTAuMzFhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWMTIuNDhhLjMyLjMyLDAsMCwxLC4wOC0uMjEuMjQuMjQsMCwwLDEsLjE5LS4wOGg5LjU2Wm0uMi02LjY2YS4yOC4yOCwwLDAsMSwuMDguMlY3LjQxYS4zMi4zMiwwLDAsMS0uMDguMjEuMjUuMjUsMCwwLDEtLjE5LjA4SDQuNjhhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWNS43M2EuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNS4yNSwwLDAsMSwuMTktLjA4SDE5Ljg3YS4yOC4yOCwwLDAsMSwuMi4wOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgb3V0ZGVudDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTIuMzZcIj48Zz48cGF0aCBkPVwiTTQuNjgsMTQuNDVhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWOS4xYS4yNy4yNywwLDAsMSwuMDgtLjE5LjI4LjI4LDAsMCwxLC4yLS4wOC4yNS4yNSwwLDAsMSwuMTkuMDdsMi41NCwyLjU0YS4yOS4yOSwwLDAsMSwwLC40TDQuODgsMTQuMzZhLjI0LjI0LDAsMCwxLS4yLjA5Wm0xNS4xOSwxLjEyYS4yNy4yNywwLDAsMSwuMTkuMDguMjUuMjUsMCwwLDEsLjA4LjE5djEuNjlhLjI3LjI3LDAsMCwxLS4wOC4xOS4yNS4yNSwwLDAsMS0uMTkuMDhINC42OGEuMjcuMjcsMCwwLDEtLjE5LS4wOC4yNS4yNSwwLDAsMS0uMDgtLjE5VjE1Ljg0YS4yNy4yNywwLDAsMSwuMjctLjI3SDE5Ljg3Wm0wLTMuMzhhLjI3LjI3LDAsMCwxLC4xOS4wOC4yOC4yOCwwLDAsMSwuMDguMjF2MS42OGEuMzIuMzIsMCwwLDEtLjA4LjIxLjI1LjI1LDAsMCwxLS4xOS4wOEgxMC4zMWEuMjcuMjcsMCwwLDEtLjE5LS4wOC4zLjMsMCwwLDEtLjA4LS4yMVYxMi40OGEuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNC4yNCwwLDAsMSwuMTktLjA4aDkuNTZabTAtMy4zN2EuMjcuMjcsMCwwLDEsLjE5LjA4LjI1LjI1LDAsMCwxLC4wOC4xOXYxLjY5YS4yNy4yNywwLDAsMS0uMDguMTkuMjUuMjUsMCwwLDEtLjE5LjA4SDEwLjMxYS4yNy4yNywwLDAsMS0uMjctLjI3VjkuMWEuMjcuMjcsMCwwLDEsLjI3LS4yN2g5LjU2Wm0uMi0zLjI5YS4yOC4yOCwwLDAsMSwuMDguMlY3LjQxYS4zMi4zMiwwLDAsMS0uMDguMjEuMjUuMjUsMCwwLDEtLjE5LjA4SDQuNjhhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWNS43M2EuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNS4yNSwwLDAsMSwuMTktLjA4SDE5Ljg3YS4yOC4yOCwwLDAsMSwuMi4wOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgZXhwYW5zaW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTEuOCwxMy4wNmwtNS4xLDUuMUg5LjUxVjE5LjVINC40MVYxNC40SDUuNzV2Mi44MUw4LjMsMTQuNjZxMi4yNS0yLjIzLDIuNTUtMi41NVptOC4zNS05LjN2NS4xSDE4LjgxVjYuMDVsLTUuMSw1LjEtMS0xLDUuMS01LjFIMTUuMDVWMy43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgcmVkdWN0aW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTQuOTEsMTBoMi44N3YxLjM4SDEyLjU1VjYuMTJoMS4zOFY5bDUuMjQtNS4yNC40OC40OS40OS40OFpNNi43NywxMS45MkgxMnY1LjIzSDEwLjYyVjE0LjI2TDUuMzcsMTkuNWwtMS0xTDkuNjMsMTMuM0g2Ljc3WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGNvZGVfdmlldzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzMgMTEuOFwiPjxnPjxwYXRoIGQ9XCJNOC4wOSw3Ljk0YS43Ni43NiwwLDAsMSwuNTMuMjIuNzIuNzIsMCwwLDEsLjIxLjUyLjc2Ljc2LDAsMCwxLS4yMi41NEw2LjE4LDExLjYzbDIuNDMsMi40NGEuNjkuNjksMCwwLDEsLjIuNTEuNjYuNjYsMCwwLDEtLjIxLjUxLjc1Ljc1LDAsMCwxLS41MS4yMi42My42MywwLDAsMS0uNTEtLjIxaDBMNC42MywxMi4xNWEuNy43LDAsMCwxLS4yMi0uNTMuNjcuNjcsMCwwLDEsLjI1LS41NUw3LjU3LDguMTZhLjgyLjgyLDAsMCwxLC41Mi0uMjJabTEyLjA1LDMuNjlhLjcuNywwLDAsMS0uMjMuNTJMMTcsMTUuMWgwYS42Ni42NiwwLDAsMS0uNTEuMjEuNzMuNzMsMCwwLDEtLjUxLS4yMi43NS43NSwwLDAsMS0uMjItLjUxLjYzLjYzLDAsMCwxLC4yMS0uNTFsMi40My0yLjQ0TDE1LjkyLDkuMjJhLjczLjczLDAsMCwxLS4yMi0uNTNBLjc0Ljc0LDAsMCwxLDE3LDguMThoMGwyLjkxLDIuOTFhLjY3LjY3LDAsMCwxLC4yNy41NFptLTUuOS01LjlhLjczLjczLDAsMCwxLC42MS4zMi43MS43MSwwLDAsMSwuMDcuNjhMMTEsMTdhMSwxLDAsMCwxLS4yMi4zMi42LjYsMCwwLDEtLjM1LjE2Ljc1Ljc1LDAsMCwxLS42OS0uMjYuNjkuNjksMCwwLDEtLjEyLS43MkwxMy41Niw2LjIzYS43NS43NSwwLDAsMSwuMjYtLjM1Ljc0Ljc0LDAsMCwxLC40Mi0uMTVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC01LjczKVwiLz48L2c+PC9zdmc+JyxcbiAgIHByZXZpZXc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY1IDE1LjY2XCI+PGc+PHBhdGggZD1cIk0xNi4xOSwxNC40M2wyLjQ5LDIuNDlhLjczLjczLDAsMCwxLC4yMS41Mi42Ny42NywwLDAsMS0uMjIuNTEuNy43LDAsMCwxLS41Mi4yMi42OS42OSwwLDAsMS0uNTEtLjIxbC0yLjQ5LTIuNDhhNS4xNyw1LjE3LDAsMCwxLTEuMzQuNjksNC42NCw0LjY0LDAsMCwxLTEuNDguMjQsNC43OCw0Ljc4LDAsMSwxLDAtOS41Niw0Ljc5LDQuNzksMCwwLDEsMS44NC4zNiw0LjksNC45LDAsMCwxLDEuNTYsMSw0Ljc3LDQuNzcsMCwwLDEsLjQ2LDYuMThaTTEwLDE0YTMuMywzLjMsMCwwLDAsMi4zNC45M0EzLjM3LDMuMzcsMCwwLDAsMTQuNywxNGEzLjMsMy4zLDAsMCwwLTEuMDgtNS40MSwzLjQ3LDMuNDcsMCwwLDAtMi41NiwwQTMsMywwLDAsMCwxMCw5LjI4LDMuMzEsMy4zMSwwLDAsMCwxMCwxNFpNMTYsNGEzLjg2LDMuODYsMCwwLDEsMi43NywxLjE0QTMuOSwzLjksMCwwLDEsMjAsNy44NXY0YS43Ny43NywwLDAsMS0uMjIuNTMuNy43LDAsMCwxLS41Mi4yMS43Mi43MiwwLDAsMS0uNzQtLjc0di00YTIuNDYsMi40NiwwLDAsMC0uNzItMS43M0EyLjM3LDIuMzcsMCwwLDAsMTYsNS40NUg4LjUzQTIuNDIsMi40MiwwLDAsMCw2LjA4LDcuODl2Ny41MmEyLjQxLDIuNDEsMCwwLDAsLjcxLDEuNzMsMi40NiwyLjQ2LDAsMCwwLDEuNzQuNzJoNC4wOGEuNzMuNzMsMCwwLDEsMCwxLjQ2SDguNTNhMy44NSwzLjg1LDAsMCwxLTIuNzgtMS4xNEEzLjkzLDMuOTMsMCwwLDEsNC42LDE1LjRWNy44N0EzLjk0LDMuOTQsMCwwLDEsNS43Niw1LjA5LDMuODgsMy44OCwwLDAsMSw4LjU0LDRIMTZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ1IC0zLjgpXCIvPjwvZz48L3N2Zz4nLFxuICAgcHJpbnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2LjA1IDE2LjA0XCI+PGc+PHBhdGggZD1cIk0xOS43NiwxNS44NGExLjI5LDEuMjksMCwwLDAsLjM5LS45MlY4LjM1QTIuMDUsMi4wNSwwLDAsMCwxOS41Nyw3YTEuOTMsMS45MywwLDAsMC0xLjM4LS41N0g2LjM3YTEuOTUsMS45NSwwLDAsMC0yLDJ2Ni41NmExLjIzLDEuMjMsMCwwLDAsLjM4LjkyLDEuMzUsMS4zNSwwLDAsMCwuOTMuMzhoMlYxNC45bC0yLDBWOC4zNWEuNjcuNjcsMCwwLDEsLjE4LS40Ny42Mi42MiwwLDAsMSwuNDgtLjE5SDE4LjE4YS42LjYsMCwwLDEsLjQ2LjE5LjY2LjY2LDAsMCwxLC4xOC40N1YxNC45aC0ydjEuMzJoMkExLjM1LDEuMzUsMCwwLDAsMTkuNzYsMTUuODRaTTE3LjUyLDcuNjlWNS4wNmExLjMxLDEuMzEsMCwwLDAtLjM4LS45MiwxLjM0LDEuMzQsMCwwLDAtLjk0LS4zOEg4LjM0QTEuMywxLjMsMCwwLDAsNyw1LjA2VjcuNjlIOC4zNFY1LjA2aDcuODdWNy42OWgxLjMxWk04LjM0LDEyLjkzaDcuODdsMCw1LjI2SDguMzRWMTIuOTNabTcuODcsNS4yNnYwWm0uNjUsMS4zMWEuNi42LDAsMCwwLC40Ni0uMTkuNzIuNzIsMCwwLDAsLjItLjQ3VjEyLjI5YS43NC43NCwwLDAsMC0uMi0uNDcuNi42LDAsMCwwLS40Ni0uMTlINy42OGEuNi42LDAsMCwwLS40Ni4xOS43Mi43MiwwLDAsMC0uMi40N3Y2LjU1YS43NC43NCwwLDAsMCwuMi40Ny42LjYsMCwwLDAsLjQ2LjE5aDkuMThaTTE2LjY3LDkuMjhhLjcuNywwLDAsMC0uOTQsMCwuNjMuNjMsMCwwLDAtLjE4LjQ2LjY3LjY3LDAsMCwwLC4xOC40Ny42OC42OCwwLDAsMCwuOTQsMCwuNjYuNjYsMCwwLDAsLjE4LS40N0EuNTguNTgsMCwwLDAsMTYuNjcsOS4yOFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuMjUgLTMuNjEpXCIvPjwvZz48L3N2Zz4nLFxuICAgdGVtcGxhdGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE0LjI3IDE1LjY0XCI+PGc+PHBhdGggZD1cIk0xOC4xOCwxOS4xNmExLDEsMCwwLDAsMS0xVjUuNzNhMSwxLDAsMCwwLTEtMWgtMnYxaDJWMTguMTlINi4zN1Y1LjczaDJ2LTFoLTJBLjk0Ljk0LDAsMCwwLDUuNjgsNWExLDEsMCwwLDAtLjI5LjdWMTguMThhLjk0Ljk0LDAsMCwwLC4yOS42OSwxLDEsMCwwLDAsLjY5LjI5SDE4LjE4Wk05LjgyLDEwLjMxaDQuOTJhLjQ5LjQ5LDAsMCwwLC4zNS0uMTUuNDcuNDcsMCwwLDAsLjE1LS4zNS40OS40OSwwLDAsMC0uMTUtLjM1LjQ3LjQ3LDAsMCwwLS4zNS0uMTVIOS44MmEuNDkuNDksMCwwLDAtLjM1LjE1LjQ3LjQ3LDAsMCwwLS4xNS4zNS40OS40OSwwLDAsMCwuMTUuMzUuNDcuNDcsMCwwLDAsLjM1LjE1Wm01LjksNC45Mkg4LjgzYS40OS40OSwwLDAsMC0uMzUuMTUuNDcuNDcsMCwwLDAtLjE1LjM1LjQ5LjQ5LDAsMCwwLC4xNS4zNS40Ny40NywwLDAsMCwuMzUuMTVoNi44OWEuNDkuNDksMCwwLDAsLjM1LS4xNS40Ny40NywwLDAsMCwuMTUtLjM1LjUxLjUxLDAsMCwwLS41LS41Wk03LjM2LDEyLjc3YS40OS40OSwwLDAsMCwuMTUuMzUuNDcuNDcsMCwwLDAsLjM1LjE1aDguODVhLjQ5LjQ5LDAsMCwwLC4zNS0uMTUuNDcuNDcsMCwwLDAsLjE1LS4zNS40OS40OSwwLDAsMC0uMTUtLjM1LjQ3LjQ3LDAsMCwwLS4zNS0uMTVINy44NWEuNDkuNDksMCwwLDAtLjM1LjE1LjUyLjUyLDAsMCwwLS4xNC4zNVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMTQgLTMuNzcpXCIvPjxwYXRoIGQ9XCJNMTQuMjQsNi43MWExLDEsMCwwLDAsMS0xLDEsMSwwLDAsMC0xLTEsMSwxLDAsMCwwLTEtMWgtMmEuOTQuOTQsMCwwLDAtLjY5LjI4LDEsMSwwLDAsMC0uMjkuN0EuOTQuOTQsMCwwLDAsOS42Miw1YS45MS45MSwwLDAsMC0uMjkuNjksMSwxLDAsMCwwLC4yOS43LDEsMSwwLDAsMCwuNjkuMjloMy45M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMTQgLTMuNzcpXCIvPjwvZz48L3N2Zz4nLFxuICAgbGluZV9oZWlnaHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc2IDEzLjU2XCI+PGc+PHBhdGggZD1cIk00LjQsNC44OFY4LjI2YTIsMiwwLDAsMCwuNS4zOXMuMSwwLC4xOC0uMTJhLjYyLjYyLDAsMCwwLC4xNy0uMjhjLjA2LS4xOS4xMy0uNDQuMjEtLjc0cy4xNC0uNTIuMTktLjY2YS41OC41OCwwLDAsMSwuMjEtLjMsMi40MSwyLjQxLDAsMCwxLC42My0uMjEsMy44MywzLjgzLDAsMCwxLC44OC0uMTIsOS4xNSw5LjE1LDAsMCwxLDEuMzEuMDYuMTYuMTYsMCwwLDEsLjExLDAsLjI2LjI2LDAsMCwxLC4wNi4xNCw0LDQsMCwwLDEsMCwuNDl2MmwuMDUsMy43N2MwLDEuNDEsMCwyLjY4LS4wNSwzLjgxYTEuNzksMS43OSwwLDAsMS0uMTEuNDksMTAuNjgsMTAuNjgsMCwwLDEtMS40LjQ1LDEuMTIsMS4xMiwwLDAsMC0uNjkuNDN2LjMxbDAsLjIyLjYxLDBjLjg1LS4wOCwxLjU0LS4xMiwyLjA2LS4xMmExOS43NiwxOS43NiwwLDAsMSwyLjA5LjA4LDE1LjA4LDE1LjA4LDAsMCwwLDEuNjQuMDgsMS40LDEuNCwwLDAsMCwuMjksMCwxLjU4LDEuNTgsMCwwLDAsMC0uMjZsLS4wNS0uNDNhMi4yNiwyLjI2LDAsMCwwLS40My0uMTdsLS43Ny0uMjItLjE1LDBhMi41NSwyLjU1LDAsMCwxLS43OC0uMjgsMi41NiwyLjU2LDAsMCwxLS4xMS0uNzVsMC0xLjI5LDAtMy4xNVY3LjUzYTEwLjUxLDEwLjUxLDAsMCwxLC4wNi0xLjIsMy44MywzLjgzLDAsMCwxLC42LDBsMS44OCwwYTIuMTgsMi4xOCwwLDAsMSwuMzgsMCwuNDUuNDUsMCwwLDEsLjIzLjE3LjkuOSwwLDAsMSwuMDUuMjVjMCwuMTYuMDYuMzUuMS41OGEzLjMzLDMuMzMsMCwwLDAsLjE0LjU1QTYuMzksNi4zOSwwLDAsMCwxNSw5YTIuOTEsMi45MSwwLDAsMCwuNi0uMTUsMi43NywyLjc3LDAsMCwwLDAtLjQ2bDAtLjUxLDAtMi45NS0uMjUsMC0uMzgsMEwxNSw0Ljk0YS43MS43MSwwLDAsMS0uMTguMTUuNDUuNDUsMCwwLDEtLjI1LjA3bC0uMjksMEg4Ljc1bC0uMTUsMEg3LjQ1YTE3LDE3LDAsMCwxLTEuODYsMEw1LjM2LDVsLS4yNS0uMTNaTTE5Ljc1LDE2LjE0aC0uNjl2LTloLjY5QS40LjQsMCwwLDAsMjAuMTMsN2MuMDYtLjExLDAtLjI0LS4xLS4zOUwxOC45Miw1LjE1YS41Mi41MiwwLDAsMC0uODYsMEwxNyw2LjU4Yy0uMTIuMTUtLjE2LjI4LS4xLjM5cy4xOC4xNi4zOC4xNmguNjl2OWgtLjY5YS40LjQsMCwwLDAtLjM4LjE2Yy0uMDYuMTEsMCwuMjQuMS4zOWwxLjExLDEuNDNhLjUyLjUyLDAsMCwwLC44NiwwTDIwLDE2LjY5Yy4xMi0uMTUuMTYtLjI4LjEtLjM5YS40LjQsMCwwLDAtLjM4LS4xNlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtNC44NilcIi8+PC9nPjwvc3ZnPicsXG4gICBwYXJhZ3JhcGhfc3R5bGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDExLjgxIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOC4xOCwzLjc2djJoLTJWMTkuNWgtMlY1LjczaC0yVjE5LjVoLTJWMTEuNjNhMy45NCwzLjk0LDAsMCwxLDAtNy44N2g3Ljg3WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNi4zNyAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICB0ZXh0X3N0eWxlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxMy43NiAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTcuNjgsNi43MWEyLjIyLDIuMjIsMCwwLDAsMS4wNi0uMjIuNzQuNzQsMCwwLDAsLjQyLS43LjczLjczLDAsMCwwLS4wOC0uMzMuNjcuNjcsMCwwLDAtLjE3LS4yMiwxLDEsMCwwLDAtLjMxLS4xNUwxOC4yNiw1bC0uNDUtLjA5QTE1LjI3LDE1LjI3LDAsMCwwLDEzLjI2LDVWNC43NGMwLS42Ni0uNjMtMS0xLjkyLTEtLjI0LDAtLjQzLjE1LS41OS40NmE0LDQsMCwwLDAtLjM2LDEuMTRoMHYwYTI2LjQ1LDI2LjQ1LDAsMCwxLTMuNS4zNUEyLDIsMCwwLDAsNS43Nyw2YS44NC44NCwwLDAsMC0uMzcuNzksMi4xNCwyLjE0LDAsMCwwLC40MSwxLjI5LDEuMjMsMS4yMywwLDAsMCwxLjA1LjYzLDE2LjYyLDE2LjYyLDAsMCwwLDMuMjktLjQ1bC0uMzQsMy4zNWMtLjE2LDEuNjEtLjI5LDIuOS0uMzcsMy44NnMtLjEyLDEuNjYtLjEyLDIuMDlsMCwuNjVhNS4xNSw1LjE1LDAsMCwwLC4wNS42LDEuMjgsMS4yOCwwLDAsMCwuMTYuNTQuMzQuMzQsMCwwLDAsLjI4LjE4LDEuMTYsMS4xNiwwLDAsMCwuNzktLjQ2LDMuNjYsMy42NiwwLDAsMCwuNjgtMSwyMi4wOCwyMi4wOCwwLDAsMCwxLTQuMzNxLjQ5LTMuMS43OC02LjE1YTI0LjY5LDI0LjY5LDAsMCwxLDQuNjItLjg0WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNS40IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHNhdmU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOC41MywxOS41bC4yLS4wNUExLjc4LDEuNzgsMCwwLDAsMjAuMTMsMThsMC0uMDlWNy4xNGEyLDIsMCwwLDAtLjI4LS42NEEzLjE4LDMuMTgsMCwwLDAsMTkuNDMsNmMtLjUtLjUyLTEtMS0xLjU1LTEuNTRBMi41OSwyLjU5LDAsMCwwLDE3LjM3LDRhMS44MywxLjgzLDAsMCwwLS42MS0uMjVINmwtLjIxLDBhMS43OCwxLjc4LDAsMCwwLTEuNCwxLjQ5bDAsLjFWMTcuODdhMi40OSwyLjQ5LDAsMCwwLC4wOS4zNywxLjc5LDEuNzksMCwwLDAsMS40NCwxLjIzbC4wOSwwWm0tNi4yNS0uNkg2LjkyYS42MS42MSwwLDAsMS0uNjgtLjQ4Ljc4Ljc4LDAsMCwxLDAtLjIyVjEyLjNhLjYyLjYyLDAsMCwxLC42OS0uNjhIMTcuNjRhLjYyLjYyLDAsMCwxLC42OS42OVYxOC4yYS42NC42NCwwLDAsMS0uNzEuNjlIMTIuMjhaTTEyLDkuODFIOC4xNWEuNjMuNjMsMCwwLDEtLjcyLS43MXYtNGEuNjQuNjQsMCwwLDEsLjcyLS43Mmg3LjY2YS42NC42NCwwLDAsMSwuNzIuNzJ2NGEuNjUuNjUsMCwwLDEtLjc0LjcyWk0xMy41LDVWOS4xOGgxLjc4VjVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGJsb2NrcXVvdGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ3NS4wODIgNDc1LjA4MVwiPjxnPjxwYXRoIGQ9XCJNMTY0LjQ1LDIxOS4yN2gtNjMuOTU0Yy03LjYxNCwwLTE0LjA4Ny0yLjY2NC0xOS40MTctNy45OTRjLTUuMzI3LTUuMzMtNy45OTQtMTEuODAxLTcuOTk0LTE5LjQxN3YtOS4xMzJjMC0yMC4xNzcsNy4xMzktMzcuNDAxLDIxLjQxNi01MS42NzhjMTQuMjc2LTE0LjI3MiwzMS41MDMtMjEuNDExLDUxLjY3OC0yMS40MTFoMTguMjcxYzQuOTQ4LDAsOS4yMjktMS44MDksMTIuODQ3LTUuNDI0YzMuNjE2LTMuNjE3LDUuNDI0LTcuODk4LDUuNDI0LTEyLjg0N1Y1NC44MTljMC00Ljk0OC0xLjgwOS05LjIzMy01LjQyNC0xMi44NWMtMy42MTctMy42MTItNy44OTgtNS40MjQtMTIuODQ3LTUuNDI0aC0xOC4yNzFjLTE5Ljc5NywwLTM4LjY4NCwzLjg1OC01Ni42NzMsMTEuNTYzYy0xNy45ODcsNy43MS0zMy41NDUsMTguMTMyLTQ2LjY4LDMxLjI2N2MtMTMuMTM0LDEzLjEyOS0yMy41NTMsMjguNjg4LTMxLjI2Miw0Ni42NzdDMy44NTUsMTQ0LjAzOSwwLDE2Mi45MzEsMCwxODIuNzI2djIwMC45OTFjMCwxNS4yMzUsNS4zMjcsMjguMTcxLDE1Ljk4NiwzOC44MzRjMTAuNjYsMTAuNjU3LDIzLjYwNiwxNS45ODUsMzguODMyLDE1Ljk4NWgxMDkuNjM5YzE1LjIyNSwwLDI4LjE2Ny01LjMyOCwzOC44MjgtMTUuOTg1YzEwLjY1Ny0xMC42NjMsMTUuOTg3LTIzLjU5OSwxNS45ODctMzguODM0VjI3NC4wODhjMC0xNS4yMzItNS4zMy0yOC4xNjgtMTUuOTk0LTM4LjgzMkMxOTIuNjIyLDIyNC42LDE3OS42NzUsMjE5LjI3LDE2NC40NSwyMTkuMjd6XCIvPjxwYXRoIGQ9XCJNNDU5LjEwMywyMzUuMjU2Yy0xMC42NTYtMTAuNjU2LTIzLjU5OS0xNS45ODYtMzguODI4LTE1Ljk4NmgtNjMuOTUzYy03LjYxLDAtMTQuMDg5LTIuNjY0LTE5LjQxLTcuOTk0Yy01LjMzMi01LjMzLTcuOTk0LTExLjgwMS03Ljk5NC0xOS40MTd2LTkuMTMyYzAtMjAuMTc3LDcuMTM5LTM3LjQwMSwyMS40MDktNTEuNjc4YzE0LjI3MS0xNC4yNzIsMzEuNDk3LTIxLjQxMSw1MS42ODItMjEuNDExaDE4LjI2N2M0Ljk0OSwwLDkuMjMzLTEuODA5LDEyLjg0OC01LjQyNGMzLjYxMy0zLjYxNyw1LjQyOC03Ljg5OCw1LjQyOC0xMi44NDdWNTQuODE5YzAtNC45NDgtMS44MTQtOS4yMzMtNS40MjgtMTIuODVjLTMuNjE0LTMuNjEyLTcuODk4LTUuNDI0LTEyLjg0OC01LjQyNGgtMTguMjY3Yy0xOS44MDgsMC0zOC42OTEsMy44NTgtNTYuNjg1LDExLjU2M2MtMTcuOTg0LDcuNzEtMzMuNTM3LDE4LjEzMi00Ni42NzIsMzEuMjY3Yy0xMy4xMzUsMTMuMTI5LTIzLjU1OSwyOC42ODgtMzEuMjY1LDQ2LjY3N2MtNy43MDcsMTcuOTg3LTExLjU2NywzNi44NzktMTEuNTY3LDU2LjY3NHYyMDAuOTkxYzAsMTUuMjM1LDUuMzMyLDI4LjE3MSwxNS45ODgsMzguODM0YzEwLjY1NywxMC42NTcsMjMuNiwxNS45ODUsMzguODI4LDE1Ljk4NWgxMDkuNjMzYzE1LjIyOSwwLDI4LjE3MS01LjMyOCwzOC44MjctMTUuOTg1YzEwLjY2NC0xMC42NjMsMTUuOTg1LTIzLjU5OSwxNS45ODUtMzguODM0VjI3NC4wODhDNDc1LjA4MiwyNTguODU1LDQ2OS43NiwyNDUuOTIsNDU5LjEwMywyMzUuMjU2elwiLz48L2c+PC9zdmc+JyxcbiAgIGFycm93X2Rvd246ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjczIDguNjdcIj48Zz48cGF0aCBkPVwiTTE4Ljc5LDcuNTJhLjguOCwwLDAsMSwuNTYtLjIzLjgyLjgyLDAsMCwxLC43OS43OS44LjgsMCwwLDEtLjIzLjU2bC03LjA3LDcuMDdhLjc5Ljc5LDAsMCwxLS41Ny4yNS43Ny43NywwLDAsMS0uNTctLjI1aDBMNC42NCw4LjY1YS44LjgsMCwwLDEtLjIzLS41Ny44Mi44MiwwLDAsMSwuNzktLjc5LjguOCwwLDAsMSwuNTYuMjNMMTIuMjgsMTRsMy4yNi0zLjI2LDMuMjUtMy4yNlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTcuMjkpXCIvPjwvZz48L3N2Zz4nLFxuICAgYWxpZ25fanVzdGlmeTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTAsNS45SDIwLjE1di0ySDQuNDF2MlptMCwzLjk0SDIwLjE1di0ySDQuNDF2MlptMCwzLjkzaDcuODd2LTJINC40MXYyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43NClcIi8+PC9nPjwvc3ZnPicsXG4gICBhbGlnbl9sZWZ0OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43N1wiPjxnPjxwYXRoIGQ9XCJNNC40MSw0Ljc0djJIMjAuMTV2LTJINC40MVptMTEuOCwzLjk0SDQuNDF2MkgxNi4yMnYtMlptLTExLjgsNS45SDE4LjE4di0ySDQuNDF2MlptMCwzLjkzaDkuODR2LTJINC40MXYyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43NClcIi8+PC9nPjwvc3ZnPicsXG4gICBhbGlnbl9yaWdodDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTMuOTMsNS45SDIwLjE1di0ySDguMzR2MlptLTIsMy45NEgyMC4xNHYtMkg2LjM3djJabTMuOTQsMy45M2g5Ljg0di0ySDEwLjMxdjJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00Ljc0KVwiLz48L2c+PC9zdmc+JyxcbiAgIGFsaWduX2NlbnRlcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTIsMy45NHYySDE4LjE4di0ySDYuMzdabS0xLDUuOUgxOS4xNnYtMkg1LjM5djJabTIsMy45M0gxNy4ydi0ySDcuMzZ2MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTQuNzQpXCIvPjwvZz48L3N2Zz4nLFxuICAgZm9udF9jb2xvcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTQuNjFcIj48Zz48cGF0aCBkPVwiTTE4LjUsMTUuNTcsMTQuMjgsNC4zMmgtMy40TDYuNjUsMTUuNTdoM2wuOC0yLjI2aDQuMjNsLjgsMi4yNmgzWk0xNCwxMS4wN0gxMS4xNEwxMi41NCw3LDEzLjI1LDljLjQxLDEuMTguNjQsMS44Ni43LDJaTTQuNDEsMTYuNjl2Mi4yNEgyMC4xNVYxNi42OUg0LjQxWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4zMilcIi8+PC9nPjwvc3ZnPicsXG4gICBoaWdobGlnaHRfY29sb3I6JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNjYgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTEyLjMyLDkuMzEsMTMuMzgsMTNIMTEuMjFsLjUyLTEuODNxLjQ2LTEuNjEuNTQtMS44M1pNNC40NCwzLjc2SDIwLjFWMTkuNUg0LjQ0VjMuNzZaTTE0LjcxLDE3LjMyaDIuNjNMMTMuNyw2SDEwLjg5TDcuMjYsMTcuMzJIOS44OWwuNjMtMi4yNGgzLjU1bC4zMiwxLjEyYy4xOC42NS4yOSwxLC4zMiwxLjEyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40NCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBsaXN0X2J1bGxldHM6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDEyLjM3XCI+PGc+PHBhdGggZD1cIk03Ljc3LDE2LjEyYTEuNTksMS41OSwwLDAsMC0uNDktMS4xOCwxLjYyLDEuNjIsMCwwLDAtMS4xOS0uNDksMS42OCwxLjY4LDAsMSwwLDAsMy4zNiwxLjY3LDEuNjcsMCwwLDAsMS42OC0xLjY5Wm0wLTQuNDhBMS42NywxLjY3LDAsMCwwLDYuMDksMTAsMS42OCwxLjY4LDAsMCwwLDQuOSwxMi44MmExLjYyLDEuNjIsMCwwLDAsMS4xOS40OSwxLjY3LDEuNjcsMCwwLDAsMS42OC0xLjY3Wm0xMi4zOCwzLjY0YS4yNy4yNywwLDAsMC0uMDgtLjE5LjI4LjI4LDAsMCwwLS4yLS4wOUg5LjE5YS4yOC4yOCwwLDAsMC0uMi4wOC4yOS4yOSwwLDAsMC0uMDguMTlWMTdhLjI3LjI3LDAsMCwwLC4yOC4yOEgxOS44N2EuMjcuMjcsMCwwLDAsLjE5LS4wOC4yNC4yNCwwLDAsMCwuMDgtLjJWMTUuMjhaTTcuNzcsNy4xM2ExLjYzLDEuNjMsMCwwLDAtLjQ5LTEuMiwxLjYxLDEuNjEsMCwwLDAtMS4xOS0uNDksMS42MSwxLjYxLDAsMCwwLTEuMTkuNDksMS43MSwxLjcxLDAsMCwwLDAsMi40LDEuNjIsMS42MiwwLDAsMCwxLjE5LjQ5LDEuNjEsMS42MSwwLDAsMCwxLjE5LS40OSwxLjYzLDEuNjMsMCwwLDAsLjQ5LTEuMlptMTIuMzgsMy42NmEuMjguMjgsMCwwLDAtLjA4LS4yLjI5LjI5LDAsMCwwLS4xOS0uMDhIOS4xOWEuMjcuMjcsMCwwLDAtLjI4LjI4djEuNjlhLjI3LjI3LDAsMCwwLC4wOC4xOS4yNC4yNCwwLDAsMCwuMi4wOEgxOS44N2EuMjcuMjcsMCwwLDAsLjE5LS4wOC4yNS4yNSwwLDAsMCwuMDgtLjE5VjEwLjc5Wm0wLTQuNWEuMjcuMjcsMCwwLDAtLjA4LS4xOUEuMjUuMjUsMCwwLDAsMTkuODgsNkg5LjE5QS4yOC4yOCwwLDAsMCw5LDYuMWEuMjYuMjYsMCwwLDAtLjA4LjE5VjhBLjI3LjI3LDAsMCwwLDksOC4xN2EuMjQuMjQsMCwwLDAsLjIuMDhIMTkuODdhLjI3LjI3LDAsMCwwLC4xOS0uMDhBLjI1LjI1LDAsMCwwLDIwLjE0LDhWNi4yOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgbGlzdF9udW1iZXI6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY5IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk03LjY2LDE4YTEuMjQsMS4yNCwwLDAsMC0uMjYtLjc4LDEuMTcsMS4xNywwLDAsMC0uNzItLjQybC44NS0xVjE1SDQuNTh2MS4zNGguOTR2LS40NmwuODUsMGgwYy0uMTEuMTEtLjIyLjIzLS4zMi4zNXMtLjIzLjI3LS4zNy40N0w1LjM5LDE3bC4yMy41MWMuNjEtLjA1LjkyLjExLjkyLjQ5YS40Mi40MiwwLDAsMS0uMTguMzcuNzkuNzksMCwwLDEtLjQ1LjEyQTEuNDEsMS40MSwwLDAsMSw1LDE4LjE1bC0uNTEuNzdBMi4wNiwyLjA2LDAsMCwwLDYsMTkuNWExLjgsMS44LDAsMCwwLDEuMi0uNDFBMS4zOCwxLjM4LDAsMCwwLDcuNjYsMThabTAtNS41NEg2Ljc1VjEzSDUuNjNBLjcyLjcyLDAsMCwxLDYsMTIuNTFhNS40NSw1LjQ1LDAsMCwxLC42Ni0uNDUsMi43MSwyLjcxLDAsMCwwLC42Ny0uNTcsMS4xOSwxLjE5LDAsMCwwLC4zMS0uODEsMS4yOSwxLjI5LDAsMCwwLS40NS0xLDEuODYsMS44NiwwLDAsMC0yLS4xMSwxLjUxLDEuNTEsMCwwLDAtLjYyLjdsLjc0LjUyQS44Ny44NywwLDAsMSw2LDEwLjI4YS41MS41MSwwLDAsMSwuMzUuMTIuNDIuNDIsMCwwLDEsLjEzLjMzLjU1LjU1LDAsMCwxLS4yMS40LDMsMywwLDAsMS0uNS4zOGMtLjE5LjEzLS4zOS4yNy0uNTguNDJhMiwyLDAsMCwwLS41LjYsMS42MywxLjYzLDAsMCwwLS4yMS44MSwzLjg5LDMuODksMCwwLDAsLjA1LjQ4aDMuMlYxMi40NFptMTIuNDUsMi44MmEuMjcuMjcsMCwwLDAtLjA4LS4xOS4yOC4yOCwwLDAsMC0uMjEtLjA4SDkuMWEuMzIuMzIsMCwwLDAtLjIxLjA4LjI0LjI0LDAsMCwwLS4wOC4yVjE3YS4yNy4yNywwLDAsMCwuMDguMTkuMy4zLDAsMCwwLC4yMS4wOEgxOS44M2EuMzIuMzIsMCwwLDAsLjIxLS4wOC4yNS4yNSwwLDAsMCwuMDgtLjE5VjE1LjI2Wk03LjY5LDcuMzJoLTFWMy43Nkg1LjhMNC42LDQuODhsLjYzLjY4YTEuODUsMS44NSwwLDAsMCwuNDMtLjQ4aDBsMCwyLjI0SDQuNzRWOC4yaDNWNy4zMlptMTIuNDMsMy40MmEuMjcuMjcsMCwwLDAtLjA4LS4xOS4yOC4yOCwwLDAsMC0uMjEtLjA4SDkuMWEuMzIuMzIsMCwwLDAtLjIxLjA4LjI0LjI0LDAsMCwwLS4wOC4ydjEuNzFhLjI3LjI3LDAsMCwwLC4wOC4xOS4zLjMsMCwwLDAsLjIxLjA4SDE5LjgzYS4zMi4zMiwwLDAsMCwuMjEtLjA4LjI1LjI1LDAsMCwwLC4wOC0uMTlWMTAuNzRabTAtNC41MkEuMjcuMjcsMCwwLDAsMjAsNiwuMjguMjgsMCwwLDAsMTkuODMsNkg5LjFBLjMyLjMyLDAsMCwwLDguODksNmEuMjQuMjQsMCwwLDAtLjA4LjE5VjcuOTNhLjI3LjI3LDAsMCwwLC4wOC4xOS4zMi4zMiwwLDAsMCwuMjEuMDhIMTkuODNBLjMyLjMyLDAsMCwwLDIwLDguMTJhLjI2LjI2LDAsMCwwLC4wOC0uMlY2LjIyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MyAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICB0YWJsZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTQuNDEsOC4wNVYzLjc2SDguN1Y4LjA1SDQuNDFabTUuNzEsMFYzLjc2aDQuM1Y4LjA1aC00LjNabTUuNzQtNC4yOWg0LjI5VjguMDVIMTUuODZWMy43NlptLTExLjQ1LDEwVjkuNDhIOC43djQuM0g0LjQxWm01LjcxLDBWOS40OGg0LjN2NC4zaC00LjNabTUuNzQsMFY5LjQ4aDQuMjl2NC4zSDE1Ljg2Wk00LjQxLDE5LjVWMTUuMjFIOC43VjE5LjVINC40MVptNS43MSwwVjE1LjIxaDQuM1YxOS41aC00LjNabTUuNzQsMFYxNS4yMWg0LjI5VjE5LjVIMTUuODZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGhvcml6b250YWxfcnVsZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMi4yNFwiPjxnPjxwYXRoIGQ9XCJNMjAuMTUsMTIuNzVWMTAuNTFINC40MXYyLjI0SDIwLjE1WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMTAuNTEpXCIvPjwvZz48L3N2Zz4nLFxuICAgc2hvd19ibG9ja3M6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY2IDE1LjY3XCI+PGc+PHBhdGggZD1cIk0xOS43Miw1LjU4YTEuNjQsMS42NCwwLDAsMC0xLjY0LTEuNjRINi4yM2ExLjYyLDEuNjIsMCwwLDAtMS4xNi40OCwxLjYzLDEuNjMsMCwwLDAtLjQ4LDEuMTZWOS42M2ExLjYsMS42LDAsMCwwLC40OCwxLjE2LDEuNjIsMS42MiwwLDAsMCwxLjE2LjQ3SDE4LjA5YTEuNjcsMS42NywwLDAsMCwxLjE2LS40NywxLjYyLDEuNjIsMCwwLDAsLjQ4LTEuMTZWNS41OFptLS45NCw0LjA1YS42OC42OCwwLDAsMS0uNy43SDYuMjNhLjY2LjY2LDAsMCwxLS40OC0uMi43NC43NCwwLDAsMS0uMjEtLjVWNS41OGEuNjYuNjYsMCwwLDEsLjItLjQ4LjcxLjcxLDAsMCwxLC40OC0uMjFIMTguMDhhLjc0Ljc0LDAsMCwxLC41LjIxLjY2LjY2LDAsMCwxLC4yLjQ4Wk02LjQ4LDcuNzJhLjIxLjIxLDAsMCwwLC4xNy0uMDcuMjIuMjIsMCwwLDAsLjA3LS4xN1Y3LjA2YTEuMjcsMS4yNywwLDAsMSwuMTEtLjUyLjM3LjM3LDAsMCwxLC4zNi0uMjNIOC43N0EuMjUuMjUsMCwwLDAsOSw2LjE3YS4xOS4xOSwwLDAsMCwwLS4yMy4yNy4yNywwLDAsMC0uMi0uMTJINy4xOWEuODguODgsMCwwLDAtLjcyLjM5LDEuNTEsMS41MSwwLDAsMC0uMjMuODV2LjQyYS4yNC4yNCwwLDAsMCwuMjQuMjRabS0uMTkuODFhLjIxLjIxLDAsMCwwLC4xNy0uMDcuMjYuMjYsMCwwLDAsLjA3LS4xNy4yNC4yNCwwLDAsMC0uMjQtLjI0LjIuMiwwLDAsMC0uMTYuMDkuMi4yLDAsMCwwLS4wNy4xNi4yMi4yMiwwLDAsMCwuMDcuMTcuMjMuMjMsMCwwLDAsLjE2LjA2Wm04LjQ2LDUuMWExLjYzLDEuNjMsMCwwLDAtLjQ3LTEuMTZBMS42MSwxLjYxLDAsMCwwLDEzLjEyLDEySDYuMjNhMS42LDEuNiwwLDAsMC0xLjE2LjQ2LDEuNjIsMS42MiwwLDAsMC0uNDgsMS4xNnY0LjA1YTEuNjQsMS42NCwwLDAsMCwxLjY0LDEuNjRoNi44OWExLjYsMS42LDAsMCwwLDEuMTYtLjQ4LDEuNjIsMS42MiwwLDAsMCwuNDctMS4xNlptLS45NCw0YS43LjcsMCwwLDEtLjIuNDkuNjUuNjUsMCwwLDEtLjUuMkg2LjIzYS42Ni42NiwwLDAsMS0uNDgtLjIuNzUuNzUsMCwwLDEtLjIxLS40OXYtNGEuNzQuNzQsMCwwLDEsLjIxLS41LjY2LjY2LDAsMCwxLC40OC0uMmg2Ljg5YS42OC42OCwwLDAsMSwuNy43djRabTYuMTUsMHYtNGExLjYsMS42LDAsMCwwLS40OC0xLjE2QTEuNjcsMS42NywwLDAsMCwxOC4zMiwxMkgxNy4xYTEuNjMsMS42MywwLDAsMC0xLjE2LjQ3LDEuNjEsMS42MSwwLDAsMC0uNDcsMS4xNnY0YTEuNjcsMS42NywwLDAsMCwuNDcsMS4xNiwxLjYyLDEuNjIsMCwwLDAsMS4xNi40OGgxLjIyQTEuNjQsMS42NCwwLDAsMCwyMCwxNy42OFptLS45NC00djRhLjc1Ljc1LDAsMCwxLS4yMS40OS42Mi42MiwwLDAsMS0uNDguMkgxNy4xMWEuNjkuNjksMCwwLDEtLjUtLjIuNy43LDAsMCwxLS4yLS40OXYtNGEuNjguNjgsMCwwLDEsLjctLjdoMS4yMmEuNjYuNjYsMCwwLDEsLjQ4LjIuNzIuNzIsMCwwLDEsLjIxLjVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ0IC0zLjc5KVwiLz48L2c+PC9zdmc+JyxcbiAgIGNhbmNlbDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE0LjE1LDExLjYzbDUuNjEsNS42MWExLjI5LDEuMjksMCwwLDEsLjM4LjkzLDEuMjcsMS4yNywwLDAsMS0uNC45MywxLjI1LDEuMjUsMCwwLDEtLjkyLjQsMS4zMSwxLjMxLDAsMCwxLS45NC0uNGwtNS42MS01LjYxTDYuNjcsMTkuMWExLjMxLDEuMzEsMCwwLDEtLjk0LjQsMS4yNCwxLjI0LDAsMCwxLS45Mi0uNCwxLjI3LDEuMjcsMCwwLDEtLjQtLjkzLDEuMzMsMS4zMywwLDAsMSwuMzgtLjkzbDUuNjEtNS42M0w0Ljc5LDZhMS4yNiwxLjI2LDAsMCwxLS4zOC0uOTMsMS4yMiwxLjIyLDAsMCwxLC40LS45MiwxLjI4LDEuMjgsMCwwLDEsLjkyLS4zOSwxLjM4LDEuMzgsMCwwLDEsLjk0LjM4bDUuNjEsNS42MSw1LjYxLTUuNjFhMS4zMywxLjMzLDAsMCwxLC45NC0uMzgsMS4yNiwxLjI2LDAsMCwxLC45Mi4zOSwxLjI0LDEuMjQsMCwwLDEsLjQuOTIsMS4yOSwxLjI5LDAsMCwxLS4zOS45M0wxNyw4LjgxbC0yLjgsMi44MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgaW1hZ2U6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDE1Ljc3XCI+PGc+PHBhdGggZD1cIk04Ljc3LDguNzJhLjg4Ljg4LDAsMCwxLS42MS0uMjcuODIuODIsMCwwLDEtLjI1LS42MS44OS44OSwwLDAsMSwuMjUtLjYyQS44Mi44MiwwLDAsMSw4Ljc3LDdhLjgxLjgxLDAsMCwxLC42MS4yNS44My44MywwLDAsMSwuMjcuNjIuODEuODEsMCwwLDEtLjI1LjYxLjkxLjkxLDAsMCwxLS42My4yN1ptOS42Mi01YTEuNzQsMS43NCwwLDAsMSwxLjc2LDEuNzZWMTcuNzZhMS43NCwxLjc0LDAsMCwxLTEuNzYsMS43Nkg2LjE2QTEuNzQsMS43NCwwLDAsMSw0LjQsMTcuNzZWNS41MUExLjc0LDEuNzQsMCwwLDEsNi4xNiwzLjc1SDE4LjM5Wm0wLDEuNzVINi4xNnY4TDguNTMsMTEuOGEuOTQuOTQsMCwwLDEsLjU0LS4xNy44Ni44NiwwLDAsMSwuNTQuMkwxMS4wOSwxM2wzLjY0LTQuNTVhLjc4Ljc4LDAsMCwxLC4zNC0uMjUuODUuODUsMCwwLDEsLjQyLS4wNy44OS44OSwwLDAsMSwuMzkuMTIuNzguNzgsMCwwLDEsLjI4LjI5bDIuMjQsMy42N1Y1LjUxWm0wLDEyLjI0VjE1LjZMMTUuMywxMC41MywxMS44OSwxNC44YS44OS44OSwwLDAsMS0uNTkuMzIuODIuODIsMCwwLDEtLjY0LS4xOEw5LDEzLjYyLDYuMTYsMTUuNzR2MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NSlcIi8+PC9nPjwvc3ZnPicsXG4gICB2aWRlbzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTQuNTVcIj48Zz48cGF0aCBkPVwiTTIwLjE1LDEwLjI2VjE4LjlsLTMuOTQtMS41N3YxLjJINC40MVYxMC42NkgxNi4yMnYxLjIzbDItLjgxLDItLjgyWk0xNC42NCwxN2gwVjEyLjU0aDB2LS4zMUg2VjE3aDguNjdabTMuOTQtLjM3di00bC0yLjM3LDF2MmwxLjE4LjQ4LDEuMTkuNDhaTTcuOTQsOS44NkEyLjc3LDIuNzcsMCwwLDEsNS4xOSw3LjExYTIuNzYsMi43NiwwLDAsMSw1LjUxLDBBMi43OCwyLjc4LDAsMCwxLDcuOTQsOS44NlptMC0zLjkzYTEuMjEsMS4yMSwwLDAsMC0uODMuMzUsMS4xNSwxLjE1LDAsMCwwLS4zNC44NEExLjA5LDEuMDksMCwwLDAsNy4xMSw4LDEuMTUsMS4xNSwwLDAsMCw4LDguMjgsMS4xMywxLjEzLDAsMCwwLDkuMTEsNy4xMiwxLjE2LDEuMTYsMCwwLDAsNy45NCw1LjkzWm01LjksMy45M2EyLjM0LDIuMzQsMCwwLDEtMS42Ny0uNjgsMi4zLDIuMywwLDAsMS0uNjgtMS42NywyLjM1LDIuMzUsMCwwLDEsNC0xLjY3LDIuMzcsMi4zNywwLDAsMSwwLDMuMzQsMi4zMywyLjMzLDAsMCwxLTEuNjguNjhabTAtMy4xNGEuNzUuNzUsMCwxLDAsLjU1LjIyLjczLjczLDAsMCwwLS41NS0uMjJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00LjM1KVwiLz48L2c+PC9zdmc+JyxcbiAgIGxpbms6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDE1LjcyXCI+PGc+PHBhdGggZD1cIk0xMy4wNSwxMy42M2EuMjQuMjQsMCwwLDEsLjE1LjIyTDEzLjQyLDE2YS4xOS4xOSwwLDAsMS0uMDguMThsLTIuMTIsMi4xNGE0LjA4LDQuMDgsMCwwLDEtMS4yOS44NUE0LDQsMCwwLDEsNC43MSwxN2EzLjkyLDMuOTIsMCwwLDEtLjMtMS41MkE0LDQsMCwwLDEsNC43MSwxNGEzLjkxLDMuOTEsMCwwLDEsLjg3LTEuM0w3LjcsMTAuNTZhLjI1LjI1LDAsMCwxLC4yLS4wNmwyLjE3LjIyYS4yMS4yMSwwLDAsMSwuMTkuMTUuMjQuMjQsMCwwLDEsMCwuMjVMNy4xMiwxNC4yM2ExLjgxLDEuODEsMCwwLDAsMCwyLjU4LDEuNzgsMS43OCwwLDAsMCwxLjI5LjUyLDEuNzQsMS43NCwwLDAsMCwxLjI4LS41MkwxMi44LDEzLjdhLjI0LjI0LDAsMCwxLC4yNS0uMDdaTTE5LDQuOTJhNCw0LDAsMCwxLDAsNS42NkwxNi44NiwxMi43YS4yNS4yNSwwLDAsMS0uMTcuMDhsLTIuMi0uMjNhLjIxLjIxLDAsMCwxLS4xOS0uMTUuMjIuMjIsMCwwLDEsMC0uMjVMMTcuNDQsOWExLjgxLDEuODEsMCwwLDAsMC0yLjU4LDEuNzgsMS43OCwwLDAsMC0xLjI5LS41MiwxLjc0LDEuNzQsMCwwLDAtMS4yOC41MkwxMS43Niw5LjU3YS4yMS4yMSwwLDAsMS0uMjUsMCwuMjQuMjQsMCwwLDEtLjE2LS4yMWwtLjIyLTIuMTdhLjE5LjE5LDAsMCwxLC4wOC0uMThsMi4xMi0yLjE0YTQuMDgsNC4wOCwwLDAsMSwxLjI5LS44NSw0LjA1LDQuMDUsMCwwLDEsMy4wNiwwLDMuODUsMy44NSwwLDAsMSwxLjMuODVaTTUuODQsOS44MmEuMjUuMjUsMCwwLDEtLjE4LS4wOC4xOS4xOSwwLDAsMS0uMDctLjE5bC4xMS0uNzdhLjIuMiwwLDAsMSwuMTEtLjE3LjI0LjI0LDAsMCwxLC4yLDBsMi41LjcyYS4yNS4yNSwwLDAsMSwuMTUuMjcuMjIuMjIsMCwwLDEtLjIzLjIxbC0yLjU5LDBabTQuMTItMi0uNzMtMi41YS4yNy4yNywwLDAsMSwwLS4yQS4yMS4yMSwwLDAsMSw5LjQxLDVMMTAuMTksNWEuMjUuMjUsMCwwLDEsLjE5LDAsLjIzLjIzLDAsMCwxLC4wOC4xOGwtLjA1LDIuNjFhLjIuMiwwLDAsMS0uMTkuMjNoMEEuMjIuMjIsMCwwLDEsMTAsNy44NVptOC43Niw1LjU4YS4yNS4yNSwwLDAsMSwuMTguMDguMjMuMjMsMCwwLDEsLjA2LjJsLS4xMS43N2EuMjUuMjUsMCwwLDEtLjExLjE3LjIxLjIxLDAsMCwxLS4xMiwwbC0uMDgsMEwxNiwxNGEuMjUuMjUsMCwwLDEtLjE1LS4yNy4yMi4yMiwwLDAsMSwuMjItLjIxbDEuMjksMCwxLjMzLDBabS00LjEyLDIsLjc0LDIuNTFhLjI4LjI4LDAsMCwxLDAsLjIuMjMuMjMsMCwwLDEtLjE4LjExbC0uOC4xMWEuMjMuMjMsMCwwLDEtLjE3LS4wNy4yNS4yNSwwLDAsMS0uMDgtLjE4bDAtMi42MWEuMjIuMjIsMCwwLDEsLjIyLS4yMi4yMS4yMSwwLDAsMSwuMjYuMTVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc3KVwiLz48L2c+PC9zdmc+JyxcbiAgIG1hdGg6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDExLjgxIDE1LjczXCI+PGc+PHBhdGggZD1cIk0xNy4xOSw1LjczYTEsMSwwLDAsMCwuNzEtLjI5LDEsMSwwLDAsMCwuMjgtLjcsMSwxLDAsMCwwLTEtMUg3LjM1YTEsMSwwLDAsMC0xLDEsLjc3Ljc3LDAsMCwwLC4xMy40N2gwbDQuNTgsNi40M0w2LjY4LDE3LjgxYTEuMjUsMS4yNSwwLDAsMC0uMjkuNzEuOTQuOTQsMCwwLDAsLjI4LjcuOTIuOTIsMCwwLDAsLjY5LjI4SDE3LjJhMSwxLDAsMCwwLC43MS0uMjgsMSwxLDAsMCwwLDAtMS4zOS45Mi45MiwwLDAsMC0uNzEtLjI5SDkuMjZsMy44Ny01LjQzYS44Ni44NiwwLDAsMCwwLS45NUw5LjI2LDUuNzNoNy45M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTYuMzggLTMuNzcpXCIvPjwvZz48L3N2Zz4nLFxuICAgdW5saW5rOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43MlwiPjxnPjxwYXRoIGQ9XCJNMTksMTguMzJhNCw0LDAsMCwwLDAtNS42OEwxNS44NSw5LjVsLTEuMTcsMS41NUwxNy41NywxNGEyLDIsMCwwLDEsLjYxLDEuNDcsMi4wOCwyLjA4LDAsMCwxLTIuMDksMi4wOSwyLDIsMCwwLDEtMS40Ny0uNjFsLS4zOC0uMzctMS43NCwxLC44Ljc4YTQsNCwwLDAsMCw1LjY4LDBaTTgsOS43N2EyLDIsMCwwLDEtMS4yNy0xLDEuODksMS44OSwwLDAsMS0uMjEtMS41N0EyLjEsMi4xLDAsMCwxLDcuNDUsNiwyLDIsMCwwLDEsOSw1Ljc2TDEyLjI3LDcuMmwuNDktMkw5LjQ4LDMuOWE0LDQsMCwwLDAtMy4wNi40MUEzLjgyLDMuODIsMCwwLDAsNC41Niw2LjczYTMuOCwzLjgsMCwwLDAsLjQsM0EzLjc4LDMuNzgsMCwwLDAsNy4zOSwxMS42bDUuMzgsMiwuNDktMi0yLjY0LS45NEw4LDkuNzdaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHRhYmxlX2hlYWRlcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzUgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE3LDE5LjV2LS43OEgxNS41di43OEgxN1ptLTMsMHYtLjc4SDEyLjV2Ljc4SDE0Wm0tMywwdi0uNzhIOS41M3YuNzhIMTFabS0zLDB2LS43OEg2LjUzdi43OEg4Wm0xMC41NSwwYTEuNzMsMS43MywwLDAsMCwuODUtLjM1LDEuNjcsMS42NywwLDAsMCwuNTYtLjc2bC0uNzEtLjMxYTEuMjEsMS4yMSwwLDAsMS0uMzUuNCwxLjM0LDEuMzQsMCwwLDEtLjUzLjIzbC4wOC4zOGMuMDYuMjQuMDkuMzguMS40MVptLTEzLjctLjYzLjU1LS41NUEuNzcuNzcsMCwwLDEsNS4yNSwxOGExLjMxLDEuMzEsMCwwLDEtLjA2LS4zOHYtLjM4SDQuNDF2LjM4YTIsMiwwLDAsMCwuMTIuNjgsMS42LDEuNiwwLDAsMCwuMzUuNTdabTE1LjI3LTIuMTJWMTUuMjZoLS43OHYxLjQ5aC43OFptLTE1LTFWMTQuMjNINC40MXYxLjQ5aC43OFptMTUtMlYxMi4yNmgtLjc4djEuNDloLjc4Wm0tMTUtMVYxMS4yMkg0LjQxdjEuNTFoLjc4Wm0xNS0yVjkuMjZoLS43OHYxLjUxaC43OFptLTE1LTFWOC4xN0g0LjQxVjkuNzRoLjc4Wm0xNS0yVjYuMjhoLS43OFY3Ljc3aC43OFptLTE1LTEuMTFWNS4zM0w0LjQ4LDUuMWEuNzcuNzcsMCwwLDAtLjA3LjI3LDIuNzIsMi43MiwwLDAsMCwwLC4yOHYxaC43OVpNMTkuMjEsNWwuNjMtLjRBMS42MiwxLjYyLDAsMCwwLDE5LjE2LDRhMS45NCwxLjk0LDAsMCwwLS45MS0uMjJ2Ljc4YTEuMzEsMS4zMSwwLDAsMSwuNTYuMTIuODguODgsMCwwLDEsLjQuMzZaTTYsNC41NEg3Ljc4VjMuNzZINmEuODIuODIsMCwwLDAtLjI4LjA2bC4xMi4zNWMuMDcuMjEuMS4zMy4xMS4zNlptMTAuOCwwVjMuNzZIMTUuMjh2Ljc4aDEuNDlabS0zLDBWMy43NkgxMi4yOHYuNzhoMS40OVptLTMsMFYzLjc2SDkuMjh2Ljc4aDEuNTFaTTYsMTAuODRoMTIuNlY2LjkxSDZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbWVyZ2VfY2VsbDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzYgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE4LjkyLDEzLjVoMS4yM3Y0LjE1QTEuODQsMS44NCwwLDAsMSwxOC4zLDE5LjVIMTRWMTguMjdIMTguM2EuNi42LDAsMCwwLC40NC0uMTguNTkuNTksMCwwLDAsLjE4LS40NFYxMy41Wk0xOC4zLDMuNzZhMS44NCwxLjg0LDAsMCwxLDEuODUsMS44NVY5LjgySDE4LjkyVjUuNmEuNi42LDAsMCwwLS4xOC0uNDRBLjU5LjU5LDAsMCwwLDE4LjMsNUgxNFYzLjc2SDE4LjNabTEuODUsOC41MUgxNS42TDE3LjI2LDE0bC0uODYuODYtMy4xNC0zLjE3TDE2LjQsOC41MWwuODYuODZMMTUuNjIsMTFoNC41NHYxLjI0Wm0tMTMuOSw2aDQuMjdWMTkuNUg2LjI1QTEuODQsMS44NCwwLDAsMSw0LjQsMTcuNjVWMTMuNUg1LjYzdjQuMTVhLjYxLjYxLDAsMCwwLC42Mi42MlptMC0xNC41MWg0LjI3VjVINi4yNWEuNi42LDAsMCwwLS40NC4xOC41Ny41NywwLDAsMC0uMTcuNDNWOS44MUg0LjQxVjUuNkExLjgzLDEuODMsMCwwLDEsNi4yNSwzLjc2Wm01LDcuOUw4LjE1LDE0LjgzLDcuMywxNCw5LDEyLjI3SDQuNDFWMTFIOC45NEw3LjMsOS4zOCw3LjczLDlsLjQzLS40M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBzcGxpdF9jZWxsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NSAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTAuMzcsMTIuMjVINi43NEw4LjQsMTMuOTRsLS44Ny44Nkw0LjQxLDExLjYzLDcuNTMsOC41bC44Ny44Nkw2Ljc0LDExaDMuNjJ2MS4yM1ptOS43OC0uNjFMMTcsMTQuODEsMTYuMTMsMTRsMS42Ni0xLjY5SDE0LjE2VjExaDMuNjNMMTYuMTMsOS4zN2wuNDMtLjQzQTUuMjQsNS4yNCwwLDAsMSwxNyw4LjUxWk0xOC45LDguMjJWNS42MWEuNTcuNTcsMCwwLDAtLjE4LS40M0EuNjUuNjUsMCwwLDAsMTguMjksNUgxMi44OFYxOC4yOGg1LjQxYS43LjcsMCwwLDAsLjQ0LS4xOC41Ny41NywwLDAsMCwuMTgtLjQzVjE1aDEuMjN2Mi42NGExLjg0LDEuODQsMCwwLDEtMS44NSwxLjgzaC0xMkExLjg0LDEuODQsMCwwLDEsNC45NCwxOWExLjgxLDEuODEsMCwwLDEtLjU0LTEuMjlWMTVINS42M3YyLjY0YS41Ny41NywwLDAsMCwuMTguNDMuNjcuNjcsMCwwLDAsLjQ0LjE4aDUuNDFWNUg2LjI1YS43LjcsMCwwLDAtLjQ0LjE4LjU2LjU2LDAsMCwwLS4xNy40M1Y4LjIySDQuNDFWNS42MUExLjgsMS44LDAsMCwxLDUsNC4zMWExLjkxLDEuOTEsMCwwLDEsMS4zMS0uNTVoMTJhMS44OSwxLjg5LDAsMCwxLDEuMzEuNTUsMS44LDEuOCwwLDAsMSwuNTQsMS4zVjguMjNIMTguOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBjYXB0aW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43OVwiPjxnPjxwYXRoIGQ9XCJNNC40MSwxOC41MkgyMC4xNXYtMkg0LjQxWk0yMCw0LjczSDE4LjA3VjZoLjY1di42NUgyMFY0LjczWk0xNyw2VjQuNzNIMTQuNTVWNkgxN1pNMTMuNDksNlY0LjczSDExVjZoMi40N1pNMTAsNlY0LjczSDcuNVY2SDEwWk01Ljc5LDZoLjY1VjQuNzNINC41VjYuNjdINS44VjZaTTQuNSwxMS4zNEg1Ljc5VjguNDhINC41Wk02LjQ0LDEzLjhINS43OXYtLjY1SDQuNXYxLjk0SDYuNDRaTTE3LDE1LjA5VjEzLjhIMTQuNTV2MS4yOUgxN1ptLTMuNTIsMFYxMy44SDExdjEuMjloMi40N1ptLTMuNTMsMFYxMy44SDcuNXYxLjI5SDEwWk0yMCwxMy4xNkgxOC43MnYuNjVoLS42NVYxNS4xSDIwWm0tMS4yOS0xLjgySDIwVjguNDhoLTEuM3YyLjg2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43MylcIi8+PC9nPjwvc3ZnPicsXG4gICBlZGl0OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43M1wiPjxnPjxwYXRoIGQ9XCJNNy41MSw1LjY4aDZsMS41Mi0xLjU3SDYuOTRhMi40LDIuNCwwLDAsMC0xLjc5LjgyQTIuOCwyLjgsMCwwLDAsNC40MSw2LjhWMTdhMi41NSwyLjU1LDAsMCwwLC43NSwxLjhBMi40OCwyLjQ4LDAsMCwwLDcsMTkuNUgxNy4yMmEyLjU3LDIuNTcsMCwwLDAsMS44My0uNzQsMi41MiwyLjUyLDAsMCwwLC43Ny0xLjhWOC44M2wtMS41OCwxLjU0djZhMS41NCwxLjU0LDAsMCwxLTEuNTMsMS41M0g3LjUxQTEuNTQsMS41NCwwLDAsMSw2LDE2LjQxVjcuMjFBMS41MiwxLjUyLDAsMCwxLDcuNTEsNS42OFptNS42Myw3LjQ3aDBMMTAuNywxMC43NGwtMSwzLjM4LDEuNzEtLjQ4LDEuNy0uNDlabS4zNC0uMzRoMGw1LjM2LTUuMzJMMTYuNCw1LjA4LDExLDEwLjRsMS4yMywxLjIxLDEuMjEsMS4yWk0xOS45Myw2LjRhLjgyLjgyLDAsMCwwLC4yMi0uNDhBLjU0LjU0LDAsMCwwLDIwLDUuNDdMMTguNDUsNEEuNjcuNjcsMCwwLDAsMTgsMy43N2EuNy43LDAsMCwwLS40OC4yMWwtLjc0LjcyLDIuNDQsMi40My4zNy0uMzcuMzUtLjM2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMy43NylcIi8+PC9nPjwvc3ZnPicsXG4gICBkZWxldGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjczIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOS4xNiw2LjcxYS45NC45NCwwLDAsMCwuNjktLjI4LjkxLjkxLDAsMCwwLC4yOS0uNjhBMSwxLDAsMCwwLDE5Ljg1LDVhLjkzLjkzLDAsMCwwLS42OS0uM0gxNC4yNEEuOTQuOTQsMCwwLDAsMTQsNC4wNmEuOTIuOTIsMCwwLDAtLjctLjNoLTJhMSwxLDAsMCwwLS43LjMuOTMuOTMsMCwwLDAtLjI4LjY4SDUuMzlBLjkyLjkyLDAsMCwwLDQuNyw1YTEsMSwwLDAsMC0uMjkuNzEuOTEuOTEsMCwwLDAsLjI5LjY4LDEsMSwwLDAsMCwuNjkuMjhIMTkuMTZabS0xMi43OSwxYTEsMSwwLDAsMC0uNy4zLjk0Ljk0LDAsMCwwLS4yOC42OXY4Ljg1QTEuODgsMS44OCwwLDAsMCw2LDE4LjkzYTEuOSwxLjksMCwwLDAsMS4zOS41N0gxNy4yYTEuODcsMS44NywwLDAsMCwxLjM5LS41OCwxLjkxLDEuOTEsMCwwLDAsLjU4LTEuMzlWOC42OEExLDEsMCwwLDAsMTguODgsOGEuODkuODksMCwwLDAtLjctLjI5LDEsMSwwLDAsMC0uNjkuMjkuOTIuOTIsMCwwLDAtLjI5LjY4djcuODdhMSwxLDAsMCwxLTEsMUg4LjM0YS45NC45NCwwLDAsMS0uNjktLjI4LDEsMSwwLDAsMS0uMjktLjcxVjguNjhhMSwxLDAsMCwwLTEtMVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbW9kaWZ5OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOS43OSwxNS4yM2EuNjYuNjYsMCwwLDEsLjMuMzguNTkuNTksMCwwLDEtLjA3LjQ4bC0uOCwxLjM4YS42Ni42NiwwLDAsMS0uMzguMy41OS41OSwwLDAsMS0uNDgtLjA3bC0uNjgtLjM4YTQuNTUsNC41NSwwLDAsMS0xLjM0Ljc3di43OGEuNjQuNjQsMCwwLDEtLjE4LjQ1LjYxLjYxLDAsMCwxLS40NS4xOGgtMS42YS42LjYsMCwwLDEtLjQ0LS4xOC42Ni42NiwwLDAsMS0uMTktLjQ1di0uNzhhNC4zNiw0LjM2LDAsMCwxLTEuMzItLjc3bC0uNjkuMzhhLjU4LjU4LDAsMCwxLS40OC4wNy42Ni42NiwwLDAsMS0uMzgtLjNsLS4zOC0uNjZoLjgzYTEuNzcsMS43NywwLDAsMCwxLjIzLS41MiwxLjcyLDEuNzIsMCwwLDAsLjUxLTEuMjN2LS4xOGEzLDMsMCwwLDAsLjQ5LS4yOGwuMTUuMDlhMS44MywxLjgzLDAsMCwwLC44OC4yM0ExLjc1LDEuNzUsMCwwLDAsMTUuODQsMTRsLjg4LTEuNTJhMS43LDEuNywwLDAsMCwuMTctMS4zMiwxLjY2LDEuNjYsMCwwLDAtLjMtLjYxLDEuODQsMS44NCwwLDAsMC0uNTEtLjQ1bC0uMTUtLjA5LDAtLjI5LDAtLjI4LjE1LS4wOWExLDEsMCwwLDAsLjI2LS4xOGwwLC4wNnYuNzhhNC4zNCw0LjM0LDAsMCwxLDEuMzQuNzdsLjY4LS4zOGEuNjguNjgsMCwwLDEsLjQ4LS4wNi42NC42NCwwLDAsMSwuMzguMjlsLjgsMS4zOGEuNTguNTgsMCwwLDEsLjA3LjQ4LjYzLjYzLDAsMCwxLS4zLjM4bC0uNjguNGEzLjg0LDMuODQsMCwwLDEsLjA4Ljc2LDQuMTMsNC4xMywwLDAsMS0uMDguNzhsLjM0LjE4LjMyLjJaTTEwLjE3LDcuODZhMS45LDEuOSwwLDAsMSwxLjM1LDMuMjMsMS44NSwxLjg1LDAsMCwxLTEuMzUuNTVBMS45LDEuOSwwLDAsMSw4LjgzLDguNDFhMS45MiwxLjkyLDAsMCwxLDEuMzQtLjU1Wm0xLjU4LDcuMmEuNzMuNzMsMCwwLDEtLjIxLjQ5LjY2LjY2LDAsMCwxLS40OC4ySDkuMjlhLjY4LjY4LDAsMCwxLS42OS0uNjlWMTQuMmE0Ljc1LDQuNzUsMCwwLDEtMS40OC0uODZsLS43NS40NWEuNzMuNzMsMCwwLDEtLjcsMCwuNjMuNjMsMCwwLDEtLjI1LS4yNkw0LjU0LDEyYS42Ny42NywwLDAsMS0uMDgtLjUzLjcxLjcxLDAsMCwxLC4zMi0uNDJsLjc1LS40M2E0LjgsNC44LDAsMCwxLS4wOC0uODUsNC43MSw0LjcxLDAsMCwxLC4wOC0uODVsLS43NC0uNDRhLjcxLjcxLDAsMCwxLS4zMi0uNDIuNjUuNjUsMCwwLDEsLjA3LS41NEw1LjQyLDZhLjY2LjY2LDAsMCwxLC40Mi0uMzJsLjE4LDBhLjczLjczLDAsMCwxLC4zNS4wOWwuNzUuNDNBNC42OCw0LjY4LDAsMCwxLDguNiw1LjMzVjQuNDVhLjY4LjY4LDAsMCwxLC42OS0uNjloMS43N2EuNjQuNjQsMCwwLDEsLjQ4LjIuNzMuNzMsMCwwLDEsLjIxLjQ5di44OGE0Ljc1LDQuNzUsMCwwLDEsMS40OC44NUwxNCw1Ljc1YS42Ny42NywwLDAsMSwuMzQtLjA5bC4xOCwwYS43MS43MSwwLDAsMSwuNDIuMzJsLjg5LDEuNTRhLjY3LjY3LDAsMCwxLC4wNi41Mi43My43MywwLDAsMS0uMzIuNDNsLS43NS40MmE0LjgsNC44LDAsMCwxLC4wOC44NSw0LjcxLDQuNzEsMCwwLDEtLjA4Ljg1bC43NS40M2EuNjYuNjYsMCwwLDEsLjMyLjQyLjczLjczLDAsMCwxLS4wNi41NGwtLjg5LDEuNTJhLjY5LjY5LDAsMCwxLS4yNS4yNi43LjcsMCwwLDEtLjM1LjA5LjY0LjY0LDAsMCwxLS4zNC0uMDlsLS43NS0uNDVhNC44Nyw0Ljg3LDAsMCwxLTEuNDguODZ2Ljg3Wk03LjIzLDkuNzVhMywzLDAsMCwwLC44NiwyLjA4LDIuOTQsMi45NCwwLDEsMCw0LjE2LTQuMTYsMywzLDAsMCwwLTIuMDgtLjg1QTIuOTQsMi45NCwwLDAsMCw3LjIzLDkuNzVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ0IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHJldmVydDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzYgMTQuNjlcIj48Zz48cGF0aCBkPVwiTTE4LjI2LDE1VjEyLjNsMS44OS0yVjE1YTIuNTgsMi41OCwwLDAsMS0uMjQsMWMtLjIuNTgtLjc1LjkyLTEuNjUsMUg3LjU2djJMNC40MSwxNS42Myw3LjU2LDEzdjJoMTAuN1pNNi4zLDguMjhWMTFMNC40MSwxM1Y4LjI4YTIuNTgsMi41OCwwLDAsMSwuMjQtMWMuMi0uNTguNzUtLjkyLDEuNjUtMUgxN3YtMmwzLjE1LDMuMzRMMTcsMTAuM3YtMkg2LjNaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQgLTQuMjgpXCIvPjwvZz48L3N2Zz4nLFxuICAgYXV0b19zaXplOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNNi43MSwxNy4xOSw2Ljg5LDE2bDEuMjEtLjE1QTYsNiwwLDAsMSw2LjgxLDEzLjlhNS43OCw1Ljc4LDAsMCwxLS40NS0yLjI3QTYsNiwwLDAsMSw4LjEsNy40NWE1LjgzLDUuODMsMCwwLDEsNC4xNy0xLjczbDEtMS0xLTFBNy44OSw3Ljg5LDAsMCwwLDUsMTQuNjRhNy43Myw3LjczLDAsMCwwLDEuNzEsMi41NVptNS41NywyLjMxaDBBNy44Niw3Ljg2LDAsMCwwLDE3Ljg1LDYuMDdMMTcuNjcsNy4zbC0xLjIxLjE1YTUuOSw1LjksMCwwLDEsMS4yOSwxLjkyLDUuODEsNS44MSwwLDAsMSwuNDUsMi4yNiw1LjkxLDUuOTEsMCwwLDEtNS45LDUuOWwtMSwxLC40OS40OS40Ny41WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBpbnNlcnRfcm93X2JlbG93OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS44IDE1LjhcIj48Zz48cGF0aCBkPVwiTTE1LjcsMS4zYy0wLjEtMC4xLTAuMS0wLjItMC4yLTAuMkwxNS4zLDFIMC40TDAuMywxLjFjMCwwLTAuMSwwLjEtMC4xLDAuMWMwLDAtMC4xLDAuMS0wLjEsMC4xTDAsMS40djcuN2wwLjEsMC4xYzAsMC4xLDAuMSwwLjEsMC4yLDAuMmwwLjEsMC4xaDIuM1Y5LjNsMC4xLTAuNUwzLDguNWwwLjEtMC4yYy0wLjEsMC0wLjIsMC0wLjMsMEgxLjJ2LTZoMTMuM3Y2aC0xLjZjLTAuMSwwLTAuMiwwLTAuMywwbDAuMSwwLjJsMC4yLDAuNEMxMi45LDksMTMsOS4yLDEzLDkuM3YwLjFoMi4zbDAuMi0wLjFjMC4xLDAsMC4xLTAuMSwwLjItMC4ybDAuMS0wLjFWMS40TDE1LjcsMS4zelwiLz48cGF0aCBkPVwiTTEwLjUsNy41QzkuOSw3LjEsOS4zLDYuOCw4LjYsNi43Yy0wLjIsMC0wLjUtMC4xLTAuNywwYy0wLjIsMC0wLjUsMC0wLjcsMEM2LjYsNi43LDYuMSw2LjksNS42LDcuM0M1LjIsNy42LDQuNyw4LDQuNCw4LjRDNC4zLDguNiw0LjIsOC44LDQuMiw4LjlDNC4xLDkuMSw0LDkuMywzLjksOS40QzMuOSw5LjYsMy44LDkuNywzLjgsOS45YzAsMC4yLTAuMSwwLjMtMC4xLDAuNXYtMC4xYy0wLjEsMC44LDAuMSwxLjYsMC41LDIuNGMwLjQsMC43LDEsMS4zLDEuNywxLjdjMC4zLDAuMiwwLjYsMC4zLDAuOSwwLjNjMC4zLDAuMSwwLjcsMC4xLDEsMC4xYzAuMywwLDAuNywwLDEtMC4xYzAuMy0wLjEsMC42LTAuMiwwLjktMC4zYzAuNS0wLjMsMC45LTAuNiwxLjMtMWMwLjMtMC40LDAuNi0wLjgsMC44LTEuM2MwLjEtMC40LDAuMi0wLjksMC4yLTEuNGMwLTAuNS0wLjEtMS0wLjMtMS40QzExLjUsOC42LDExLjEsOCwxMC41LDcuNXogTTEwLjEsMTEuM0g4LjV2MS42SDhINy45SDcuM3Ywdi0wLjF2LTEuNEg1Ljd2LTAuNHYtMC4ydi0wLjZoMGgxLjVWOC41aDEuMnYxLjZoMS42VjExLjN6XCIvPjwvZz48L3N2Zz4nLFxuICAgaW5zZXJ0X3Jvd19hYm92ZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuOCAxNS44XCI+PGc+PHBhdGggZD1cIk0wLjEsMTQuNWMwLjEsMC4xLDAuMSwwLjIsMC4yLDAuMmwwLjEsMC4xaDE0LjlsMC4xLTAuMWMwLDAsMC4xLTAuMSwwLjEtMC4xYzAsMCwwLjEtMC4xLDAuMS0wLjFsMC4xLTAuMVY2LjdsLTAuMS0wLjFjMC0wLjEtMC4xLTAuMS0wLjItMC4ybC0wLjEtMC4xaC0yLjN2MC4xbC0wLjEsMC41bC0wLjIsMC40bC0wLjEsMC4yYzAuMSwwLDAuMiwwLDAuMywwaDEuNnY2SDEuM3YtNmgxLjZjMC4xLDAsMC4yLDAsMC4zLDBMMy4xLDcuM0wyLjksNi45QzIuOCw2LjgsMi44LDYuNiwyLjcsNi41VjYuM0gwLjRMMC4zLDYuNGMtMC4xLDAtMC4xLDAuMS0wLjIsMC4yTDAsNi43djcuN0wwLjEsMTQuNXpcIi8+PHBhdGggZD1cIk01LjMsOC4zYzAuNiwwLjUsMS4yLDAuOCwxLjksMC45YzAuMiwwLDAuNSwwLjEsMC43LDBjMC4yLDAsMC41LDAsMC43LDBjMC42LTAuMSwxLjEtMC4zLDEuNi0wLjZjMC41LTAuMywwLjktMC43LDEuMi0xLjJjMC4xLTAuMiwwLjItMC4zLDAuMy0wLjVjMC4xLTAuMiwwLjItMC40LDAuMi0wLjVjMC4xLTAuMSwwLjEtMC4zLDAuMS0wLjRDMTIsNS44LDEyLDUuNiwxMiw1LjR2MC4xYzAuMS0wLjgtMC4xLTEuNi0wLjUtMi40Yy0wLjQtMC43LTEtMS4zLTEuNy0xLjdDOS41LDEuMyw5LjIsMS4yLDguOSwxLjFDOC41LDEsOC4yLDEsNy45LDFjLTAuMywwLTAuNywwLTEsMC4xQzYuNiwxLjIsNi4zLDEuMyw2LDEuNEM1LjUsMS43LDUuMSwyLDQuNywyLjRDNC40LDIuOCw0LjEsMy4zLDMuOSwzLjhDMy44LDQuMiwzLjcsNC43LDMuNyw1LjJjMCwwLjUsMC4xLDEsMC4zLDEuNEM0LjMsNy4yLDQuNyw3LjgsNS4zLDguM3ogTTUuNyw0LjVoMS42VjIuOWgwLjVoMC4xaDAuNnYwdjAuMXYxLjRIMTB2MC40djAuMnYwLjZoMEg4LjV2MS42SDcuM1Y1LjdINS43VjQuNXpcIi8+PC9nPjwvc3ZnPicsXG4gICBpbnNlcnRfY29sdW1uX2xlZnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMTQuNSwxNS43YzAuMS0wLjEsMC4yLTAuMSwwLjItMC4ybDAuMS0wLjFWMC40bC0wLjEtMC4xYzAsMC0wLjEtMC4xLTAuMS0wLjFjMCwwLTAuMS0wLjEtMC4xLTAuMUwxNC40LDBINi43TDYuNiwwLjFjLTAuMSwwLTAuMSwwLjEtMC4yLDAuMkw2LjMsMC40djIuM2gwLjFsMC41LDAuMUw3LjMsM2wwLjIsMC4xYzAtMC4xLDAtMC4yLDAtMC4zVjEuMmg2djEzLjNoLTZ2LTEuNmMwLTAuMSwwLTAuMiwwLTAuM2wtMC4yLDAuMWwtMC40LDAuMkM2LjcsMTIuOSw2LjYsMTMsNi40LDEzSDYuM3YyLjNsMC4xLDAuMmMwLDAuMSwwLjEsMC4xLDAuMiwwLjJsMC4xLDAuMWg3LjdMMTQuNSwxNS43elwiLz48cGF0aCBkPVwiTTguMywxMC41QzguNywxMCw5LDkuMyw5LjEsOC42YzAtMC4yLDAuMS0wLjUsMC0wLjdjMC0wLjIsMC0wLjUsMC0wLjdDOSw2LjcsOC44LDYuMSw4LjUsNS43QzguMiw1LjIsNy44LDQuOCw3LjMsNC41QzcuMiw0LjQsNyw0LjMsNi45LDQuMkM2LjcsNC4xLDYuNSw0LDYuNCw0QzYuMiwzLjksNi4xLDMuOSw1LjksMy44Yy0wLjIsMC0wLjMtMC4xLTAuNS0wLjFoMC4xQzQuNywzLjcsMy44LDMuOSwzLjEsNC4zQzIuNCw0LjcsMS44LDUuMywxLjQsNkMxLjMsNi4zLDEuMiw2LjYsMS4xLDYuOUMxLDcuMiwxLDcuNiwxLDcuOWMwLDAuMywwLDAuNywwLjEsMWMwLjEsMC4zLDAuMiwwLjYsMC4zLDAuOWMwLjMsMC41LDAuNiwwLjksMSwxLjNjMC40LDAuMywwLjgsMC42LDEuMywwLjhDNC4yLDEyLDQuNywxMi4xLDUuMSwxMmMwLjUsMCwxLTAuMSwxLjQtMC4zQzcuMiwxMS41LDcuOCwxMS4xLDguMywxMC41ek00LjUsMTAuMVY4LjVIMi45VjhWNy45VjcuM2gwSDNoMS40VjUuN2gwLjRoMC4yaDAuNnYwdjEuNWgxLjZ2MS4ySDUuN3YxLjZINC41elwiLz48L2c+PC9zdmc+JyxcbiAgIGluc2VydF9jb2x1bW5fcmlnaHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMS4zLDAuMUMxLjIsMC4yLDEuMSwwLjIsMS4xLDAuM0wxLDAuNHYxNC45bDAuMSwwLjFjMCwwLDAuMSwwLjEsMC4xLDAuMWMwLDAsMC4xLDAuMSwwLjEsMC4xbDAuMSwwLjFoNy43bDAuMS0wLjFjMC4xLDAsMC4xLTAuMSwwLjItMC4ybDAuMS0wLjF2LTIuM0g5LjNsLTAuNS0wLjFsLTAuNC0wLjJsLTAuMi0wLjFjMCwwLjEsMCwwLjIsMCwwLjN2MS42aC02VjEuM2g2djEuNmMwLDAuMSwwLDAuMiwwLDAuM2wwLjItMC4xbDAuNC0wLjJDOSwyLjksOS4yLDIuOCw5LjMsMi44aDAuMVYwLjVMOS40LDAuM2MwLTAuMS0wLjEtMC4xLTAuMi0wLjJMOS4xLDBIMS40TDEuMywwLjF6XCIvPjxwYXRoIGQ9XCJNNy41LDUuM0M3LDUuOCw2LjcsNi41LDYuNiw3LjJjMCwwLjItMC4xLDAuNSwwLDAuN2MwLDAuMiwwLDAuNSwwLDAuN2MwLjEsMC42LDAuMywxLjEsMC42LDEuNmMwLjMsMC41LDAuNywwLjksMS4yLDEuMmMwLjIsMC4xLDAuMywwLjIsMC41LDAuM2MwLjIsMC4xLDAuNCwwLjIsMC41LDAuMmMwLjEsMC4xLDAuMywwLjEsMC40LDAuMWMwLjIsMCwwLjMsMC4xLDAuNSwwLjFoLTAuMWMwLjgsMC4xLDEuNi0wLjEsMi40LTAuNWMwLjctMC40LDEuMy0xLDEuNy0xLjdjMC4yLTAuMywwLjMtMC42LDAuMy0wLjljMC4xLTAuMywwLjEtMC43LDAuMS0xYzAtMC4zLDAtMC43LTAuMS0xYy0wLjEtMC4zLTAuMi0wLjYtMC4zLTAuOWMtMC4zLTAuNS0wLjYtMC45LTEtMS4zQzEzLDQuNCwxMi41LDQuMiwxMiw0Yy0wLjQtMC4xLTAuOS0wLjItMS40LTAuMmMtMC41LDAtMSwwLjEtMS40LDAuMkM4LjUsNC4zLDcuOSw0LjcsNy41LDUuM3ogTTExLjMsNS43djEuNmgxLjZ2MC41djAuMXYwLjZoMGgtMC4xaC0xLjR2MS42aC0wLjRoLTAuMmgtMC42djBWOC41SDguNVY3LjNoMS42VjUuN0gxMS4zelwiLz48L2c+PC9zdmc+JyxcbiAgIGRlbGV0ZV9yb3c6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDEzLjgzXCI+PGc+PHBhdGggZD1cIk00LjcsMTguNDZsLjEyLjA4SDE5LjczbC4xMi0uMDhhLjU4LjU4LDAsMCwwLC4yMi0uMjJsLjA4LS4xMiwwLTcuNjktLjA4LS4xMWEuNzcuNzcsMCwwLDAtLjE4LS4xOGwtLjExLS4wOC0yLjMxLDAtLjA4LjI4LS4xLjI5YTEuNTgsMS41OCwwLDAsMS0uMTIuMjlsLS4xNC4zNHMwLDAsLjE4LDBIMTguOXY2SDUuNjR2LTZINy4zNWMuMTQsMCwuMiwwLC4xOCwwbC0uMTQtLjM0YTIuODUsMi44NSwwLDAsMS0uMTItLjI5bC0uMS0uMjktLjA3LS4yNy0yLjMxLDAtLjExLjA4YS43Ny43NywwLDAsMC0uMTguMThsLS4wOC4xMSwwLDcuNjkuMDguMTJhLjQ3LjQ3LDAsMCwwLC4wOS4xMmwuMTMuMDlaTTEyLjExLDEzYTQsNCwwLDAsMCwxLjQ2LS4yMSw0LjUxLDQuNTEsMCwwLDAsMS4zMS0uNzFBNCw0LDAsMCwwLDE2LjI2LDEwYTQuMzIsNC4zMiwwLDAsMC0uMDgtMi41NCw0LjM0LDQuMzQsMCwwLDAtMS0xLjUyLDQuMTUsNC4xNSwwLDAsMC0xLjU0LTEsNC4zNCw0LjM0LDAsMCwwLTEuMzUtLjIyQTQuMDcsNC4wNywwLDAsMCwxMSw0LjkzLDMuOTQsMy45NCwwLDAsMCw5LjI0LDYuMDcsMy45MiwzLjkyLDAsMCwwLDguMTUsOC44OGEzLjkxLDMuOTEsMCwwLDAsLjEyLjk1QTQuMTYsNC4xNiwwLDAsMCwxMi4xMSwxM1ptMi4zNS00LjE0di41OEgxMC4wOVY4LjI3aDQuMzd2LjU4WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC00LjcxKVwiLz48L2c+PC9zdmc+JyxcbiAgIGRlbGV0ZV9jb2x1bW46ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEzLjgxIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk01LjY2LDE5LjQybC4xMi4wOCw3LjY5LDAsLjExLS4wOGEuNzcuNzcsMCwwLDAsLjE4LS4xOGwuMDgtLjExLDAtMi4zMi0uMTUsMC0uNDUtLjE1LS40Mi0uMTgtLjE3LS4wN2ExLDEsMCwwLDAsMCwuMjd2MS42M2gtNlY1aDZWNi42MmEuOS45LDAsMCwwLDAsLjI2bC4xNy0uMDcuNDItLjE3YTMuOTEsMy45MSwwLDAsMSwuNDUtLjE1bC4xNSwwLDAtMi4zMkwxMy43NSw0YS43Ny43NywwLDAsMC0uMTgtLjE4bC0uMTEtLjA4SDUuNzlsLS4xMy4wN2EuNjMuNjMsMCwwLDAtLjIxLjIybC0uMDguMTJWMTkuMDhsLjA4LjEyYS40Ny40NywwLDAsMCwuMDkuMTIuMzUuMzUsMCwwLDAsLjEyLjFabTktMy42N2E0LjE2LDQuMTYsMCwwLDAsMi4zNi0uNTEsNC4wOCw0LjA4LDAsMCwwLDEuNjctMS43Miw0LDQsMCwwLDAsLjM1LS45MSwzLjc5LDMuNzksMCwwLDAsLjEtMSw0LjcxLDQuNzEsMCwwLDAtLjExLTEsNSw1LDAsMCwwLS4zLS44Nyw0LjI1LDQuMjUsMCwwLDAtMS0xLjI1LDQuNDksNC40OSwwLDAsMC0xLjM0LS44MUE0LjI2LDQuMjYsMCwwLDAsMTUsNy40OGEzLjg4LDMuODgsMCwwLDAtMS40MS4yNUE0LjMyLDQuMzIsMCwwLDAsMTEuODYsOSw0LDQsMCwwLDAsMTEsMTAuOTRhNC40LDQuNCwwLDAsMC0uMDUuNjgsNC41LDQuNSwwLDAsMCwuMDUuNjgsMy45MywzLjkzLDAsMCwwLC42MSwxLjU3LDQuMjIsNC4yMiwwLDAsMCwxLjE4LDEuMiw0LjU5LDQuNTksMCwwLDAsLjQ4LjI3Yy4yLjEuMzcuMTcuNS4yMmEyLjQ0LDIuNDQsMCwwLDAsLjQ1LjEyLDQuNjEsNC42MSwwLDAsMCwuNS4wN1ptMi41NC00LjEydi41OEgxMi44N1YxMWg0LjM3di41OVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMzcgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgZml4ZWRfY29sdW1uX3dpZHRoOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNiw1SDE4QTEsMSAwIDAsMSAxOSw2QTEsMSAwIDAsMSAxOCw3SDZBMSwxIDAgMCwxIDUsNkExLDEgMCAwLDEgNiw1TTIxLDJWNEgzVjJIMjFNMTUsOEgxN1YyMkgxNVY4TTcsOEg5VjIySDdWOE0xMSw4SDEzVjIySDExVjhaXCIgLz48L3N2Zz4nLFxuICAgcm90YXRlX2xlZnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMC41LDEwLjJjMCwwLjEsMCwwLjIsMCwwLjN2MC4ybDAsMGMwLjEsMC4zLDAuMywwLjYsMC40LDAuOWwwLDBDMSwxMS44LDEuMywxMiwxLjUsMTEuOWgwLjFoMC4yaDAuMWMwLjEtMC4xLDAuMy0wLjMsMC40LTAuNXYtMC4yYzAtMC4xLDAtMC4yLTAuMS0wLjNsMCwwYy0wLjItMC4yLTAuMy0wLjQtMC4zLTAuN2wwLDBDMS44LDEwLDEuNyw5LjksMS41LDkuOGMtMC4xLDAtMC4yLDAtMC4zLDBIMC45QzAuNyw5LjksMC42LDEwLDAuNSwxMC4yTDAuNSwxMC4yelwiLz48cGF0aCBkPVwiTTIuMiwxMS41TDIuMiwxMS41TDIuMiwxMS41elwiLz48cGF0aCBkPVwiTTUuOSwzLjZMNS45LDMuNkw1LjksMy42elwiLz48cGF0aCBkPVwiTTAuMSw3LjljMCwwLjMsMCwwLjYsMCwwLjlsMCwwbDAsMGwwLDBsMCwwYzAsMC4yLDAuMSwwLjMsMC4yLDAuNGwwLDBjMC4yLDAuMSwwLjMsMC4yLDAuNSwwLjJsMCwwbDAsMGMwLjIsMCwwLjQtMC4xLDAuNS0wLjNsMCwwYzAtMC4xLDAuMS0wLjMsMC4xLTAuNFY4LjZsMCwwYzAtMC4yLDAtMC41LDAtMC43bDAsMGMwLTAuMi0wLjEtMC40LTAuMi0wLjVDMS4xLDcuMywwLjksNy4yLDAuNyw3LjJTMC4zLDcuMywwLjIsNy40QzAuMSw3LjUsMCw3LjcsMC4xLDcuOXpcIi8+PHBhdGggZD1cIk0xLjksMTIuN0wxLjksMTIuN2MwLDAuMiwwLDAuNCwwLjIsMC41bDAsMGwwLjIsMC4zbDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuNGwwLDBsMCwwbDAsMGwwLDBDMi45LDE0LDMsMTQuMSwzLjIsMTQuMXMwLjQtMC4xLDAuNS0wLjJjMC4xLTAuMiwwLjItMC4zLDAuMi0wLjV2LTAuMWMwLTAuMi0wLjEtMC40LTAuMi0wLjVsMCwwbC0wLjQtMC40bC0wLjItMC4ybDAsMEMzLDEyLjEsMi44LDEyLDIuNiwxMmwwLDBjLTAuMiwwLTAuNCwwLjEtMC41LDAuMmwwLDBDMiwxMi4zLDEuOSwxMi41LDEuOSwxMi43elwiLz48cGF0aCBkPVwiTTYuNiwxNWMwLDAuMiwwLjEsMC40LDAuMiwwLjVjMC4xLDAuMSwwLjIsMC4yLDAuNCwwLjNsMCwwYzAuMywwLDAuNSwwLDAuNywwaDAuM2wwLDBjMC4yLDAsMC40LTAuMSwwLjUtMC4yYzAuMS0wLjIsMC4yLTAuMywwLjItMC41bDAsMGwwLDBjMC0wLjItMC4xLTAuNC0wLjItMC41bDAsMGMtMC4xLTAuMS0wLjMtMC4yLTAuNS0wLjJsMCwwSDcuOWMtMC4xLDAtMC4zLDAtMC41LDBsMCwwSDcuM2MtMC4yLTAuMS0wLjMsMC0wLjUsMC4xbDAsMEM2LjcsMTQuNiw2LjYsMTQuOCw2LjYsMTVMNi42LDE1TDYuNiwxNUw2LjYsMTV6XCIvPjxwYXRoIGQ9XCJNNC4yLDcuNEM0LDcuNSw0LDcuNyw0LDcuOWMwLDAuMiwwLDAuNCwwLjIsMC41bDAsMGwzLjIsMy4ybDAsMGMwLjEsMC4xLDAuMywwLjIsMC41LDAuMnMwLjMtMC4xLDAuNS0wLjJsMCwwbDMuMi0zLjJsMCwwYzAuMS0wLjEsMC4yLTAuMywwLjItMC41YzAtMC4yLTAuMS0wLjQtMC4yLTAuNWwwLDBDMTEuNSw3LjMsMTEsNi43LDEwLDUuOGwwLDBMOC40LDQuMmwwLDBDOC4zLDQuMSw4LjEsNCw3LjksNFM3LjUsNC4xLDcuNCw0LjJMNC4yLDcuNEw0LjIsNy40eiBNNi44LDlMNS43LDcuOWwyLjItMi4ybDIuMywyLjJsLTIuMywyLjJDNy43LDkuOSw3LjMsOS41LDYuOCw5TDYuOCw5elwiLz48cGF0aCBkPVwiTTQuMSwxNC4xQzQsMTQuMiw0LDE0LjMsNCwxNC40djAuMmwwLDBjMC4xLDAuMSwwLjIsMC4zLDAuNCwwLjRsMCwwYzAuMywwLjEsMC42LDAuMiwwLjksMC40aDAuMWgwLjFsMCwwYzAuMiwwLDAuMy0wLjEsMC41LTAuMWwwLDBjMC4yLTAuMSwwLjMtMC4zLDAuMy0wLjRsMCwwbDAsMGwwLDBsMCwwdi0wLjJjMC0wLjEtMC4xLTAuMi0wLjEtMC4zbDAsMEM2LjEsMTQuMiw2LDE0LjEsNS44LDE0bDAsMGMtMC4zLTAuMS0wLjUtMC4yLTAuOC0wLjJsMCwwYy0wLjEtMC4xLTAuMi0wLjEtMC4zLTAuMUg0LjVDNC4zLDEzLjcsNC4yLDEzLjksNC4xLDE0LjF6XCIvPjxwYXRoIGQ9XCJNOS4zLDE0LjRjMCwwLjEtMC4xLDAuMywwLDAuNFYxNWwwLDBjMCwwLjEsMC4xLDAuMywwLjUsMC40YzAuMSwwLjEsMC4zLDAuMSwwLjQsMC4xbDAsMGgwLjFsMCwwYzAuMy0wLjEsMC42LTAuMiwwLjktMC4zbDAsMGMwLjEtMC4xLDAuMi0wLjIsMC4zLTAuNGwwLjEtMC4zYzAtMC4xLTAuMS0wLjItMC4xLTAuM2wwLDBjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40bDAsMGgtMC4zYy0wLjEsMC0wLjIsMC0wLjMsMGwwLDBjLTAuMiwwLjEtMC41LDAuMi0wLjgsMC4zbDAsMEM5LjUsMTQuMSw5LjQsMTQuMiw5LjMsMTQuNEw5LjMsMTQuNHpcIi8+PHBhdGggZD1cIk0xMS40LDE0LjdMMTEuNCwxNC43TDExLjQsMTQuN3pcIi8+PHBhdGggZD1cIk05LjUsMTUuM0w5LjUsMTUuM0w5LjUsMTUuM3pcIi8+PHBhdGggZD1cIk0xNS45LDcuOWMwLTEtMC4yLTItMC42LTNsMCwwYy0wLjQtMS0xLTEuOS0xLjctMi42QzEyLjgsMS42LDEyLDEsMTEsMC42bDAsMEMxMC4xLDAuMiw5LDAsOCwwQzcuMywwLDYuNSwwLjEsNS44LDAuM2wwLDBDNS4yLDAuNSw0LjYsMC44LDQsMS4xTDMuMSwwLjJsMCwwQzIuOSwwLjEsMi44LDAsMi42LDBIMi40bDAsMEMyLjIsMCwyLDAuMiwxLjksMC40bDAsMEwwLjEsNC45bDAsMEMwLDUsMCw1LjEsMCw1LjJjMCwwLjIsMC4xLDAuNCwwLjIsMC41bDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuMmgwLjFIMWwwLDBsNC43LTEuOGwwLDBDNS45LDQsNi4xLDMuOCw2LjEsMy42VjMuNEM2LjEsMy4yLDYsMyw1LjksMi45bDAsMEw1LjEsMi4xYzAuNC0wLjIsMC44LTAuNCwxLjMtMC41YzAuNS0wLjEsMS4xLTAuMiwxLjctMC4yYzAuOSwwLDEuNywwLjIsMi41LDAuNWwwLDBjMC44LDAuMywxLjUsMC44LDIuMSwxLjRjMC42LDAuNiwxLjEsMS4zLDEuNCwyLjFsMCwwYzAuMywwLjgsMC41LDEuNiwwLjUsMi41cy0wLjIsMS43LTAuNSwyLjVsMCwwYy0wLjMsMC44LTAuOCwxLjUtMS40LDIuMWMtMC4yLDAuMi0wLjQsMC4zLTAuNiwwLjVsMCwwYy0wLjIsMC4xLTAuMywwLjMtMC4zLDAuNXYwLjFjMCwwLjEsMCwwLjMsMC4xLDAuNGwwLDBjMC4xLDAuMiwwLjMsMC4zLDAuNSwwLjNsMCwwYzAuMSwwLDAuMy0wLjEsMC40LTAuMmwwLDBsMCwwbDAsMGwwLDBjMC4yLTAuMiwwLjUtMC40LDAuNy0wLjZsMCwwbDAsMGwwLDBsMCwwYzAuNy0wLjgsMS4zLTEuNiwxLjctMi42QzE1LjYsMTAsMTUuOCw5LDE1LjksNy45eiBNMS45LDRDMiwzLjgsMi4xLDMuNSwyLjMsMy4xbDAsMEwyLjcsMmwxLjIsMS4yTDEuOSw0elwiLz48cGF0aCBkPVwiTTYuOCwxNS41TDYuOCwxNS41TDYuOCwxNS41elwiLz48L2c+PC9zdmc+JyxcbiAgIHJvdGF0ZV9yaWdodDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuOCAxNS44XCI+PGc+PHBhdGggZD1cIk05LjksMTUuM0w5LjksMTUuM0w5LjksMTUuM3pcIi8+PHBhdGggZD1cIk02LjksMTUuMUw2LjksMTUuMWMwLDAuMSwwLjEsMC4zLDAuMiwwLjRsMCwwYzAuMSwwLjIsMC4zLDAuMywwLjUsMC4zbDAsMGgwLjNjMC4yLDAsMC40LDAsMC43LDBsMCwwYzAuMi0wLjEsMC4zLTAuMiwwLjQtMC4zYzAuMS0wLjEsMC4yLTAuMiwwLjItMC40VjE1YzAtMC4yLTAuMS0wLjQtMC4yLTAuNGMtMC4yLTAuMS0wLjMtMC4yLTAuNS0wLjJIOC40bDAsMGMtMC4xLDAtMC4zLDAtMC41LDBINy42bDAsMGMtMC4yLDAtMC40LDAuMS0wLjUsMC4yQzcsMTQuNyw2LjksMTQuOSw2LjksMTUuMXpcIi8+PHBhdGggZD1cIk02LjUsMTQuNEw2LjUsMTQuNEw2LjUsMTQuNHpcIi8+PHBhdGggZD1cIk01LjgsNS44TDUuOCw1LjhjLTEsMC45LTEuNSwxLjUtMS43LDEuNmwwLDBDNCw3LjUsNCw3LjcsNCw3LjljMCwwLjIsMCwwLjQsMC4yLDAuNWwwLDBsMy4yLDMuMmwwLDBjMC4yLDAuMSwwLjMsMC4yLDAuNSwwLjJzMC40LTAuMSwwLjUtMC4ybDAsMGwzLjItMy4ybDAsMGMwLjEtMC4xLDAuMi0wLjMsMC4yLTAuNWMwLTAuMi0wLjEtMC40LTAuMi0wLjVsMCwwTDguNCw0LjJDOC4zLDQuMSw4LjEsNCw3LjksNEM3LjcsNCw3LjUsNC4xLDcuNCw0LjJsMCwwTDUuOCw1Ljh6IE01LjYsNy45bDIuMy0yLjJsMi4yLDIuMkw5LDlsMCwwbDAsMGwwLDBsMCwwYy0wLjUsMC42LTAuOSwwLjktMS4xLDEuMUw1LjYsNy45elwiLz48cGF0aCBkPVwiTTksMTUuNUw5LDE1LjVMOSwxNS41elwiLz48cGF0aCBkPVwiTTkuNiwxNC43djAuMmwwLDBsMCwwbDAsMGwwLDBjMC4xLDAuMiwwLjEsMC4zLDAuMywwLjNjMC4xLDAuMSwwLjMsMC4xLDAuNCwwLjFsMCwwaDAuMWgwLjFjMC4zLTAuMSwwLjYtMC4zLDAuOS0wLjRsMCwwYzAuMS0wLjEsMC4yLTAuMiwwLjMtMC40bDAsMHYtMC4yYzAtMC4xLDAtMC4yLTAuMS0wLjNjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40SDExYy0wLjEsMC0wLjIsMC4xLTAuMywwLjFsMCwwYy0wLjIsMC4xLTAuNCwwLjItMC43LDAuM2wwLDBsMCwwYy0wLjEsMC4xLTAuMywwLjItMC40LDAuNEM5LjYsMTQuNSw5LjYsMTQuNiw5LjYsMTQuN3pcIi8+PHBhdGggZD1cIk05LDE0LjVMOSwxNC41TDksMTQuNXpcIi8+PHBhdGggZD1cIk05LjYsMTQuNEw5LjYsMTQuNEw5LjYsMTQuNHpcIi8+PHBhdGggZD1cIk0xMS43LDE0TDExLjcsMTRMMTEuNywxNHpcIi8+PHBhdGggZD1cIk0xNS42LDcuNEwxNS42LDcuNEwxNS42LDcuNHpcIi8+PHBhdGggZD1cIk0xNSw5LjRjMC4yLDAsMC40LDAsMC42LTAuMmwwLDBjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRsMCwwbDAsMGwwLDBsMCwwYzAtMC4zLDAtMC42LDAtMC45YzAtMC4yLTAuMS0wLjQtMC4yLTAuNWMtMC4xLTAuMS0wLjMtMC4yLTAuNS0wLjJzLTAuNCwwLjEtMC41LDAuMmMtMC4xLDAuMS0wLjIsMC4zLTAuMiwwLjVsMCwwYzAsMC4yLDAsMC40LDAsMC43bDAsMHYwLjFjMCwwLjEsMCwwLjMsMC4xLDAuNGwwLDBDMTQuNiw5LjMsMTQuOCw5LjQsMTUsOS40TDE1LDkuNEwxNSw5LjR6XCIvPjxwYXRoIGQ9XCJNMTQsMTJoMC4xaDAuMmgwLjFjMC4yLDAsMC41LTAuMiwwLjYtMC40bDAsMGMwLjItMC4zLDAuMy0wLjYsMC40LTAuOWwwLDB2LTAuMmMwLTAuMS0wLjEtMC4yLTAuMS0wLjNjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40aC0wLjNjLTAuMSwwLTAuMiwwLTAuMywwQzE0LjIsOS45LDE0LDEwLDE0LDEwLjNsMCwwYy0wLjEsMC4yLTAuMiwwLjUtMC4zLDAuN2wwLDBjLTAuMSwwLjEtMC4xLDAuMi0wLjEsMC4zdjAuMmwwLDBsMCwwQzEzLjYsMTEuNiwxMy44LDExLjgsMTQsMTJ6XCIvPjxwYXRoIGQ9XCJNMTQuNiw3LjRMMTQuNiw3LjRMMTQuNiw3LjR6XCIvPjxwYXRoIGQ9XCJNNC40LDE0LjJjLTAuMSwwLjEtMC4xLDAuMi0wLjEsMC4zbDAuMSwwLjJjMCwwLjIsMC4yLDAuMywwLjMsMC40bDAsMGMwLjMsMC4xLDAuNiwwLjMsMS4xLDAuNGwwLDBoMC4xbDAsMGMwLjEsMCwwLjItMC4xLDAuNC0wLjJjMC4xLDAsMC4yLTAuMiwwLjMtMC4zbDAsMHYtMC4yYzAtMC4xLTAuMS0wLjMtMC4yLTAuNGMtMC4xLTAuMS0wLjItMC4yLTAuNC0wLjNsMCwwYy0wLjItMC4xLTAuNS0wLjItMC43LTAuM2wwLDBjLTAuMSwwLTAuMiwwLTAuMywwSDQuN2wwLDBDNC42LDEzLjksNC40LDE0LDQuNCwxNC4yTDQuNCwxNC4yelwiLz48cGF0aCBkPVwiTTExLjksMTMuM2MwLDAuMiwwLjEsMC40LDAuMiwwLjZjMC4xLDAuMSwwLjMsMC4yLDAuNSwwLjJzMC40LTAuMSwwLjUtMC4ybDAsMGwwLDBsMCwwbDAsMGMwLjEtMC4xLDAuMy0wLjMsMC40LTAuNGwwLDBsMC4yLTAuM2wwLDBjMC4xLTAuMiwwLjItMC4zLDAuMi0wLjVsMCwwYzAtMC4yLTAuMS0wLjQtMC4yLTAuNWwwLDBjLTAuMS0wLjEtMC4zLTAuMi0wLjUtMC4ybDAsMGMtMC4yLDAtMC40LDAuMS0wLjUsMC4ybDAsMGwtMC4yLDAuMmwtMC40LDAuNGwwLDBDMTIsMTMsMTEuOSwxMy4xLDExLjksMTMuM0wxMS45LDEzLjN6XCIvPjxwYXRoIGQ9XCJNMTIuMSwxMy44TDEyLjEsMTMuOEwxMi4xLDEzLjh6XCIvPjxwYXRoIGQ9XCJNMTEuOSwxMy4zTDExLjksMTMuM0wxMS45LDEzLjN6XCIvPjxwYXRoIGQ9XCJNMTUuOSw1LjJjMC0wLjEtMC4xLTAuMi0wLjEtMC4zbDAsMEwxNCwwLjRsMCwwQzEzLjksMC4yLDEzLjcsMCwxMy41LDBsMCwwbDAsMGgtMC4yYy0wLjIsMC0wLjQsMC4xLTAuNSwwLjJsMCwwbC0wLjksMC45Yy0wLjUtMC4zLTEuMS0wLjYtMS44LTAuOGwwLDBDOS40LDAuMSw4LjcsMCw3LjksMGMtMSwwLTIsMC4yLTMsMC42UzMsMS42LDIuMywyLjNDMS42LDMuMSwxLDMuOSwwLjYsNC45bDAsMEMwLjIsNS44LDAsNi44LDAsNy45YzAsMSwwLjIsMiwwLjYsM3MwLjksMS44LDEuNywyLjZsMCwwbDAsMGwwLDBsMCwwYzAuMiwwLjIsMC41LDAuNCwwLjcsMC42bDAsMGwwLDBsMCwwbDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuMmwwLDBjMC4yLDAsMC40LTAuMSwwLjYtMC4zbDAsMGMwLjEtMC4xLDAuMS0wLjMsMC4xLTAuNHYtMC4xbDAsMEM0LjEsMTMuMyw0LDEzLjEsMy45LDEzbDAsMGMtMC4yLTAuMS0wLjQtMC4zLTAuNi0wLjVjLTAuNi0wLjYtMS4xLTEuMy0xLjQtMi4xbDAsMEMxLjYsOS42LDEuNCw4LjgsMS40LDcuOXMwLjItMS43LDAuNS0yLjVsMCwwYzAuMy0wLjgsMC44LTEuNSwxLjQtMi4xYzAuNi0wLjYsMS4zLTEuMSwyLjEtMS40bDAsMEM2LjIsMS42LDcsMS40LDcuOSwxLjRjMC42LDAsMS4xLDAuMSwxLjcsMC4yYzAuNSwwLjEsMC45LDAuMywxLjMsMC41bC0wLjgsMC44bDAsMEMxMCwzLjEsOS45LDMuMiw5LjksMy40djAuMmwwLDBsMCwwYzAsMC4yLDAuMiwwLjQsMC40LDAuNWwwLDBsNC41LDEuOGwwLDBIMTVoMC4xYzAuMiwwLDAuNC0wLjEsMC41LTAuMmwwLDBDMTUuNyw1LjYsMTUuOCw1LjQsMTUuOSw1LjJ6IE0xMS44LDMuMkwxMywybDAuNCwxLjFsMCwwYzAuMiwwLjQsMC4zLDAuNywwLjQsMC45TDExLjgsMy4yelwiLz48L2c+PC9zdmc+JyxcbiAgIG1pcnJvcl9ob3Jpem9udGFsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNC43NSAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTMuNzUsMy43Nmw1LjksMTUuNzRoLTUuOVYzLjc2Wk00LjksMTkuNSwxMC44LDMuNzZWMTkuNUg0LjlaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjkgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbWlycm9yX3ZlcnRpY2FsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNC43NVwiPjxnPjxwYXRoIGQ9XCJNMjAuMTUsMTMuMSw0LjQxLDE5VjEzLjFIMjAuMTVaTTQuNDEsNC4yNWwxNS43NCw1LjlINC40MVY0LjI1WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4yNSlcIi8+PC9nPjwvc3ZnPicsXG4gICBjaGVja2VkOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NSAxMi4xXCI+PGc+PHBhdGggZD1cIk00LjU5LDEyLjIzbC4xMi4xOEw5LjQzLDE3LjVhLjU4LjU4LDAsMCwwLC44NCwwTDIwLDcuNDVoMGEuNTguNTgsMCwwLDAsMC0uODRsLS44NS0uODVhLjU4LjU4LDAsMCwwLS44NCwwSDE4LjJsLTguMTIsOC40MWEuMjkuMjksMCwwLDEtLjQyLDBsLTMuNC0zLjYzYS41OC41OCwwLDAsMC0uODQsMGwtLjg1Ljg1YS42LjYsMCwwLDAtLjE0LjIxLjUxLjUxLDAsMCwwLDAsLjQ0Yy4wNS4wNi4xLjEzLjE2LjE5WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC4zOCAtNS41OClcIi8+PC9nPjwvc3ZnPicsXG4gICBsaW5lX2JyZWFrOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTksNmExLDEsMCwwLDAtMSwxdjRhMSwxLDAsMCwxLTEsMUg3LjQxbDEuMy0xLjI5QTEsMSwwLDAsMCw3LjI5LDkuMjlsLTMsM2ExLDEsMCwwLDAtLjIxLjMzLDEsMSwwLDAsMCwwLC43NiwxLDEsMCwwLDAsLjIxLjMzbDMsM2ExLDEsMCwwLDAsMS40MiwwLDEsMSwwLDAsMCwwLTEuNDJMNy40MSwxNEgxN2EzLDMsMCwwLDAsMy0zVjdBMSwxLDAsMCwwLDE5LDZaXCIvPjwvc3ZnPicsXG4gICBhdWRpbzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE0LDMuMjNWNS4yOUMxNi44OSw2LjE1IDE5LDguODMgMTksMTJDMTksMTUuMTcgMTYuODksMTcuODQgMTQsMTguN1YyMC43N0MxOCwxOS44NiAyMSwxNi4yOCAyMSwxMkMyMSw3LjcyIDE4LDQuMTQgMTQsMy4yM00xNi41LDEyQzE2LjUsMTAuMjMgMTUuNSw4LjcxIDE0LDcuOTdWMTZDMTUuNSwxNS4yOSAxNi41LDEzLjc2IDE2LjUsMTJNMyw5VjE1SDdMMTIsMjBWNEw3LDlIM1pcIiAvPjwvc3ZnPicsXG4gICBpbWFnZV9nYWxsZXJ5OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjMwIDMwIDE1MCAxNTBcIj48Zz48cGF0aCBkPVwiTTE1Mi43NzUsMTIwLjU0OFY1MS42NTFjMC0xMi4yNzEtOS45ODQtMjIuMjU0LTIyLjI1NC0yMi4yNTRINDMuNzI3Yy0xMi4yNzEsMC0yMi4yNTQsOS45ODMtMjIuMjU0LDIyLjI1NHY2OC44OTZjMCwxMi4yNyw5Ljk4MywyMi4yNTQsMjIuMjU0LDIyLjI1NGg4Ni43OTVDMTQyLjc5MSwxNDIuODAyLDE1Mi43NzUsMTMyLjgxNywxNTIuNzc1LDEyMC41NDh6IE0zNi4zOTQsNTEuNjUxYzAtNC4wNDIsMy4yOTEtNy4zMzMsNy4zMzMtNy4zMzNoODYuNzk1YzQuMDQyLDAsNy4zMzIsMy4yOTEsNy4zMzIsNy4zMzN2MjMuOTE3bC0xNC45MzgtMTcuNzY3Yy0xLjQxLTEuNjc4LTMuNDg3LTIuNjQ5LTUuNjgtMi42NThoLTAuMDI5Yy0yLjE4NCwwLTQuMjU1LDAuOTU0LTUuNjc0LDIuNjEzTDc2LjcwOSw5OC41MTlsLTkuMDk2LTkuMzk4Yy0xLjQyNy0xLjQ3NC0zLjM5Mi0yLjI5MS01LjQ0OC0yLjI3M2MtMi4wNTIsMC4wMjUtNC4wMDQsMC44OTMtNS4zOTYsMi40TDM2LjM5NCwxMTEuMzJWNTEuNjUxeiBNNDEuNjg0LDEyNy41ODVsMjAuNjk3LTIyLjQxNmw5LjMxMiw5LjYyMmMxLjQ2MSwxLjUxMSwzLjQ4OSwyLjMzNCw1LjU5MiwyLjI3YzIuMTAxLTAuMDY2LDQuMDc1LTEuMDEzLDUuNDQtMi42MTJsMzQuNDM2LTQwLjMwOGwyMC42OTMsMjQuNjEzdjIxLjc5NGMwLDQuMDQyLTMuMjksNy4zMzItNy4zMzIsNy4zMzJINDMuNzI3QzQzLjAxOCwxMjcuODgsNDIuMzM0LDEyNy43NzUsNDEuNjg0LDEyNy41ODV6IE0xODIuNjE2LDE1Mi41Vjc1LjY1N2MwLTQuMTItMy4zNC03LjQ2LTcuNDYxLTcuNDZjLTQuMTE5LDAtNy40NiwzLjM0LTcuNDYsNy40NlYxNTIuNWMwLDQuMTEyLTMuMzQ3LDcuNDYtNy40NjEsNy40NmgtOTRjLTQuMTE5LDAtNy40NiwzLjMzOS03LjQ2LDcuNDU5YzAsNC4xMjMsMy4zNDEsNy40NjIsNy40Niw3LjQ2Mmg5NEMxNzIuNTc2LDE3NC44ODEsMTgyLjYxNiwxNjQuODQxLDE4Mi42MTYsMTUyLjV6XCIvPjwvZz48L3N2Zz4nLFxuICAgYm9va21hcms6ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE3LDNIN0EyLDIgMCAwLDAgNSw1VjIxTDEyLDE4TDE5LDIxVjVDMTksMy44OSAxOC4xLDMgMTcsM1pcIiAvPjwvc3ZnPicsXG4gICAvLyBNb3JlIGljb25zXG4gICBtb3JlX3RleHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMTAgMTAgMTgwIDE4MFwiPjxnPjxwYXRoIGQ9XCJNNDkuNzExLDE0Mi4xODhoNDkuMDI3YzIuMzI4LDAuMDAyLDQuMzk0LDEuNDkyLDUuMTI5LDMuNjk5bDkuNzQyLDI5LjI1MmMwLjM2MywxLjA5MiwxLjM4NSwxLjgyOCwyLjUzNywxLjgzbDE1Ljg4MywwLjAxYzAuODU5LDAsMS42NjctMC40MTIsMi4xNy0xLjEwOXMwLjY0MS0xLjU5NCwwLjM3LTIuNDFsLTE2LjYyNS01MC4wNDVMODYuNTAzLDI4Ljk1M2MtMC4zNi0xLjA5Ny0xLjM4My0xLjgzOS0yLjUzNy0xLjg0Mkg2NC41MzJjLTEuMTUzLTAuMDAxLTIuMTc4LDAuNzM2LTIuNTQyLDEuODMxTDEzLjg0NywxNzMuNDU3Yy0wLjI3MSwwLjgxNi0wLjEzNSwxLjcxMywwLjM2OSwyLjQxMmMwLjUwMywwLjY5NywxLjMxMSwxLjEwOSwyLjE3MSwxLjEwOWgxNS44NzJjMS4xNTEsMCwyLjE3My0wLjczNiwyLjUzNy0xLjgyOGw5Ljc5My0yOS4yODdDNDUuMzI1LDE0My42Niw0Ny4zOSwxNDIuMTgsNDkuNzExLDE0Mi4xODhMNDkuNzExLDE0Mi4xODh6IE01My40OTMsMTE5LjA5OGwxNS42MDctNDYuOWMwLjc0NC0yLjE5NiwyLjgwNi0zLjY3NCw1LjEyNS0zLjY3NHM0LjM4MSwxLjQ3OCw1LjEyNSwzLjY3NGwxNS42MDcsNDYuOTA0YzAuNTM3LDEuNjIxLDAuMjYzLDMuNDAyLTAuNzM2LDQuNzg5Yy0xLjAxOCwxLjQwOC0yLjY0OSwyLjI0LTQuMzg2LDIuMjRINTguNjE1Yy0xLjczNiwwLTMuMzY4LTAuODMyLTQuMzg2LTIuMjRDNTMuMjMsMTIyLjUwNCw1Mi45NTYsMTIwLjcyMSw1My40OTMsMTE5LjA5OEw1My40OTMsMTE5LjA5OHogTTE5MC40NjUsNjMuMzJjMC0yLjkxOS0xLjAxNS01LjM5Ni0zLjA1OS03LjQyOGMtMi4wMjktMi4wMzEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMTYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDMyLTMuMDU2LDQuNDk4LTMuMDU2LDcuMzg2YzAsMi44ODksMS4wMjYsNS4zNTQsMy4wNTYsNy4zODVjMi4wMzIsMi4wMzIsNC40OTksMy4wNTksNy4zODgsMy4wNTljMi44ODcsMCw1LjM1NC0xLjAyNiw3LjM4My0zLjA1OUMxODkuNDUsNjguNjMzLDE5MC40NjUsNjYuMTc4LDE5MC40NjUsNjMuMzJMMTkwLjQ2NSw2My4zMnogTTE5MC40NjUsMTAxLjk5NGMwLTIuODU4LTEuMDE1LTUuMzEzLTMuMDU5LTcuMzMzYy0yLjAyOS0yLjA0Mi00LjQ5Ni0zLjA0Ny03LjM4My0zLjA0N2MtMi44ODksMC01LjM1NSwxLjAwNS03LjM4OCwzLjA0N2MtMi4wMjksMi4wMjEtMy4wNTYsNC40ODYtMy4wNTYsNy4zNzZjMCwyLjg4NywxLjAyNiw1LjM1MiwzLjA1Niw3LjM5NWMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxMDcuMzg5LDE5MC40NjUsMTA0LjkxNCwxOTAuNDY1LDEwMS45OTRMMTkwLjQ2NSwxMDEuOTk0eiBNMTkwLjQ2NSwxNDAuNzZjMC0yLjkxOC0xLjAxNS01LjM5NS0zLjA1OS03LjQzOGMtMi4wMjktMi4wNDEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMDYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDQzLTMuMDU2LDQuNTItMy4wNTYsNy40MzhjMCwyLjkyMiwxLjAyNiw1LjM5OCwzLjA1Niw3LjQzOWMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxNDYuMTU4LDE5MC40NjUsMTQzLjY4MiwxOTAuNDY1LDE0MC43NkwxOTAuNDY1LDE0MC43NnpcIi8+PC9nPjwvc3ZnPicsXG4gICBtb3JlX3BhcmFncmFwaDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIxMCAxMCAxODAgMTgwXCI+PGc+PHBhdGggZD1cIk0xMjguMzksMjguNDk5SDYzLjQ5M2MtMjUuNTU4LDAtNDYuMzU0LDIwLjc5Ni00Ni4zNTQsNDYuMzU0YzAsMjUuNTU5LDIwLjc5Niw0Ni4zNTMsNDYuMzU0LDQ2LjM1M2g5LjI3MXY1NS42MjVoMTguNTQyVjQ3LjA0aDkuMjcxVjE3Ni44M2gxOC41NDNWNDcuMDRoOS4yNzFWMjguNDk5eiBNNzIuNzY0LDEwMi42NjRoLTkuMjcxYy0xNS4zMzcsMC0yNy44MTMtMTIuNDc1LTI3LjgxMy0yNy44MTJjMC0xNS4zMzYsMTIuNDc2LTI3LjgxMywyNy44MTMtMjcuODEzaDkuMjcxVjEwMi42NjR6IE0xOTAuNDY1LDYzLjMyYzAtMi45MTktMS4wMTUtNS4zOTYtMy4wNTktNy40MjhjLTIuMDI5LTIuMDMxLTQuNDk2LTMuMDQ3LTcuMzgzLTMuMDQ3Yy0yLjg4OSwwLTUuMzU1LDEuMDE2LTcuMzg4LDMuMDQ3Yy0yLjAyOSwyLjAzMi0zLjA1Niw0LjQ5OC0zLjA1Niw3LjM4NmMwLDIuODg5LDEuMDI2LDUuMzU0LDMuMDU2LDcuMzg1YzIuMDMyLDIuMDMyLDQuNDk5LDMuMDU5LDcuMzg4LDMuMDU5YzIuODg3LDAsNS4zNTQtMS4wMjYsNy4zODMtMy4wNTlDMTg5LjQ1LDY4LjYzMywxOTAuNDY1LDY2LjE3OCwxOTAuNDY1LDYzLjMyTDE5MC40NjUsNjMuMzJ6IE0xOTAuNDY1LDEwMS45OTRjMC0yLjg1OC0xLjAxNS01LjMxMy0zLjA1OS03LjMzM2MtMi4wMjktMi4wNDItNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMDUtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDIxLTMuMDU2LDQuNDg2LTMuMDU2LDcuMzc2YzAsMi44ODcsMS4wMjYsNS4zNTIsMy4wNTYsNy4zOTVjMi4wMzIsMi4wMjEsNC40OTksMy4wNDcsNy4zODgsMy4wNDdjMi44ODcsMCw1LjM1NC0xLjAyNSw3LjM4My0zLjA0N0MxODkuNDUsMTA3LjM4OSwxOTAuNDY1LDEwNC45MTQsMTkwLjQ2NSwxMDEuOTk0TDE5MC40NjUsMTAxLjk5NHogTTE5MC40NjUsMTQwLjc2YzAtMi45MTgtMS4wMTUtNS4zOTUtMy4wNTktNy40MzhjLTIuMDI5LTIuMDQxLTQuNDk2LTMuMDQ3LTcuMzgzLTMuMDQ3Yy0yLjg4OSwwLTUuMzU1LDEuMDA2LTcuMzg4LDMuMDQ3Yy0yLjAyOSwyLjA0My0zLjA1Niw0LjUyLTMuMDU2LDcuNDM4YzAsMi45MjIsMS4wMjYsNS4zOTgsMy4wNTYsNy40MzljMi4wMzIsMi4wMjEsNC40OTksMy4wNDcsNy4zODgsMy4wNDdjMi44ODcsMCw1LjM1NC0xLjAyNSw3LjM4My0zLjA0N0MxODkuNDUsMTQ2LjE1OCwxOTAuNDY1LDE0My42ODIsMTkwLjQ2NSwxNDAuNzZMMTkwLjQ2NSwxNDAuNzZ6XCIvPjwvZz48L3N2Zz4nLFxuICAgbW9yZV9wbHVzOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjM1IDMwIDE0MCAxNDBcIj48Zz48cGF0aCBkPVwiTTEzNy4yMTUsMTAyLjA0NWMwLDMuNDk4LTIuODM1LDYuMzMyLTYuMzMzLDYuMzMySDI0LjU0OWMtMy40OTgsMC02LjMzNC0yLjgzNC02LjMzNC02LjMzMmwwLDBjMC0zLjQ5OCwyLjgzNi02LjMzMyw2LjMzNC02LjMzM2gxMDYuMzMzQzEzNC4zOCw5NS43MTEsMTM3LjIxNSw5OC41NDcsMTM3LjIxNSwxMDIuMDQ1TDEzNy4yMTUsMTAyLjA0NXogTTc3LjcxNSwxNjEuNTQ1Yy0zLjQ5OCwwLTYuMzMzLTIuODM2LTYuMzMzLTYuMzM0VjQ4Ljg3OGMwLTMuNDk4LDIuODM2LTYuMzMzLDYuMzMzLTYuMzMzbDAsMGMzLjQ5OCwwLDYuMzM0LDIuODM1LDYuMzM0LDYuMzMzdjEwNi4zMzNDODQuMDQ5LDE1OC43MDksODEuMjEzLDE2MS41NDUsNzcuNzE1LDE2MS41NDVMNzcuNzE1LDE2MS41NDV6IE0xOTAuNDY1LDYzLjMyYzAtMi45MTktMS4wMTUtNS4zOTYtMy4wNTktNy40MjhjLTIuMDI5LTIuMDMxLTQuNDk2LTMuMDQ3LTcuMzgzLTMuMDQ3Yy0yLjg4OSwwLTUuMzU1LDEuMDE2LTcuMzg4LDMuMDQ3Yy0yLjAyOSwyLjAzMi0zLjA1Niw0LjQ5OC0zLjA1Niw3LjM4NmMwLDIuODg5LDEuMDI2LDUuMzU0LDMuMDU2LDcuMzg1YzIuMDMyLDIuMDMyLDQuNDk5LDMuMDU5LDcuMzg4LDMuMDU5YzIuODg3LDAsNS4zNTQtMS4wMjYsNy4zODMtMy4wNTlDMTg5LjQ1LDY4LjYzMiwxOTAuNDY1LDY2LjE3NywxOTAuNDY1LDYzLjMyTDE5MC40NjUsNjMuMzJ6IE0xOTAuNDY1LDEwMS45OTNjMC0yLjg1OC0xLjAxNS01LjMxMy0zLjA1OS03LjMzM2MtMi4wMjktMi4wNDItNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMDUtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDIxLTMuMDU2LDQuNDg2LTMuMDU2LDcuMzc2YzAsMi44ODgsMS4wMjYsNS4zNTMsMy4wNTYsNy4zOTZjMi4wMzIsMi4wMjEsNC40OTksMy4wNDcsNy4zODgsMy4wNDdjMi44ODcsMCw1LjM1NC0xLjAyNSw3LjM4My0zLjA0N0MxODkuNDUsMTA3LjM4OSwxOTAuNDY1LDEwNC45MTQsMTkwLjQ2NSwxMDEuOTkzTDE5MC40NjUsMTAxLjk5M3ogTTE5MC40NjUsMTQwLjc2YzAtMi45MTgtMS4wMTUtNS4zOTUtMy4wNTktNy40MzhjLTIuMDI5LTIuMDQxLTQuNDk2LTMuMDQ3LTcuMzgzLTMuMDQ3Yy0yLjg4OSwwLTUuMzU1LDEuMDA2LTcuMzg4LDMuMDQ3Yy0yLjAyOSwyLjA0My0zLjA1Niw0LjUyLTMuMDU2LDcuNDM4YzAsMi45MjIsMS4wMjYsNS4zOTgsMy4wNTYsNy40MzljMi4wMzIsMi4wMjEsNC40OTksMy4wNDcsNy4zODgsMy4wNDdjMi44ODcsMCw1LjM1NC0xLjAyNSw3LjM4My0zLjA0N0MxODkuNDUsMTQ2LjE1OCwxOTAuNDY1LDE0My42ODIsMTkwLjQ2NSwxNDAuNzZMMTkwLjQ2NSwxNDAuNzZ6XCIvPjwvZz48L3N2Zz4nLFxuICAgbW9yZV9ob3Jpem9udGFsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NiAzLjU4XCI+PGc+PHBhdGggZD1cIk00LjY0LDEwLjczYTEuODQsMS44NCwwLDAsMSwuNjUtLjY1LDEuNzYsMS43NiwwLDAsMSwxLjc5LDBBMS43OSwxLjc5LDAsMCwxLDgsMTEuNjNhMS44NCwxLjg0LDAsMCwxLS4yNS45LDEuNjksMS42OSwwLDAsMS0uNjUuNjUsMS44LDEuOCwwLDAsMS0yLjY5LTEuNTVBMi4wOCwyLjA4LDAsMCwxLDQuNjQsMTAuNzNabTYuMDksMGExLjg0LDEuODQsMCwwLDEsLjY1LS42NSwxLjc4LDEuNzgsMCwwLDEsMi42NywxLjU1LDEuNzMsMS43MywwLDAsMS0uMjQuOSwxLjg0LDEuODQsMCwwLDEtLjY1LjY1LDEuNzYsMS43NiwwLDAsMS0xLjc5LDAsMS43OSwxLjc5LDAsMCwxLS42NC0yLjQ0Wm02LjA4LDBhMS42OSwxLjY5LDAsMCwxLC42NS0uNjUsMS43NiwxLjc2LDAsMCwxLDEuNzksMCwxLjc5LDEuNzksMCwwLDEsLjksMS41NCwxLjczLDEuNzMsMCwwLDEtLjI0LjksMS44NCwxLjg0LDAsMCwxLS42NS42NSwxLjgsMS44LDAsMCwxLTIuNjktMS41NUEyLDIsMCwwLDEsMTYuODEsMTAuNzNaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjM5IC05Ljg0KVwiLz48L2c+PC9zdmc+JyxcbiAgIG1vcmVfdmVydGljYWw6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDMuOTQgMTUuNzVcIj48Zz48cGF0aCBkPVwiTTEyLjI4LDcuNjlhMS45MiwxLjkyLDAsMCwxLTEuMzktLjU4LDIsMiwwLDAsMS0uNTgtMS4zOSwxLjkyLDEuOTIsMCwwLDEsLjU4LTEuMzksMiwyLDAsMCwxLDEuMzktLjU4LDEuOTIsMS45MiwwLDAsMSwxLjM5LjU4LDIsMiwwLDAsMSwuNTgsMS4zOSwxLjkyLDEuOTIsMCwwLDEtLjU4LDEuMzksMiwyLDAsMCwxLTEuMzkuNThabTAsMmExLjkyLDEuOTIsMCwwLDEsMS4zOS41OCwyLDIsMCwwLDEsLjU4LDEuMzlBMS45MiwxLjkyLDAsMCwxLDEzLjY3LDEzYTIsMiwwLDAsMS0xLjM5LjU4QTEuOTIsMS45MiwwLDAsMSwxMC44OSwxM2EyLDIsMCwwLDEtLjU4LTEuMzksMiwyLDAsMCwxLDItMlptMCw1LjlhMS45MiwxLjkyLDAsMCwxLDEuMzkuNTgsMiwyLDAsMCwxLC41OCwxLjM5LDEuOTIsMS45MiwwLDAsMS0uNTgsMS4zOSwyLDIsMCwwLDEtMS4zOS41OCwxLjkyLDEuOTIsMCwwLDEtMS4zOS0uNTgsMiwyLDAsMCwxLS41OC0xLjM5LDEuOTIsMS45MiwwLDAsMSwuNTgtMS4zOSwxLjk0LDEuOTQsMCwwLDEsMS4zOS0uNThaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMC4zMSAtMy43NSlcIi8+PC9nPjwvc3ZnPicsXG4gICAvLyBOb3QgY3VycmVudGx5IHVzZWRcbiAgIGF0dGFjaG1lbnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDguMzggMTUuNjhcIj48Zz48cGF0aCBkPVwiTTE1LjIzLDZoMXY5Ljc4YTMuODgsMy44OCwwLDAsMS0xLjMxLDIuNDUsNCw0LDAsMCwxLTYuNTctMi40NVY3QTMsMywwLDAsMSw5LjIsNC44OWEzLDMsMCwwLDEsNSwyLjA5djguMzFhMS45MiwxLjkyLDAsMCwxLS41OCwxLjM5LDIsMiwwLDAsMS0xLjM5LjU4LDEuOTIsMS45MiwwLDAsMS0xLjM5LS41OCwyLDIsMCwwLDEtLjU4LTEuMzlWOGgxdjcuMzJhMSwxLDAsMCwwLC4yOS42OSwxLDEsMCwwLDAsLjY5LjI4QS45LjksMCwwLDAsMTMsMTZhMSwxLDAsMCwwLC4yOS0uNjlWN2ExLjkyLDEuOTIsMCwwLDAtLjU4LTEuMzlBMiwyLDAsMCwwLDExLjI3LDVhMS45MiwxLjkyLDAsMCwwLTEuMzkuNThBMiwyLDAsMCwwLDkuMzMsN3Y4LjMxYTMsMywwLDEsMCw1LjksMFY2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtOC4wOCAtMy43OClcIi8+PC9nPjwvc3ZnPicsXG4gICBtYXA6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDExLjcgMTUuNjJcIj48Zz48cGF0aCBkPVwiTTEyLjA1LDEyLjQyYTIuOTMsMi45MywwLDEsMSwyLjA3LTVBMi44OCwyLjg4LDAsMCwxLDE1LDkuNDlhMywzLDAsMCwxLS44NiwyLjA3LDIuODksMi44OSwwLDAsMS0yLjA3Ljg2Wm0wLTUuMzZhMi40MywyLjQzLDAsMCwwLTEuNzIsNC4xNiwyLjQ4LDIuNDgsMCwwLDAsMS43Mi43MiwyLjQ0LDIuNDQsMCwwLDAsMC00Ljg4Wm0wLTMuM0E1Ljg0LDUuODQsMCwwLDEsMTcuOSw5LjYyYTkuOTQsOS45NCwwLDAsMS0xLjczLDVBMzMuNTksMzMuNTksMCwwLDEsMTIuODQsMTlhMS41MiwxLjUyLDAsMCwxLS4yMy4yLDEsMSwwLDAsMS0uNTUuMmgwYTEsMSwwLDAsMS0uNTUtLjIsMS41MiwxLjUyLDAsMCwxLS4yMy0uMiwzMy41OSwzMy41OSwwLDAsMS0zLjMzLTQuMzIsOS45Myw5LjkzLDAsMCwxLTEuNzItNSw1Ljg0LDUuODQsMCwwLDEsNS44NS01Ljg2Wk0xMiwxOC4zNGwuMDguMDUuMDYtLjA2YTM1LjU4LDM1LjU4LDAsMCwwLDMuMDYtMy45Myw5LjM1LDkuMzUsMCwwLDAsMS43NC00Ljc3LDQuODgsNC44OCwwLDAsMC00Ljg4LTQuODhBNC43OSw0Ljc5LDAsMCwwLDguNiw2LjE3LDQuODQsNC44NCwwLDAsMCw3LjE3LDkuNjIsOS4yOSw5LjI5LDAsMCwwLDguOTEsMTQuNCwzNiwzNiwwLDAsMCwxMiwxOC4zNFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTYuMiAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBtYWdpY19zdGljazogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzMgMTUuNzVcIj48Zz48cGF0aCBkPVwiTTE5Ljg2LDE5LjIxYTEsMSwwLDAsMCwuMjgtLjY4LDEsMSwwLDAsMC0uMjgtLjdMMTMsMTAuOTNhMSwxLDAsMCwwLS43LS4yOCwxLDEsMCwwLDAtLjY4LDEuNjVsNi45LDYuOWExLDEsMCwwLDAsLjY5LjI5LjkzLjkzLDAsMCwwLC42OS0uMjhaTTkuMTksOC41NWEzLDMsMCwwLDAsMS42OCwwLDE0LjEyLDE0LjEyLDAsMCwwLDEuNDEtLjMyQTExLjI2LDExLjI2LDAsMCwwLDEwLjgsNy4wNmMtLjU2LS4zNi0uODYtLjU2LS45MS0uNThTMTAsNS45MSwxMCw1LjExczAtMS4yNi0uMTUtMS4zN2E0LjM1LDQuMzUsMCwwLDAtMS4xOS43MWMtLjUzLjQtLjgxLjYyLS44Ny42OGE5LDksMCwwLDAtMi0uNiw2Ljg0LDYuODQsMCwwLDAtLjc2LS4wOXMwLC4yNy4wOC43N2E4LjYsOC42LDAsMCwwLC42MSwycS0uMDkuMDktLjY5Ljg3YTMuNTksMy41OSwwLDAsMC0uNjgsMS4xN2MuMTIuMTcuNTcuMjMsMS4zNi4xNVM3LDkuMjYsNy4xNSw5LjIzcy4yMS4zNi41Ny45MWExMC40OSwxMC40OSwwLDAsMCwxLjE0LDEuNDhjMC0uMS4xNC0uNTcuMzEtMS40YTMsMywwLDAsMCwwLTEuNjdaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc0KVwiLz48L2c+PC9zdmc+JyxcbiAgIGVtcHR5X2ZpbGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEyLjc4IDE1Ljc1XCI+PGc+PHBhdGggZD1cIk0xNC43MywzLjc2LDE4LjY3LDcuN3Y5Ljg0YTIsMiwwLDAsMS0yLDJINy44NGExLjg5LDEuODksMCwwLDEtMS4zOC0uNTgsMiwyLDAsMCwxLS41Ny0xLjM5VjUuNzNhMS45MywxLjkzLDAsMCwxLC41Ny0xLjM4LDIsMiwwLDAsMSwxLjM4LS41OGg2LjYybC4yNiwwdjBabTIuOTUsNC45MmgtMmExLjkzLDEuOTMsMCwwLDEtMS4zOC0uNTcsMiwyLDAsMCwxLS41OC0xLjRWNi4xN2MwLS4zNiwwLS44NCwwLTEuNDNINy44NWExLDEsMCwwLDAtLjcuMjksMSwxLDAsMCwwLS4yOS43VjE3LjU0YTEsMSwwLDAsMCwuMjkuNjksMSwxLDAsMCwwLC42OS4yOWg4Ljg1YTEsMSwwLDAsMCwuNzEtLjI5LjkyLjkyLDAsMCwwLC4yOC0uNjlabTAtMUwxNC43Myw0Ljc0djJBMSwxLDAsMCwwLDE1LDcuNGExLDEsMCwwLDAsLjY5LjI5WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNS44OSAtMy43NilcIi8+PC9nPjwvc3ZnPidcbn07XG4iLCIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiB1dGlsaXR5IGZ1bmN0aW9uXHJcbiAqL1xyXG5jb25zdCB1dGlsID0ge1xyXG4gICAgX2Q6IG51bGwsXHJcbiAgICBfdzogbnVsbCxcclxuICAgIGlzSUU6IG51bGwsXHJcbiAgICBpc0lFX0VkZ2U6IG51bGwsXHJcbiAgICBpc09TWF9JT1M6IG51bGwsXHJcbiAgICBfcHJvcGVydGllc0luaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX2QgPSAgZG9jdW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fdyA9IHdpbmRvdztcclxuICAgICAgICB0aGlzLmlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSA+IC0xO1xyXG4gICAgICAgIHRoaXMuaXNJRV9FZGdlID0gKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID4gLTEpIHx8IChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdFZGdlJykgPiAtMSk7XHJcbiAgICAgICAgdGhpcy5pc09TWF9JT1MgPSAvKE1hY3xpUGhvbmV8aVBvZHxpUGFkKS8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBIVE1MIFJlc2VydmVkIFdvcmQgQ29udmVydGVyLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIFxyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSFRNTCBzdHJpbmdcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9IVE1MQ29udmVydG9yOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICBjb25zdCBlYyA9IHsnJic6ICcmYW1wOycsICdcXHUwMEEwJzogJyZuYnNwOycsICdcXCcnOiAnJmFwb3M7JywgJ1wiJzogJyZxdW90OycsICc8JzrCoCcmbHQ7JyzCoCc+JzrCoCcmZ3Q7J307XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoLyZ8XFx1MDBBMHwnfFwifDx8Pi9nLCBmdW5jdGlvbiAobSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBlY1ttXSA9PT0gJ3N0cmluZycpID8gZWNbbV0gOiBtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBVbmljb2RlIENoYXJhY3RlciAnWkVSTyBXSURUSCBTUEFDRScgKFxcdTIwMEIpXHJcbiAgICAgKi9cclxuICAgIHplcm9XaWR0aFNwYWNlOiBTdHJpbmcuZnJvbUNoYXJDb2RlKDgyMDMpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBmaW5kICd6ZXJvIHdpZHRoIHNwYWNlJyAoL1xcdTIwMEIvZylcclxuICAgICAqL1xyXG4gICAgemVyb1dpZHRoUmVnRXhwOiBuZXcgUmVnRXhwKFN0cmluZy5mcm9tQ2hhckNvZGUoODIwMyksICdnJyksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgb25seSAnemVybyB3aWR0aCBzcGFjZScgKC9eXFx1MjAwQiskLylcclxuICAgICAqL1xyXG4gICAgb25seVplcm9XaWR0aFJlZ0V4cDogbmV3IFJlZ0V4cCgnXicgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDgyMDMpICsgJyskJyksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQSBtZXRob2QgdGhhdCBjaGVja3MgSWYgdGhlIHRleHQgaXMgYmxhbmsgb3IgdG8gc2VlIGlmIGl0IGNvbnRhaW5zICdaRVJPIFdJRFRIIFNQQUNFJyBvciBlbXB0eSAodXRpbC56ZXJvV2lkdGhTcGFjZSlcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE5vZGV9IHRleHQgU3RyaW5nIHZhbHVlIG9yIE5vZGVcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBvbmx5WmVyb1dpZHRoU3BhY2U6IGZ1bmN0aW9uICh0ZXh0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykgdGV4dCA9IHRleHQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRleHQgPT09ICcnIHx8IHRoaXMub25seVplcm9XaWR0aFJlZ0V4cC50ZXN0KHRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIFhNTEh0dHBSZXF1ZXN0IG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1hNTEh0dHBSZXF1ZXN0fEFjdGl2ZVhPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIGdldFhNTEh0dHBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqIElFICovXHJcbiAgICAgICAgaWYgKHRoaXMuX3cuQWN0aXZlWE9iamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqIG5ldHNjYXBlICovXHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdy5YTUxIdHRwUmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKiBmYWlsICovXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIEVsZW1lbnQgbm9kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVsZW1lbnROYW1lIEVsZW1lbnQgbmFtZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50TmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGV4dCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCB0ZXh0IGNvbnRlbnRzXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVGV4dE5vZGU6IGZ1bmN0aW9uICh0ZXh0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QuY3JlYXRlVGV4dE5vZGUodGV4dCB8fCAnJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSBlZGl0b3IgY2hlY2tzIHRhZ3MgYnkgc3RyaW5nLlxyXG4gICAgICogSWYgdGhlcmUgaXMgXCI8XCIgb3IgXCI+XCIgaW4gdGhlIGF0dHJpYnV0ZSBvZiB0YWcsIEhUTUwgaXMgYnJva2VuIHdoZW4gY2hlY2tpbmcgdGhlIHRhZy5cclxuICAgICAqIFdoZW4gdXNpbmcgYW4gYXR0cmlidXRlIHdpdGggXCI8XCIgb3IgXCI+XCIsIHVzZSBcIkhUTUxFbmNvZGVyXCIgdG8gc2F2ZS4gKGV4OiBtYXRoKGthdGV4KSlcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBIVE1MIG9yIFRleHQgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBIVE1MRW5jb2RlcjogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZWMgPSB7JzwnOsKgJyRsdDsnLMKgJz4nOsKgJyRndDsnfTtcclxuICAgICAgICByZXR1cm4gY29udGVudHMucmVwbGFjZSgvPHw+L2csIGZ1bmN0aW9uIChtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIGVjW21dID09PSAnc3RyaW5nJykgPyBlY1ttXSA6IG07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSBlZGl0b3IgY2hlY2tzIHRhZ3MgYnkgc3RyaW5nLlxyXG4gICAgICogSWYgdGhlcmUgaXMgXCI8XCIgb3IgXCI+XCIgaW4gdGhlIGF0dHJpYnV0ZSBvZiB0YWcsIEhUTUwgaXMgYnJva2VuIHdoZW4gY2hlY2tpbmcgdGhlIHRhZy5cclxuICAgICAqIERlY29kZXIgb2YgZGF0YSBzdG9yZWQgYXMgXCJIVE1MRW5jb2RlclwiIChleDogbWF0aChrYXRleCkpXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgSFRNTCBvciBUZXh0IHN0cmluZ1xyXG4gICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgSFRNTERlY29kZXI6IGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgIGNvbnN0IGVjID0geyckbHQ7JzrCoCc8JyzCoCckZ3Q7JzrCoCc+J307XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoL1xcJGx0O3xcXCRndDsvZywgZnVuY3Rpb24gKG0pIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgZWNbbV0gPT09ICdzdHJpbmcnKSA/IGVjW21dIDogbTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgcnVuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IG9iai5rZXlcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBoYXNPd246IGZ1bmN0aW9uIChvYmosIGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNPd24uY2FsbChvYmosIGtleSk7XHJcbiAgICB9LFxyXG4gICAgX2hhc093bjogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSB0aGUgdGFnIHBhdGggb2YgdGhlIGFyZ3VtZW50cyB2YWx1ZVxyXG4gICAgICogSWYgbm90IGZvdW5kLCByZXR1cm4gdGhlIGZpcnN0IGZvdW5kIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBuYW1lQXJyYXkgRmlsZSBuYW1lIGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXh0ZW5zaW9uIGpzLCBjc3NcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldEluY2x1ZGVQYXRoOiBmdW5jdGlvbiAobmFtZUFycmF5LCBleHRlbnNpb24pIHtcclxuICAgICAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgICAgIGNvbnN0IHBhdGhMaXN0ID0gW107XHJcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IGV4dGVuc2lvbiA9PT0gJ2pzJyA/ICdzY3JpcHQnIDogJ2xpbmsnO1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IGV4dGVuc2lvbiA9PT0gJ2pzJyA/ICdzcmMnIDogJ2hyZWYnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9ICcoPzonO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBuYW1lQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgKz0gbmFtZUFycmF5W2ldICsgKGkgPCBsZW4gLSAxID8gJ3wnIDogJyknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyB0aGlzLl93LlJlZ0V4cCgnKF58LipbXFxcXC9dKScgKyBmaWxlTmFtZSArICcoXFxcXC5bXlxcXFwvXSspP1xcLicgKyBleHRlbnNpb24gKyAnKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgIGNvbnN0IGV4dFJlZ0V4cCA9IG5ldyB0aGlzLl93LlJlZ0V4cCgnLitcXFxcLicgKyBleHRlbnNpb24gKyAnKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5fZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSwgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChleHRSZWdFeHAudGVzdChjW2ldW3NyY10pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTGlzdC5wdXNoKGNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlZGl0b3JUYWcgPSBwYXRoTGlzdFtpXVtzcmNdLm1hdGNoKHJlZ0V4cCk7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3JUYWcpIHtcclxuICAgICAgICAgICAgICAgIHBhdGggPSBlZGl0b3JUYWdbMF07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhdGggPT09ICcnKSBwYXRoID0gcGF0aExpc3QubGVuZ3RoID4gMCA/IHBhdGhMaXN0WzBdW3NyY10gOiAnJztcclxuXHJcbiAgICAgICAgLTEgPT09IHBhdGguaW5kZXhPZignOi8nKSAmJiAnLy8nICE9PSBwYXRoLnNsaWNlKDAsIDIpICYmIChwYXRoID0gMCA9PT0gcGF0aC5pbmRleE9mKCcvJykgPyBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eLio/OlxcL1xcL1teXFwvXSovKVswXSArIHBhdGggOiBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eW15cXD9dKlxcLyg/OikvKVswXSArIHBhdGgpO1xyXG5cclxuICAgICAgICBpZiAoIXBhdGgpIHRocm93ICdbU1VORURJVE9SLnV0aWwuZ2V0SW5jbHVkZVBhdGguZmFpbF0gVGhlIFNVTkVESVRPUiBpbnN0YWxsYXRpb24gcGF0aCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gKG5hbWU6ICsnICsgbmFtZSArICcsIGV4dGVuc2lvbjogJyArIGV4dGVuc2lvbiArICcpJztcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWRcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBDU1MgdGV4dCB0aGF0IGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgcGFnZS5cclxuICAgICAqIEBwYXJhbSB7RG9jdW1lbnR8bnVsbH0gZG9jIFRvIGdldCB0aGUgQ1NTIHRleHQgb2YgYW4gZG9jdW1lbnQoY29yZS5fd2QpLiBJZiBudWxsIGdldCB0aGUgY3VycmVudCBkb2N1bWVudC5cclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFN0eWxlcyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgZ2V0UGFnZVN0eWxlOiBmdW5jdGlvbiAoZG9jKSB7XHJcbiAgICAgICAgbGV0IGNzc1RleHQgPSAnJztcclxuICAgICAgICBjb25zdCBzaGVldHMgPSAoZG9jIHx8IHRoaXMuX2QpLnN0eWxlU2hlZXRzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzaGVldHMubGVuZ3RoLCBydWxlczsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBydWxlcyA9IHNoZWV0c1tpXS5jc3NSdWxlcztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gcnVsZXMubGVuZ3RoOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IHJ1bGVzW2NdLmNzc1RleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjc3NUZXh0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIGFyZ3VtZW50IGlmcmFtZSdzIGRvY3VtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBpZnJhbWUgSWZyYW1lIGVsZW1lbnQgKGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUpXHJcbiAgICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldElmcmFtZURvY3VtZW50OiBmdW5jdGlvbiAoaWZyYW1lKSB7XHJcbiAgICAgICAgbGV0IHdEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICAgICAgaWYgKHdEb2N1bWVudC5kb2N1bWVudCkgd0RvY3VtZW50ID0gd0RvY3VtZW50LmRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiB3RG9jdW1lbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBhdHRyaWJ1dGVzIG9mIGFyZ3VtZW50IGVsZW1lbnQgdG8gc3RyaW5nICgnY2xhc3M9XCItLS1cIiBuYW1lPVwiLS0tXCIgJylcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtBcnJheXxudWxsfSBleGNlcHRBdHRycyBBcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSByZXN1bHRcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldEF0dHJpYnV0ZXNUb1N0cmluZzogZnVuY3Rpb24gKGVsZW1lbnQsIGV4Y2VwdEF0dHJzKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50LmF0dHJpYnV0ZXMpIHJldHVybiAnJztcclxuXHJcbiAgICAgICAgY29uc3QgYXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgbGV0IGF0dHJTdHJpbmcgPSAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChleGNlcHRBdHRycyAmJiBleGNlcHRBdHRycy5pbmRleE9mKGF0dHJzW2ldLm5hbWUpID4gLTEpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBhdHRyU3RyaW5nICs9IGF0dHJzW2ldLm5hbWUgKyAnPVwiJyArIGF0dHJzW2ldLnZhbHVlICsgJ1wiICc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXR0clN0cmluZztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25HZXRzIEdldCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGEgc3RyaW5nLlxyXG4gICAgICogcmVmZXJlbmNpbmcgY29kZTogXCJodHRwczovL2dpdGh1Yi5jb20vc2hhYW4xOTc0L215cmRpbi9ibG9iL21hc3Rlci9leHByZXNzaW9ucy9zdHJpbmcuanMjTDExXCJcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFN0cmluZyB0ZXh0XHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRCeXRlTGVuZ3RoOiBmdW5jdGlvbih0ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IHRoaXMuX3cuZW5jb2RlVVJJQ29tcG9uZW50O1xyXG4gICAgICAgIGxldCBjciwgY2w7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJRV9FZGdlKSB7XHJcbiAgICAgICAgICAgIGNsID0gdGhpcy5fdy51bmVzY2FwZShlbmNvZGVyKHRleHQudG9TdHJpbmcoKSkpLmxlbmd0aDtcclxuICAgICAgICAgICAgY3IgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVuY29kZXIodGV4dC50b1N0cmluZygpKS5tYXRjaCgvKCUwQXwlMEQpL2dpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY3IgPSBlbmNvZGVyKHRleHQudG9TdHJpbmcoKSkubWF0Y2goLyglMEF8JTBEKS9naSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2wgKyBjcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjbCA9IChuZXcgdGhpcy5fdy5UZXh0RW5jb2RlcigndXRmLTgnKS5lbmNvZGUodGV4dC50b1N0cmluZygpKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICBjciA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW5jb2Rlcih0ZXh0LnRvU3RyaW5nKCkpLm1hdGNoKC8oJTBBfCUwRCkvZ2kpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjciA9IGVuY29kZXIodGV4dC50b1N0cmluZygpKS5tYXRjaCgvKCUwQXwlMEQpL2dpKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjbCArIGNyO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGVkaXQgcmVnaW9uIHRvcCBkaXYgZWxlbWVudCBvciBpZnJhbWUncyBib2R5IHRhZy5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzV3lzaXd5Z0RpdjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmICh0aGlzLmhhc0NsYXNzKGVsZW1lbnQsICdzZS13cmFwcGVyLXd5c2l3eWcnKSB8fCAvXkJPRFkkL2kudGVzdChlbGVtZW50Lm5vZGVOYW1lKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBjb250ZW50ZWRpdGFibGUgcHJvcGVydHkgaXMgZmFsc2UuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc05vbkVkaXRhYmxlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAnZmFsc2UnO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBqdWRnZWQgd2hldGhlciBpdCBpcyBhIG5vZGUgcmVsYXRlZCB0byB0aGUgdGV4dCBzdHlsZS5cclxuICAgICAqIChzdHJvbmd8c3Bhbnxmb250fGJ8dmFyfGl8ZW18dXxpbnN8c3xzdHJpa2V8ZGVsfHN1YnxzdXB8bWFya3xhfGxhYmVsfGNvZGUpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1RleHRTdHlsZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPT0gMyAmJiAvXihzdHJvbmd8c3Bhbnxmb250fGJ8dmFyfGl8ZW18dXxpbnN8c3xzdHJpa2V8ZGVsfHN1YnxzdXB8bWFya3xhfGxhYmVsfGNvZGUpJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBmb3JtYXQgZWxlbWVudCAoUCwgRElWLCBIWzEtNl0sIFBSRSwgTEkgfCBjbGFzcz1cIl9fc2VfX2Zvcm1hdF9fcmVwbGFjZV94eHhcIilcclxuICAgICAqIEZvcm1hdCBlbGVtZW50IGFsc28gY29udGFpbiBcImZyZWUgZm9ybWF0IEVsZW1lbnRcIlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgKC9eKFB8RElWfEhbMS02XXxQUkV8TEl8VEh8VEQpJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgfHwgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnKFxcXFxzfF4pX19zZV9fZm9ybWF0X19yZXBsYWNlXy4rKFxcXFxzfCQpfChcXFxcc3xeKV9fc2VfX2Zvcm1hdF9fZnJlZV8uKyhcXFxcc3wkKScpKSAmJiAhdGhpcy5pc0NvbXBvbmVudChlbGVtZW50KSAmJiAhdGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSByYW5nZSBmb3JtYXQgZWxlbWVudC4gKEJMT0NLUVVPVEUsIE9MLCBVTCwgRklHQ0FQVElPTiwgVEFCTEUsIFRIRUFELCBUQk9EWSwgVFIsIFRILCBURCB8IGNsYXNzPVwiX19zZV9fZm9ybWF0X19yYW5nZV94eHhcIilcclxuICAgICAqIFJhbmdlIGZvcm1hdCBlbGVtZW50IGlzIHdyYXAgdGhlIFwiZm9ybWF0IGVsZW1lbnRcIiBhbmQgXCJjb21wb25lbnRcIlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNSYW5nZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAoL14oQkxPQ0tRVU9URXxPTHxVTHxGSUdDQVBUSU9OfFRBQkxFfFRIRUFEfFRCT0RZfFRSfFRIfFREKSQvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpIHx8IHRoaXMuaGFzQ2xhc3MoZWxlbWVudCwgJyhcXFxcc3xeKV9fc2VfX2Zvcm1hdF9fcmFuZ2VfLisoXFxcXHN8JCknKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBjbG9zdXJlIHJhbmdlIGZvcm1hdCBlbGVtZW50LiAoVEgsIFREIHwgY2xhc3M9XCJfX3NlX19mb3JtYXRfX3JhbmdlX19jbG9zdXJlX3h4eFwiKVxyXG4gICAgICogQ2xvc3VyZSByYW5nZSBmb3JtYXQgZWxlbWVudHMgaXMgaW5jbHVkZWQgaW4gdGhlIHJhbmdlIGZvcm1hdCBlbGVtZW50LlxyXG4gICAgICogIC0gQ2xvc3VyZSByYW5nZSBmb3JtYXQgZWxlbWVudCBpcyB3cmFwIHRoZSBcImZvcm1hdCBlbGVtZW50XCIgYW5kIFwiY29tcG9uZW50XCJcclxuICAgICAqIOKAuyBZb3UgY2Fubm90IGV4aXQgdGhpcyBmb3JtYXQgd2l0aCB0aGUgRW50ZXIga2V5IG9yIEJhY2tzcGFjZSBrZXkuXHJcbiAgICAgKiDigLsgVXNlIGl0IG9ubHkgaW4gc3BlY2lhbCBjYXNlcy4gKFtleF0gZm9ybWF0IG9mIHRhYmxlIGNlbGxzKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNDbG9zdXJlUmFuZ2VGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgKC9eKFRIfFREKSQvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpIHx8IHRoaXMuaGFzQ2xhc3MoZWxlbWVudCwgJyhcXFxcc3xeKV9fc2VfX2Zvcm1hdF9fcmFuZ2VfX2Nsb3N1cmVfLisoXFxcXHN8JCknKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBmcmVlIGZvcm1hdCBlbGVtZW50LiAoUFJFIHwgY2xhc3M9XCJfX3NlX19mb3JtYXRfX2ZyZWVfeHh4XCIpXHJcbiAgICAgKiBGcmVlIGZvcm1hdCBlbGVtZW50cyBpcyBpbmNsdWRlZCBpbiB0aGUgZm9ybWF0IGVsZW1lbnQuXHJcbiAgICAgKiBGcmVlIGZvcm1hdCBlbGVtZW50cydzIGxpbmUgYnJlYWsgaXMgXCJCUlwiIHRhZy5cclxuICAgICAqIOKAuyBFbnRlcmluZyB0aGUgRW50ZXIga2V5IGluIHRoZSBzcGFjZSBvbiB0aGUgbGFzdCBsaW5lIGVuZHMgXCJGcmVlIEZvcm1hdFwiIGFuZCBhcHBlbmRzIFwiRm9ybWF0XCIuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc0ZyZWVGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgKC9eUFJFJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgfHwgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnKFxcXFxzfF4pX19zZV9fZm9ybWF0X19mcmVlXy4rKFxcXFxzfCQpJykpICYmICF0aGlzLmlzQ29tcG9uZW50KGVsZW1lbnQpICYmICF0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGNsb3N1cmUgZnJlZSBmb3JtYXQgZWxlbWVudC4gKGNsYXNzPVwiX19zZV9fZm9ybWF0X19mcmVlX19jbG9zdXJlX3h4eFwiKVxyXG4gICAgICogQ2xvc3VyZSBmcmVlIGZvcm1hdCBlbGVtZW50cyBpcyBpbmNsdWRlZCBpbiB0aGUgZnJlZSBmb3JtYXQgZWxlbWVudC5cclxuICAgICAqICAtIENsb3N1cmUgZnJlZSBmb3JtYXQgZWxlbWVudHMncyBsaW5lIGJyZWFrIGlzIFwiQlJcIiB0YWcuXHJcbiAgICAgKiDigLsgWW91IGNhbm5vdCBleGl0IHRoaXMgZm9ybWF0IHdpdGggdGhlIEVudGVyIGtleSBvciBCYWNrc3BhY2Uga2V5LlxyXG4gICAgICog4oC7IFVzZSBpdCBvbmx5IGluIHNwZWNpYWwgY2FzZXMuIChbZXhdIGZvcm1hdCBvZiB0YWJsZSBjZWxscylcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzQ2xvc3VyZUZyZWVGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnKFxcXFxzfF4pX19zZV9fZm9ybWF0X19mcmVlX19jbG9zdXJlXy4rKFxcXFxzfCQpJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBjb21wb25lbnQgW2ltZywgaWZyYW1lLCB2aWRlbywgYXVkaW9dIGNvdmVyKGNsYXNzPVwic2UtY29tcG9uZW50XCIpIGFuZCB0YWJsZSwgaHJcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzQ29tcG9uZW50OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmICgvc2UtY29tcG9uZW50Ly50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKSB8fCAvXihUQUJMRXxIUikkLy50ZXN0KGVsZW1lbnQubm9kZU5hbWUpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGZvciBcIl9fc2VfX3VuZWRpdGFibGVcIiBpbiB0aGUgY2xhc3MgbGlzdC5cclxuICAgICAqIENvbXBvbmVudHMgd2l0aCBjbGFzcyBcIl9fc2VfX3VuZWRpdGFibGVcIiBjYW5ub3QgYmUgbW9kaWZpZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1VuZWRpdGFibGVDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnX19zZV9fdW5lZGl0YWJsZScpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBqdWRnZWQgd2hldGhlciBpdCBpcyB0aGUgY29tcG9uZW50IFtpbWcsIGlmcmFtZV0gY292ZXIoY2xhc3M9XCJzZS1jb21wb25lbnRcIilcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzTWVkaWFDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgL3NlLWNvbXBvbmVudC8udGVzdChlbGVtZW50LmNsYXNzTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBub3QgY2hlY2tpbmcgbm9kZS4gKGNsYXNzPVwia2F0ZXhcIiwgXCJfX3NlX190YWdcIilcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzTm90Q2hlY2tpbmdOb2RlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIC9rYXRleHxfX3NlX190YWcvLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJZiBhIHBhcmVudCBub2RlIHRoYXQgY29udGFpbnMgYW4gYXJndW1lbnQgbm9kZSBmaW5kcyBhIGZvcm1hdCBub2RlICh1dGlsLmlzRm9ybWF0RWxlbWVudCksIGl0IHJldHVybnMgdGhhdCBub2RlLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFJlZmVyZW5jZSBub2RlLlxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldEZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWxpZGF0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoIXZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1JhbmdlRm9ybWF0RWxlbWVudChlbGVtZW50KSkgZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGb3JtYXRFbGVtZW50KGVsZW1lbnQpICYmIHZhbGlkYXRpb24oZWxlbWVudCkpIHJldHVybiBlbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIElmIGEgcGFyZW50IG5vZGUgdGhhdCBjb250YWlucyBhbiBhcmd1bWVudCBub2RlIGZpbmRzIGEgZm9ybWF0IG5vZGUgKHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQpLCBpdCByZXR1cm5zIHRoYXQgbm9kZS5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBSZWZlcmVuY2Ugbm9kZS5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdmFsaWRhdGlvbiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRSYW5nZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWxpZGF0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoIXZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1JhbmdlRm9ybWF0RWxlbWVudChlbGVtZW50KSAmJiAhL14oVEhFQUR8VEJPRFl8VFIpJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgJiYgdmFsaWRhdGlvbihlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSWYgYSBwYXJlbnQgbm9kZSB0aGF0IGNvbnRhaW5zIGFuIGFyZ3VtZW50IG5vZGUgZmluZHMgYSBmcmVlIGZvcm1hdCBub2RlICh1dGlsLmlzRnJlZUZvcm1hdEVsZW1lbnQpLCBpdCByZXR1cm5zIHRoYXQgbm9kZS5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBSZWZlcmVuY2Ugbm9kZS5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdmFsaWRhdGlvbiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRGcmVlRm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbGlkYXRpb24pIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRnJlZUZvcm1hdEVsZW1lbnQoZWxlbWVudCkgJiYgdmFsaWRhdGlvbihlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSWYgYSBwYXJlbnQgbm9kZSB0aGF0IGNvbnRhaW5zIGFuIGFyZ3VtZW50IG5vZGUgZmluZHMgYSBjbG9zdXJlIGZyZWUgZm9ybWF0IG5vZGUgKHV0aWwuaXNDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQpLCBpdCByZXR1cm5zIHRoYXQgbm9kZS5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBSZWZlcmVuY2Ugbm9kZS5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdmFsaWRhdGlvbiBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWxpZGF0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoIXZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3N1cmVGcmVlRm9ybWF0RWxlbWVudChlbGVtZW50KSAmJiB2YWxpZGF0aW9uKGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgc3R5bGUgYW5kIGNsYXNzTmFtZSBvZiBjb3B5RWwgdG8gb3JpZ2luRWxcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gb3JpZ2luRWwgT3JpZ2luIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY29weUVsIEVsZW1lbnQgdG8gY29weVxyXG4gICAgICovXHJcbiAgICBjb3B5VGFnQXR0cmlidXRlczogZnVuY3Rpb24gKG9yaWdpbkVsLCBjb3B5RWwpIHtcclxuICAgICAgICBpZiAoY29weUVsLnN0eWxlLmNzc1RleHQpIHtcclxuICAgICAgICAgICAgb3JpZ2luRWwuc3R5bGUuY3NzVGV4dCArPSBjb3B5RWwuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjb3B5RWwuY2xhc3NMaXN0O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjbGFzc2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3Mob3JpZ2luRWwsIGNsYXNzZXNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvcmlnaW5FbC5zdHlsZS5jc3NUZXh0KSBvcmlnaW5FbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XHJcbiAgICAgICAgaWYgKCFvcmlnaW5FbC5jbGFzc05hbWUudHJpbSgpKSBvcmlnaW5FbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvcHkgYW5kIGFwcGx5IGF0dHJpYnV0ZXMgb2YgZm9ybWF0IHRhZyB0aGF0IHNob3VsZCBiZSBtYWludGFpbmVkLiAoc3R5bGUsIGNsYXNzKSBJZ25vcmUgXCJfX3NlX19mb3JtYXRfX1wiIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9yaWdpbkVsIE9yaWdpbiBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGNvcHlFbCBFbGVtZW50IHRvIGNvcHlcclxuICAgICAqL1xyXG4gICAgY29weUZvcm1hdEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChvcmlnaW5FbCwgY29weUVsKSB7XHJcbiAgICAgICAgY29weUVsID0gY29weUVsLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgY29weUVsLmNsYXNzTmFtZSA9IGNvcHlFbC5jbGFzc05hbWUucmVwbGFjZSgvKFxcc3xeKV9fc2VfX2Zvcm1hdF9fW15cXHNdKy9nLCAnJyk7XHJcbiAgICAgICAgdGhpcy5jb3B5VGFnQXR0cmlidXRlcyhvcmlnaW5FbCwgY29weUVsKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBpdGVtIGZyb20gdGhlIGFycmF5IHRoYXQgbWF0Y2hlcyB0aGUgY29uZGl0aW9uLlxyXG4gICAgICogQHBhcmFtIHtBcnJheXxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gYXJyYXkgQXJyYXkgdG8gZ2V0IGl0ZW1cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdmFsaWRhdGlvbiBDb25kaXRpb25hbCBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBtdWx0aSBJZiB0cnVlLCByZXR1cm5zIGFsbCBpdGVtcyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhIG90aGVyd2lzZSwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cclxuICAgICAqIElmIGZhbHNlLCByZXR1cm5zIG9ubHkgb25lIGl0ZW0gdGhhdCBtZWV0IHRoZSBjcml0ZXJpYSBvdGhlcndpc2UgcmV0dXJuIG51bGwuXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Tm9kZXxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRBcnJheUl0ZW06IGZ1bmN0aW9uIChhcnJheSwgdmFsaWRhdGlvbiwgbXVsdGkpIHtcclxuICAgICAgICBpZiAoIWFycmF5IHx8IGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHZhbGlkYXRpb24gPSB2YWxpZGF0aW9uIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XHJcbiAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aCwgYTsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGEgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24oYSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbXVsdGkpIHJldHVybiBhO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhcnIucHVzaChhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICFtdWx0aSA/IG51bGwgOiBhcnI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGluIHRoZSBlbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBhcnJheSBlbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZmluZCBpbmRleFxyXG4gICAgICogQHJldHVybnMge051bWJlcn1cclxuICAgICAqL1xyXG4gICAgZ2V0QXJyYXlJbmRleDogZnVuY3Rpb24gKGFycmF5LCBlbGVtZW50KSB7XHJcbiAgICAgICAgbGV0IGlkeCA9IC0xO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBuZXh0IGluZGV4IG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBpbiB0aGUgZWxlbWVudCBhcnJheVxyXG4gICAgICogQHBhcmFtIHtBcnJheXxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gYXJyYXkgZWxlbWVudCBhcnJheVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBpdGVtIFRoZSBlbGVtZW50IHRvIGZpbmQgaW5kZXhcclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIG5leHRJZHg6IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xyXG4gICAgICAgIGxldCBpZHggPSB0aGlzLmdldEFycmF5SW5kZXgoYXJyYXksIGl0ZW0pO1xyXG4gICAgICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gLTE7XHJcbiAgICAgICAgcmV0dXJuIGlkeCArIDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgcHJldmlvdXMgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGluIHRoZSBlbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBhcnJheSBFbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGl0ZW0gVGhlIGVsZW1lbnQgdG8gZmluZCBpbmRleFxyXG4gICAgICogQHJldHVybnMge051bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHJldklkeDogZnVuY3Rpb24gKGFycmF5LCBpdGVtKSB7XHJcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXJyYXlJbmRleChhcnJheSwgaXRlbSk7XHJcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiAtMTtcclxuICAgICAgICByZXR1cm4gaWR4IC0gMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgaW5kZXggY29tcGFyZWQgdG8gb3RoZXIgc2libGluZyBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUaGUgTm9kZSB0byBmaW5kIGluZGV4XHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRQb3NpdGlvbkluZGV4OiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIGxldCBpZHggPSAwO1xyXG4gICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSkge1xyXG4gICAgICAgICAgICBpZHggKz0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIFwibm9kZVwiIGluIHRoZSBcInBhcmVudE5vZGVcIiBpbiBhIG51bWVyaWNhbCBhcnJheS5cclxuICAgICAqIGV4KSA8cD48c3Bhbj5hYTwvc3Bhbj48c3Bhbj5iYjwvc3Bhbj48L3A+IDogZ2V0Tm9kZVBhdGgobm9kZTogXCJiYlwiLCBwYXJlbnROb2RlOiBcIjxQPlwiKSAtPiBbMSwgMF1cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUaGUgTm9kZSB0byBmaW5kIHBvc2l0aW9uIHBhdGhcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxudWxsfSBwYXJlbnROb2RlIFBhcmVudCBub2RlLiBJZiBudWxsLCB3eXNpd3lnIGRpdiBhcmVhXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBfbmV3T2Zmc2V0cyBJZiB5b3Ugc2VuZCBhbiBvYmplY3Qgb2YgdGhlIGZvcm0gXCJ7czogMCwgZTogMH1cIiwgdGhlIHRleHQgbm9kZXMgdGhhdCBhcmUgYXR0YWNoZWQgdG9nZXRoZXIgYXJlIG1lcmdlZCBpbnRvIG9uZSwgY2VudGVyZWQgb24gdGhlIFwibm9kZVwiIGFyZ3VtZW50LlxyXG4gICAgICogXCJfbmV3T2Zmc2V0cy5zXCIgc3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvbWJpbmVkIGNoYXJhY3RlcnMgYWZ0ZXIgXCJub2RlXCIgYW5kIFwiX25ld09mZnNldHMuZVwiIHN0b3JlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21iaW5lZCBjaGFyYWN0ZXJzIGJlZm9yZSBcIm5vZGVcIi5cclxuICAgICAqIERvIG5vdCB1c2UgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LlxyXG4gICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICovXHJcbiAgICBnZXROb2RlUGF0aDogZnVuY3Rpb24gKG5vZGUsIHBhcmVudE5vZGUsIF9uZXdPZmZzZXRzKSB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFtdO1xyXG4gICAgICAgIGxldCBmaW5kcyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0UGFyZW50RWxlbWVudChub2RlLCBmdW5jdGlvbiAoZWwpIHtcclxuICAgICAgICAgICAgaWYgKGVsID09PSBwYXJlbnROb2RlKSBmaW5kcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoZmluZHMgJiYgIXRoaXMuaXNXeXNpd3lnRGl2KGVsKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGV4dCBub2Rlc1xyXG4gICAgICAgICAgICAgICAgaWYgKF9uZXdPZmZzZXRzICYmIGVsLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBudWxsLCB0ZW1wVGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgX25ld09mZnNldHMucyA9IF9uZXdPZmZzZXRzLmUgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXMgPSBlbC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHByZXZpb3VzICYmIHByZXZpb3VzLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUZXh0ID0gcHJldmlvdXMudGV4dENvbnRlbnQucmVwbGFjZSh0aGlzLnplcm9XaWR0aFJlZ0V4cCwgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfbmV3T2Zmc2V0cy5zICs9IHRlbXBUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSB0ZW1wVGV4dCArIGVsLnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gcHJldmlvdXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0odGVtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGVsLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRleHQgPSBuZXh0LnRleHRDb250ZW50LnJlcGxhY2UodGhpcy56ZXJvV2lkdGhSZWdFeHAsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX25ld09mZnNldHMuZSArPSB0ZW1wVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ICs9IHRlbXBUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbmV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbSh0ZW1wKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW5kZXggcHVzaFxyXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKGVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gcGF0aC5tYXAodGhpcy5nZXRQb3NpdGlvbkluZGV4KS5yZXZlcnNlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIG5vZGUgaW4gdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXRoIGFycmF5IG9idGFpbmVkIGZyb20gXCJ1dGlsLmdldE5vZGVQYXRoXCIuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvZmZzZXRzIFBvc2l0aW9uIGFycmF5LCBhcnJheSBvYnRhaW5lZCBmcm9tIFwidXRpbC5nZXROb2RlUGF0aFwiXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGUgQmFzZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgICogQHJldHVybnMge05vZGV9XHJcbiAgICAgKi9cclxuICAgIGdldE5vZGVGcm9tUGF0aDogZnVuY3Rpb24gKG9mZnNldHMsIHBhcmVudE5vZGUpIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgbGV0IG5vZGVzO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gb2Zmc2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBub2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XHJcbiAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGggPD0gb2Zmc2V0c1tpXSkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IG5vZGVzW29mZnNldHNbaV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcGFyZXMgdGhlIHN0eWxlIGFuZCBjbGFzcyBmb3IgZXF1YWwgdmFsdWVzLlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIHRleHQgbm9kZXMuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGEgTm9kZSB0byBjb21wYXJlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGIgTm9kZSB0byBjb21wYXJlXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNTYW1lQXR0cmlidXRlczogZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICBpZiAoYS5ub2RlVHlwZSA9PT0gMyAmJiBiLm5vZGVUeXBlID09PSAzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoYS5ub2RlVHlwZSA9PT0gMyB8fCBiLm5vZGVUeXBlID09PSAzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlX2EgPSBhLnN0eWxlO1xyXG4gICAgICAgIGNvbnN0IHN0eWxlX2IgPSBiLnN0eWxlO1xyXG4gICAgICAgIGxldCBjb21wU3R5bGUgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3R5bGVfYS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc3R5bGVfYVtzdHlsZV9hW2ldXSA9PT0gc3R5bGVfYltzdHlsZV9hW2ldXSkgY29tcFN0eWxlKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjbGFzc19hID0gYS5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgY2xhc3NfYiA9IGIuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHJlZyA9IHRoaXMuX3cuUmVnRXhwO1xyXG4gICAgICAgIGxldCBjb21wQ2xhc3MgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2xhc3NfYS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocmVnKCcoXFxzfF4pJyArIGNsYXNzX2FbaV0gKyAnKFxcc3wkKScpLnRlc3QoY2xhc3NfYi52YWx1ZSkpIGNvbXBDbGFzcysrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChjb21wU3R5bGUgPT09IHN0eWxlX2IubGVuZ3RoICYmIGNvbXBTdHlsZSA9PT0gc3R5bGVfYS5sZW5ndGgpICYmIChjb21wQ2xhc3MgPT09IGNsYXNzX2IubGVuZ3RoICYmIGNvbXBDbGFzcyA9PT0gY2xhc3NfYS5sZW5ndGgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgbm9kZSBpcyBhIGxpc3QgKG9sLCB1bClcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNMaXN0OiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIC9eKE9MfFVMKSQvaS50ZXN0KHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyA/IG5vZGUgOiBub2RlLm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSBsaXN0IGNlbGwgKGxpKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfFN0cmluZ30gbm9kZSBUaGUgZWxlbWVudCBvciBlbGVtZW50IG5hbWUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc0xpc3RDZWxsOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIC9eTEkkL2kudGVzdCh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgPyBub2RlIDogbm9kZS5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrIHRoZSBub2RlIGlzIGEgdGFibGUgKHRhYmxlLCB0aGVhZCwgdGJvZHksIHRyLCB0aCwgdGQpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzVGFibGU6IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgL14oVEFCTEV8VEhFQUR8VEJPRFl8VFJ8VEh8VEQpJC9pLnRlc3QodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnID8gbm9kZSA6IG5vZGUubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgbm9kZSBpcyBhIHRhYmxlIGNlbGwgKHRkLCB0aClcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNDZWxsOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIC9eKFREfFRIKSQvaS50ZXN0KHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyA/IG5vZGUgOiBub2RlLm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSBicmVhayBub2RlIChCUilcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNCcmVhazogZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSAmJiAvXkJSJC9pLnRlc3QodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnID8gbm9kZSA6IG5vZGUubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSBhbmNob3Igbm9kZSAoQSlcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNBbmNob3I6IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgL15BJC9pLnRlc3QodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnID8gbm9kZSA6IG5vZGUubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgbm9kZSBpcyBhIG1lZGlhIG5vZGUgKGltZywgaWZyYW1lLCBhdWRpbywgdmlkZW8sIGNhbnZhcylcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNNZWRpYTogZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSAmJiAvXihJTUd8SUZSQU1FfEFVRElPfFZJREVPfENBTlZBUykkL2kudGVzdCh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgPyBub2RlIDogbm9kZS5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBmb3IgbnVtZXJpYyAod2l0aCBkZWNpbWFsIHBvaW50KS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdGV4dCBUZXh0IHN0cmluZyBvciBudW1iZXJcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc051bWJlcjogZnVuY3Rpb24gKHRleHQpIHtcclxuICAgICAgICByZXR1cm4gISF0ZXh0ICYmIC9eLT9cXGQrKFxcLlxcZCspPyQvLnRlc3QodGV4dCArICcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGEgbnVtYmVyLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB0ZXh0IFRleHQgc3RyaW5nIG9yIG51bWJlclxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1heERlYyBNYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyAoLTEgOiBJbmZpbml0eSlcclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldE51bWJlcjogZnVuY3Rpb24gKHRleHQsIG1heERlYykge1xyXG4gICAgICAgIGlmICghdGV4dCkgcmV0dXJuIDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG51bWJlciA9ICh0ZXh0ICsgJycpLm1hdGNoKC8tP1xcZCsoXFwuXFxkKyk/Lyk7XHJcbiAgICAgICAgaWYgKCFudW1iZXIgfHwgIW51bWJlclswXSkgcmV0dXJuIDA7XHJcblxyXG4gICAgICAgIG51bWJlciA9IG51bWJlclswXTtcclxuICAgICAgICByZXR1cm4gbWF4RGVjIDwgMCA/IG51bWJlciAqIDEgOiBtYXhEZWMgPT09IDAgPyB0aGlzLl93Lk1hdGgucm91bmQobnVtYmVyICogMSkgOiAobnVtYmVyICogMSkudG9GaXhlZChtYXhEZWMpICogMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGFsbCBcImNoaWxkcmVuXCIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGVsZW1lbnQgKFdpdGhvdXQgdGV4dCBub2RlcylcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBlbGVtZW50IHRvIGdldCBjaGlsZCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHZhbGlkYXRpb24gQ29uZGl0aW9uYWwgZnVuY3Rpb25cclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAqL1xyXG4gICAgZ2V0TGlzdENoaWxkcmVuOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsaWRhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107XHJcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNoaWxkcmVuIHx8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSByZXR1cm4gY2hpbGRyZW47XHJcblxyXG4gICAgICAgIHZhbGlkYXRpb24gPSB2YWxpZGF0aW9uIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XHJcblxyXG4gICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IGN1cnJlbnQgJiYgdmFsaWRhdGlvbihjdXJyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjdXJyZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGN1cnJlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY3VycmVudC5jaGlsZHJlbltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgYWxsIFwiY2hpbGROb2Rlc1wiIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBlbGVtZW50IChJbmNsdWRlIHRleHQgbm9kZXMpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgZWxlbWVudCB0byBnZXQgY2hpbGQgbm9kZVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIENvbmRpdGlvbmFsIGZ1bmN0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgKi9cclxuICAgIGdldExpc3RDaGlsZE5vZGVzOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsaWRhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107XHJcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHJldHVybiBjaGlsZHJlbjtcclxuXHJcbiAgICAgICAgdmFsaWRhdGlvbiA9IHZhbGlkYXRpb24gfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuXHJcbiAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gY3VycmVudCAmJiB2YWxpZGF0aW9uKGN1cnJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGN1cnJlbnQuY2hpbGROb2Rlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyZW50cyBub2Rlcy5cclxuICAgICAqIFwiMFwiIHdoZW4gdGhlIHBhcmVudCBub2RlIGlzIHRoZSBXWVNJV1lHIGFyZWEuXHJcbiAgICAgKiBcIi0xXCIgd2hlbiB0aGUgZWxlbWVudCBhcmd1bWVudCBpcyB0aGUgV1lTSVdZRyBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRFbGVtZW50RGVwdGg6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IHRoaXMuaXNXeXNpd3lnRGl2KGVsZW1lbnQpKSByZXR1cm4gLTE7XHJcblxyXG4gICAgICAgIGxldCBkZXB0aCA9IDA7XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIXRoaXMuaXNXeXNpd3lnRGl2KGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRlcHRoICs9IDE7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVwdGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvbXBhcmVzIHR3byBlbGVtZW50cyB0byBmaW5kIGEgY29tbW9uIGFuY2VzdG9yLCBhbmQgcmV0dXJucyB0aGUgb3JkZXIgb2YgdGhlIHR3byBlbGVtZW50cy5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gYSBOb2RlIHRvIGNvbXBhcmUuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGIgTm9kZSB0byBjb21wYXJlLlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0geyBhbmNlc3N0b3IsIGEsIGIsIHJlc3VsdDogKGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwKSB9O1xyXG4gICAgICovXHJcbiAgICBjb21wYXJlRWxlbWVudHM6IGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgbGV0IGFOb2RlID0gYSwgYk5vZGUgPSBiO1xyXG4gICAgICAgIHdoaWxlIChhTm9kZSAmJiBiTm9kZSAmJiBhTm9kZS5wYXJlbnROb2RlICE9PSBiTm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGFOb2RlID0gYU5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgYk5vZGUgPSBiTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhTm9kZSB8fCAhYk5vZGUpIHJldHVybiB7IGFuY2VzdG9yOiBudWxsLCBhOiBhLCBiOiBiLCByZXN1bHQ6IDAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBhTm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgY29uc3QgYUluZGV4ID0gdGhpcy5nZXRBcnJheUluZGV4KGNoaWxkcmVuLCBhTm9kZSk7XHJcbiAgICAgICAgY29uc3QgYkluZGV4ID0gdGhpcy5nZXRBcnJheUluZGV4KGNoaWxkcmVuLCBiTm9kZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFuY2VzdG9yOiBhTm9kZS5wYXJlbnROb2RlLFxyXG4gICAgICAgICAgICBhOiBhTm9kZSxcclxuICAgICAgICAgICAgYjogYk5vZGUsXHJcbiAgICAgICAgICAgIHJlc3VsdDogYUluZGV4ID4gYkluZGV4ID8gMSA6IGFJbmRleCA8IGJJbmRleCA/IC0xIDogMFxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGFyZ3VtZW50IHZhbHVlLlxyXG4gICAgICogQSB0YWcgdGhhdCBzYXRpc2ZpZXMgdGhlIHF1ZXJ5IGNvbmRpdGlvbiBpcyBpbXBvcnRlZC5cclxuICAgICAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgUmVmZXJlbmNlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBxdWVyeSBRdWVyeSBTdHJpbmcgKG5vZGVOYW1lLCAuY2xhc3NOYW1lLCAjSUQsIDpuYW1lKSBvciB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxyXG4gICAgICogTm90IHVzZSBpdCBsaWtlIGpxdWVyeS5cclxuICAgICAqIE9ubHkgb25lIGNvbmRpdGlvbiBjYW4gYmUgZW50ZXJlZCBhdCBhIHRpbWUuXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRQYXJlbnRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgcXVlcnkpIHtcclxuICAgICAgICBsZXQgY2hlY2s7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY2hlY2sgPSBxdWVyeTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYXR0cjtcclxuICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICdjbGFzc05hbWUnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5zcGxpdCgnLicpWzFdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9eIy8udGVzdChxdWVyeSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSAnXicgKyBxdWVyeS5zcGxpdCgnIycpWzFdICsgJyQnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9eOi8udGVzdChxdWVyeSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnbmFtZSc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9ICdeJyArIHF1ZXJ5LnNwbGl0KCc6JylbMV0gKyAnJCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyID0gJ25vZGVOYW1lJztcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJ14nICsgcXVlcnkgKyAnJCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyB0aGlzLl93LlJlZ0V4cChxdWVyeSwgJ2knKTtcclxuICAgICAgICAgICAgY2hlY2sgPSBmdW5jdGlvbiAoZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWdFeHAudGVzdChlbFthdHRyXSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiAhY2hlY2soZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNXeXNpd3lnRGl2KGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgY2hpbGQgZWxlbWVudCBvZiB0aGUgYXJndW1lbnQgdmFsdWUuXHJcbiAgICAgKiBBIHRhZyB0aGF0IHNhdGlzZmllcyB0aGUgcXVlcnkgY29uZGl0aW9uIGlzIGltcG9ydGVkLlxyXG4gICAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBSZWZlcmVuY2UgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHF1ZXJ5IFF1ZXJ5IFN0cmluZyAobm9kZU5hbWUsIC5jbGFzc05hbWUsICNJRCwgOm5hbWUpIG9yIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxhc3QgSWYgdHJ1ZSByZXR1cm5zIHRoZSBsYXN0IG5vZGUgYW1vbmcgdGhlIGZvdW5kIGNoaWxkIG5vZGVzLiAoZGVmYXVsdDogZmlyc3Qgbm9kZSlcclxuICAgICAqIE5vdCB1c2UgaXQgbGlrZSBqcXVlcnkuXHJcbiAgICAgKiBPbmx5IG9uZSBjb25kaXRpb24gY2FuIGJlIGVudGVyZWQgYXQgYSB0aW1lLlxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q2hpbGRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgcXVlcnksIGxhc3QpIHtcclxuICAgICAgICBsZXQgY2hlY2s7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY2hlY2sgPSBxdWVyeTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYXR0cjtcclxuICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICdjbGFzc05hbWUnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5zcGxpdCgnLicpWzFdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9eIy8udGVzdChxdWVyeSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSAnXicgKyBxdWVyeS5zcGxpdCgnIycpWzFdICsgJyQnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9eOi8udGVzdChxdWVyeSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnbmFtZSc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9ICdeJyArIHF1ZXJ5LnNwbGl0KCc6JylbMV0gKyAnJCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyID0gJ25vZGVOYW1lJztcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJ14nICsgKHF1ZXJ5ID09PSAndGV4dCcgPyAnIycgKyBxdWVyeSA6IHF1ZXJ5KSArICckJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IHRoaXMuX3cuUmVnRXhwKHF1ZXJ5LCAnaScpO1xyXG4gICAgICAgICAgICBjaGVjayA9IGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ0V4cC50ZXN0KGVsW2F0dHJdKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNoaWxkTGlzdCA9IHRoaXMuZ2V0TGlzdENoaWxkTm9kZXMoZWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrKGN1cnJlbnQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGRMaXN0W2xhc3QgPyBjaGlsZExpc3QubGVuZ3RoIC0gMSA6IDBdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiAxLiBUaGUgZmlyc3Qgbm9kZSBvZiBhbGwgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBcImZpcnN0XCIgZWxlbWVudCBpcyByZXR1cm5lZC5cclxuICAgICAqIDIuIFRoZSBsYXN0IG5vZGUgb2YgYWxsIHRoZSBjaGlsZCBub2RlcyBvZiB0aGUgXCJsYXN0XCIgZWxlbWVudCBpcyByZXR1cm5lZC5cclxuICAgICAqIDMuIFdoZW4gdGhlcmUgaXMgbm8gXCJsYXN0XCIgZWxlbWVudCwgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGVzIG9mIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIFwiZmlyc3RcIiBlbGVtZW50IGFyZSByZXR1cm5lZC5cclxuICAgICAqIHsgc2M6IFwiZmlyc3RcIiwgZWM6IFwibGFzdFwiIH1cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZmlyc3QgRmlyc3QgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtOb2RlfG51bGx9IGxhc3QgTGFzdCBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICovXHJcbiAgICBnZXRFZGdlQ2hpbGROb2RlczogZnVuY3Rpb24gKGZpcnN0LCBsYXN0KSB7XHJcbiAgICAgICAgaWYgKCFmaXJzdCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghbGFzdCkgbGFzdCA9IGZpcnN0O1xyXG5cclxuICAgICAgICB3aGlsZSAoZmlyc3QgJiYgZmlyc3Qubm9kZVR5cGUgPT09IDEgJiYgZmlyc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwICYmICF0aGlzLmlzQnJlYWsoZmlyc3QpKSBmaXJzdCA9IGZpcnN0LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgd2hpbGUgKGxhc3QgJiYgbGFzdC5ub2RlVHlwZSA9PT0gMSAmJiBsYXN0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJiAgIXRoaXMuaXNCcmVhayhsYXN0KSkgbGFzdCA9IGxhc3QubGFzdENoaWxkO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzYzogZmlyc3QsXHJcbiAgICAgICAgICAgIGVjOiBsYXN0IHx8IGZpcnN0XHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnQgYW5kIHRvcCBvZiBhcmd1bWVudC4ge2xlZnQ6MCwgdG9wOjB9XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGFyZ2V0IG5vZGVcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSB3eXNpd3lnRnJhbWUgV2hlbiB1c2UgaWZyYW1lIG9wdGlvbiwgaWZyYW1lIG9iamVjdCBzaG91bGQgYmUgc2VudCAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZSlcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIGdldE9mZnNldDogZnVuY3Rpb24gKGVsZW1lbnQsIHd5c2l3eWdGcmFtZSkge1xyXG4gICAgICAgIGxldCBvZmZzZXRMZWZ0ID0gMDtcclxuICAgICAgICBsZXQgb2Zmc2V0VG9wID0gMDtcclxuICAgICAgICBsZXQgb2Zmc2V0RWxlbWVudCA9IGVsZW1lbnQubm9kZVR5cGUgPT09IDMgPyBlbGVtZW50LnBhcmVudEVsZW1lbnQgOiBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHd5c2l3eWcgPSB0aGlzLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgdGhpcy5pc1d5c2l3eWdEaXYuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIHdoaWxlIChvZmZzZXRFbGVtZW50ICYmICF0aGlzLmhhc0NsYXNzKG9mZnNldEVsZW1lbnQsICdzZS1jb250YWluZXInKSAmJiBvZmZzZXRFbGVtZW50ICE9PSB3eXNpd3lnKSB7XHJcbiAgICAgICAgICAgIG9mZnNldExlZnQgKz0gb2Zmc2V0RWxlbWVudC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgICAgICBvZmZzZXRUb3AgKz0gb2Zmc2V0RWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQgPSBvZmZzZXRFbGVtZW50Lm9mZnNldFBhcmVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHd5c2l3eWdGcmFtZSAmJiAvaWZyYW1lL2kudGVzdCh3eXNpd3lnRnJhbWUubm9kZU5hbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0ICsgKGlmcmFtZSA/IHd5c2l3eWdGcmFtZS5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQgOiAwKSxcclxuICAgICAgICAgICAgdG9wOiAob2Zmc2V0VG9wIC0gKHd5c2l3eWcgPyB3eXNpd3lnLnNjcm9sbFRvcCA6IDApKSArIChpZnJhbWUgPyB3eXNpd3lnRnJhbWUucGFyZW50RWxlbWVudC5vZmZzZXRUb3AgOiAwKVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGNvbXBhcmVzIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4ZXMgb2YgXCJhXCIgYW5kIFwiYlwiIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3ZlcmxhcHBpbmcgaW5kZXhlcyBpbiB0aGUgcmFuZ2UuXHJcbiAgICAgKiBleCkgMSwgNSwgNCwgNiA9PiBcIjJcIiAoNCB+IDUpXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYVN0YXJ0IFN0YXJ0IGluZGV4IG9mIFwiYVwiXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYUVuZCBFbmQgaW5kZXggb2YgXCJhXCJcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBiU3RhcnQgU3RhcnQgaW5kZXggb2YgXCJiXCJcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBiRW5kIFN0YXJ0IGluZGV4IG9mIFwiYlwiXHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRPdmVybGFwUmFuZ2VBdEluZGV4OiBmdW5jdGlvbiAoYVN0YXJ0LCBhRW5kLCBiU3RhcnQsIGJFbmQpIHtcclxuICAgICAgICBpZiAoYVN0YXJ0IDw9IGJFbmQgPyBhRW5kIDwgYlN0YXJ0IDogYUVuZCA+IGJTdGFydCkgcmV0dXJuIDA7XHJcblxyXG4gICAgICAgIGNvbnN0IG92ZXJsYXAgPSAoYVN0YXJ0ID4gYlN0YXJ0ID8gYVN0YXJ0IDogYlN0YXJ0KSAtIChhRW5kIDwgYkVuZCA/IGFFbmQgOiBiRW5kKTtcclxuICAgICAgICByZXR1cm4gKG92ZXJsYXAgPCAwID8gb3ZlcmxhcCAqIC0xIDogb3ZlcmxhcCkgKyAxO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHRleHQgY29udGVudCB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgdmFsdWUgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IEVsZW1lbnQgdG8gcmVwbGFjZSB0ZXh0IGNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eHQgVGV4dCB0byBiZSBhcHBsaWVkXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZVR4dDogZnVuY3Rpb24gKGVsZW1lbnQsIHR4dCkge1xyXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHh0KSByZXR1cm47XHJcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHR4dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVwbGFjZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR9IG5ld0VsZW1lbnQgU3RyaW5nIG9yIGVsZW1lbnQgb2YgdGhlIG5ldyBlbGVtZW50IHRvIGFwcGx5XHJcbiAgICAgKi9cclxuICAgIGNoYW5nZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBuZXdFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdFbGVtZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5vdXRlckhUTUwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQub3V0ZXJIVE1MID0gbmV3RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgICAgICBkb2MuaW5uZXJIVE1MID0gbmV3RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBkb2MuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5ld0VsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCBzdHlsZSwgaWYgYWxsIHN0eWxlcyBhcmUgZGVsZXRlZCwgdGhlIHN0eWxlIHByb3BlcnRpZXMgYXJlIGRlbGV0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0byBzZXQgc3R5bGVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZU5hbWUgU3R5bGUgYXR0cmlidXRlIG5hbWUgKG1hcmdpbkxlZnQsIHRleHRBbGlnbi4uLilcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgU3R5bGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgc2V0U3R5bGU6IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICghdmFsdWUgJiYgIWVsZW1lbnQuc3R5bGUuY3NzVGV4dCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERldGVybWluZSB3aGV0aGVyIGFueSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50cyBhcmUgYXNzaWduZWQgdGhlIGdpdmVuIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudHMgdG8gc2VhcmNoIGNsYXNzIG5hbWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBzZWFyY2ggZm9yXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaGFzQ2xhc3M6IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgcmV0dXJuIChuZXcgdGhpcy5fdy5SZWdFeHAoY2xhc3NOYW1lKSkudGVzdChlbGVtZW50LmNsYXNzTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFwcGVuZCB0aGUgY2xhc3NOYW1lIHZhbHVlIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudHMgdG8gYWRkIGNsYXNzIG5hbWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBiZSBhZGRcclxuICAgICAqL1xyXG4gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgY2hlY2sgPSBuZXcgdGhpcy5fdy5SZWdFeHAoJyhcXFxcc3xeKScgKyBjbGFzc05hbWUgKyAnKFxcXFxzfCQpJyk7XHJcbiAgICAgICAgaWYgKGNoZWNrLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZS5sZW5ndGggPiAwID8gJyAnIDogJycpICsgY2xhc3NOYW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgdGhlIGNsYXNzTmFtZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgdmFsdWUgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnRzIHRvIHJlbW92ZSBjbGFzcyBuYW1lXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gYmUgcmVtb3ZlXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gbmV3IHRoaXMuX3cuUmVnRXhwKCcoXFxcXHN8XiknICsgY2xhc3NOYW1lICsgJyhcXFxcc3wkKScpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShjaGVjaywgJyAnKS50cmltKCk7XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudC5jbGFzc05hbWUudHJpbSgpKSBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQXJndW1lbnQgdmFsdWUgSWYgdGhlcmUgaXMgbm8gY2xhc3MgbmFtZSwgaW5zZXJ0IGl0IGFuZCBkZWxldGUgdGhlIGNsYXNzIG5hbWUgaWYgaXQgZXhpc3RzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudHMgdG8gcmVwbGFjZSBjbGFzcyBuYW1lXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gYmUgY2hhbmdlXHJcbiAgICAgKi9cclxuICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gbmV3IHRoaXMuX3cuUmVnRXhwKCcoXFxcXHN8XiknICsgY2xhc3NOYW1lICsgJyhcXFxcc3wkKScpO1xyXG4gICAgICAgIGlmIChjaGVjay50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoY2hlY2ssICcgJykudHJpbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTmFtZS50cmltKCkpIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJbiB0aGUgcHJlZGVmaW5lZCBjb2RlIHZpZXcgbW9kZSwgdGhlIGJ1dHRvbnMgZXhjZXB0IHRoZSBleGVjdXRhYmxlIGJ1dHRvbiBhcmUgY2hhbmdlZCB0byB0aGUgJ2Rpc2FibGVkJyBzdGF0ZS5cclxuICAgICAqIGNvcmUuY29kZVZpZXdEaXNhYmxlZEJ1dHRvbnMgKEFuIGFycmF5IG9mIGJ1dHRvbnMgd2hvc2UgY2xhc3MgbmFtZSBpcyBub3QgXCJzZS1jb2RlLXZpZXctZW5hYmxlZFwiKVxyXG4gICAgICogY29yZS5yZXNpemluZ0Rpc2FibGVkQnV0dG9ucyAoQW4gYXJyYXkgb2YgYnV0dG9ucyB3aG9zZSBjbGFzcyBuYW1lIGlzIG5vdCBcInNlLXJlc2l6aW5nLWVuYWJsZWRcIilcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgRGlzYWJsZWQgdmFsdWVcclxuICAgICAqIEBwYXJhbSB7QXJyYXl8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IGJ1dHRvbkxpc3QgQnV0dG9uIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHNldERpc2FibGVkQnV0dG9uczogZnVuY3Rpb24gKGRpc2FibGVkLCBidXR0b25MaXN0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGJ1dHRvbkxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgYnV0dG9uTGlzdFtpXS5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlIGFyZ3VtZW51IHZhbHVlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gaXRlbSBOb2RlIHRvIGJlIHJlbW92ZVxyXG4gICAgICovXHJcbiAgICByZW1vdmVJdGVtOiBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGl0ZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5wYXJlbnROb2RlKSBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgYWxsIHBhcmVudCBub2RlcyB0aGF0IG1hdGNoIHRoZSBjb25kaXRpb24uXHJcbiAgICAgKiBSZXR1cm5zIGFuIHtzYzogcHJldmlvdXNTaWJsaW5nLCBlYzogbmV4dFNpYmxpbmd9KHRoZSBkZWxldGVkIG5vZGUgcmVmZXJlbmNlKSBvciBudWxsLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBpdGVtIE5vZGUgdG8gYmUgcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHZhbGlkYXRpb24gVmFsaWRhdGlvbiBmdW5jdGlvbi4gZGVmYXVsdChEZWxldGVkIGlmIGl0IG9ubHkgaGF2ZSBicmVha0xpbmUgYW5kIGJsYW5rcylcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBzdG9wUGFyZW50IFN0b3Agd2hlbiB0aGUgcGFyZW50IG5vZGUgcmVhY2hlcyBzdG9wUGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IHtzYzogcHJldmlvdXNTaWJsaW5nLCBlYzogbmV4dFNpYmxpbmd9XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUl0ZW1BbGxQYXJlbnRzOiBmdW5jdGlvbiAoaXRlbSwgdmFsaWRhdGlvbiwgc3RvcFBhcmVudCkge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgbGV0IGNjID0gbnVsbDtcclxuICAgICAgICBpZiAoIXZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gc3RvcFBhcmVudCB8fCB0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gY3VycmVudC50ZXh0Q29udGVudC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPT09IDAgfHwgL14oXFxufFxcdTIwMEIpKyQvLnRlc3QodGV4dCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgdmFsaWRhdGlvbihlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNjID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYzogZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlYzogZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKHBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KGl0ZW0pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNjO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXRhY2ggTmVzdGVkIGFsbCBuZXN0ZWQgbGlzdHMgdW5kZXIgdGhlIFwiYmFzZU5vZGVcIi5cclxuICAgICAqIFJldHVybnMgYSBsaXN0IHdpdGggbmVzdGVkIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGJhc2VOb2RlIEVsZW1lbnQgb24gd2hpY2ggdG8gYmFzZS5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxsIElmIHRydWUsIGl0IGFsc28gZGV0YWNoIGFsbCBuZXN0ZWQgbGlzdHMgb2YgYSByZXR1cm5lZCBsaXN0LlxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGRldGFjaE5lc3RlZExpc3Q6IGZ1bmN0aW9uIChiYXNlTm9kZSwgYWxsKSB7XHJcbiAgICAgICAgY29uc3Qgck5vZGUgPSB0aGlzLl9kZWxldGVOZXN0ZWRMaXN0KGJhc2VOb2RlKTtcclxuICAgICAgICBsZXQgcmFuZ2VFbGVtZW50LCBjTm9kZXM7XHJcblxyXG4gICAgICAgIGlmIChyTm9kZSkge1xyXG4gICAgICAgICAgICByYW5nZUVsZW1lbnQgPSByTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjTm9kZXMgPSByTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0UG9zaXRpb25JbmRleChiYXNlTm9kZSk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjTm9kZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY05vZGVzW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYW5nZUVsZW1lbnQgPSBiYXNlTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHJDaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWFsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZXB0aCA9IHRoaXMuZ2V0RWxlbWVudERlcHRoKGJhc2VOb2RlKSArIDI7XHJcbiAgICAgICAgICAgIHJDaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuKGJhc2VOb2RlLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gdGhpcy5pc0xpc3RDZWxsKGN1cnJlbnQpICYmICFjdXJyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgdGhpcy5nZXRFbGVtZW50RGVwdGgoY3VycmVudCkgPT09IGRlcHRoOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJDaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuKHJhbmdlRWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIHRoaXMuaXNMaXN0Q2VsbChjdXJyZW50KSAmJiAhY3VycmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJDaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxldGVOZXN0ZWRMaXN0KHJDaGlsZHJlbltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChyTm9kZSkge1xyXG4gICAgICAgICAgICByTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYW5nZUVsZW1lbnQsIHJOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgaWYgKGNOb2RlcyAmJiBjTm9kZXMubGVuZ3RoID09PSAwKSB0aGlzLnJlbW92ZUl0ZW0ock5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlRWxlbWVudCA9PT0gYmFzZU5vZGUgPyByYW5nZUVsZW1lbnQucGFyZW50Tm9kZSA6IHJhbmdlRWxlbWVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU3ViIGZ1bmN0aW9uIG9mIHV0aWwuZGV0YWNoTmVzdGVkTGlzdCBtZXRob2QuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfZGVsZXRlTmVzdGVkTGlzdDogZnVuY3Rpb24gKGJhc2VOb2RlKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZVBhcmVudCA9IGJhc2VOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgbGV0IHNpYmxpbmcgPSBiYXNlUGFyZW50O1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSBzaWJsaW5nLnBhcmVudE5vZGU7XHJcbiAgICAgICAgbGV0IGxpU2libGluZywgbGlQYXJlbnQsIGNoaWxkLCBpbmRleCwgYztcclxuICAgICAgICBcclxuICAgICAgICB3aGlsZSAodGhpcy5pc0xpc3RDZWxsKHBhcmVudCkpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoYmFzZU5vZGUpO1xyXG4gICAgICAgICAgICBsaVNpYmxpbmcgPSBwYXJlbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICBsaVBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjaGlsZCA9IHNpYmxpbmc7XHJcbiAgICAgICAgICAgIHdoaWxlKGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdChjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY1tpbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlQYXJlbnQuaW5zZXJ0QmVmb3JlKGNbaW5kZXhdLCBsaVNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPT09IDApIHRoaXMucmVtb3ZlSXRlbShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpUGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNoaWxkID0gc2libGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzaWJsaW5nID0gbGlQYXJlbnQ7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IGxpUGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmFzZVBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHRoaXMucmVtb3ZlSXRlbShiYXNlUGFyZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpUGFyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTcGxpdCBhbGwgdGFncyBiYXNlZCBvbiBcImJhc2VOb2RlXCJcclxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgc3BsaXRlZCB0YWcuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGJhc2VOb2RlIEVsZW1lbnQgb3IgdGV4dCBub2RlIG9uIHdoaWNoIHRvIGJhc2VcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfG51bGx9IG9mZnNldCBUZXh0IG9mZnNldCBvZiBcImJhc2VOb2RlXCIgKE9ubHkgdmFsaWQgd2hlbiBcImJhc2VOb2RlXCIgaXMgYSB0ZXh0IG5vZGUpXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVwdGggVGhlIG5lc3RpbmcgZGVwdGggb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3BsaXQuIChkZWZhdWx0OiAwKVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIHNwbGl0RWxlbWVudDogZnVuY3Rpb24gKGJhc2VOb2RlLCBvZmZzZXQsIGRlcHRoKSB7XHJcbiAgICAgICAgY29uc3QgYnAgPSBiYXNlTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIGxldCBpbmRleCA9IDAsIG5ld0VsLCBjaGlsZHJlbiwgdGVtcDtcclxuICAgICAgICBsZXQgbmV4dCA9IHRydWU7XHJcbiAgICAgICAgaWYgKCFkZXB0aCB8fCBkZXB0aCA8IDApIGRlcHRoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGJhc2VOb2RlLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5nZXRQb3NpdGlvbkluZGV4KGJhc2VOb2RlKTtcclxuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBiYXNlTm9kZS5zcGxpdFRleHQob2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5nZXROb2RlRnJvbVBhdGgoW2luZGV4ICsgMV0sIGJwKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9ubHlaZXJvV2lkdGhTcGFjZShhZnRlcikpIGFmdGVyLmRhdGEgPSB0aGlzLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChiYXNlTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICBpZiAoIWJhc2VOb2RlLnByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RWxlbWVudERlcHRoKGJhc2VOb2RlKSA9PT0gZGVwdGgpIG5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJhc2VOb2RlID0gYmFzZU5vZGUucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGVwdGhFbCA9IGJhc2VOb2RlO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmdldEVsZW1lbnREZXB0aChkZXB0aEVsKSA+IGRlcHRoKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5nZXRQb3NpdGlvbkluZGV4KGRlcHRoRWwpICsgMTtcclxuICAgICAgICAgICAgZGVwdGhFbCA9IGRlcHRoRWwucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRlbXAgPSBuZXdFbDtcclxuICAgICAgICAgICAgbmV3RWwgPSBkZXB0aEVsLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gZGVwdGhFbC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdENlbGwobmV3RWwpICYmIHRoaXMuaXNMaXN0KHRlbXApICYmIHRlbXAuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSB0ZW1wLmZpcnN0RWxlbWVudENoaWxkLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0odGVtcC5maXJzdEVsZW1lbnRDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAuY2hpbGRyZW4ubGVuZ3RoID4gMCkgbmV3RWwuYXBwZW5kQ2hpbGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0VsLmFwcGVuZENoaWxkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5baW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdFbC5hcHBlbmRDaGlsZChjaGlsZHJlbltpbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGVwdGhFbC5jaGlsZE5vZGVzLmxlbmd0aCA8PSAxICYmICghZGVwdGhFbC5maXJzdENoaWxkIHx8IGRlcHRoRWwuZmlyc3RDaGlsZC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApKSBkZXB0aEVsLmlubmVySFRNTCA9ICc8YnI+JztcclxuXHJcbiAgICAgICAgY29uc3QgcEVsZW1lbnQgPSBkZXB0aEVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKG5leHQpIGRlcHRoRWwgPSBkZXB0aEVsLm5leHRTaWJsaW5nO1xyXG4gICAgICAgIGlmICghbmV3RWwpIHJldHVybiBkZXB0aEVsO1xyXG5cclxuICAgICAgICB0aGlzLm1lcmdlU2FtZVRhZ3MobmV3RWwsIG51bGwsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1lcmdlTmVzdGVkVGFncyhuZXdFbCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIHRoaXMuaXNMaXN0KGN1cnJlbnQpOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChuZXdFbC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHBFbGVtZW50Lmluc2VydEJlZm9yZShuZXdFbCwgZGVwdGhFbCk7XHJcbiAgICAgICAgZWxzZSBuZXdFbCA9IGRlcHRoRWw7XHJcblxyXG4gICAgICAgIGlmIChicC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5yZW1vdmVJdGVtKGJwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0VsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBVc2Ugd2l0aCBcIm5wZGVQYXRoICh1dGlsLmdldE5vZGVQYXRoKVwiIHRvIG1lcmdlIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYW5kIHRhZ3MgaWYgdGhleSBhcmUgcHJlc2VudCBhbmQgbW9kaWZ5IHRoZSBub2RlcGF0aC5cclxuICAgICAqIElmIFwib2Zmc2V0XCIgaGFzIGJlZW4gY2hhbmdlZCwgaXQgd2lsbCByZXR1cm4gYXMgbXVjaCBcIm9mZnNldFwiIGFzIGl0IGhhcyBiZWVuIG1vZGlmaWVkLlxyXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyBjaGFuZ2Ugb2Zmc2V0cyBpcyByZXR1cm5lZCBpbiB0aGUgb3JkZXIgb2YgdGhlIFwibm9kZVBhdGhBcnJheVwiIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gbm9kZVBhdGhBcnJheSBBcnJheSBvZiBOb2RlUGF0aCBvYmplY3QgKFt1dGlsLmdldE5vZGVQYXRoKCksIC4uXSlcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seVRleHQgSWYgdHJ1ZSwgbm9uLXRleHQgbm9kZXMoIXV0aWwuX2lzSWdub3JlTm9kZUNoYW5nZSkgbGlrZSAnc3BhbicsICdzdHJvbmcnLi4gYXJlIGlnbm9yZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFtvZmZzZXQsIC4uXVxyXG4gICAgICovXHJcbiAgICBtZXJnZVNhbWVUYWdzOiBmdW5jdGlvbiAoZWxlbWVudCwgbm9kZVBhdGhBcnJheSwgb25seVRleHQpIHtcclxuICAgICAgICBjb25zdCBpbnN0ID0gdGhpcztcclxuICAgICAgICBjb25zdCBub2RlUGF0aExlbiA9IG5vZGVQYXRoQXJyYXkgPyBub2RlUGF0aEFycmF5Lmxlbmd0aCA6IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldHMgPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChub2RlUGF0aExlbikge1xyXG4gICAgICAgICAgICBvZmZzZXRzID0gdGhpcy5fdy5BcnJheS5hcHBseShudWxsLCBuZXcgdGhpcy5fdy5BcnJheShub2RlUGF0aExlbikpLm1hcCh0aGlzLl93Lk51bWJlci5wcm90b3R5cGUudmFsdWVPZiwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBkZXB0aCwgZGVwdGhJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGgsIGNoaWxkLCBuZXh0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICBuZXh0ID0gY2hpbGRyZW5baSArIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBpZigob25seVRleHQgJiYgaW5zdC5faXNJZ25vcmVOb2RlQ2hhbmdlKGNoaWxkKSkgfHwgKCFvbmx5VGV4dCAmJiAoaW5zdC5pc1RhYmxlKGNoaWxkKSB8fCBpbnN0LmlzTGlzdENlbGwoY2hpbGQpIHx8IChpbnN0LmlzRm9ybWF0RWxlbWVudChjaGlsZCkgJiYgIWluc3QuaXNGcmVlRm9ybWF0RWxlbWVudChjaGlsZCkpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdC5pc1RhYmxlKGNoaWxkKSB8fCBpbnN0LmlzTGlzdENlbGwoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGRlcHRoICsgMSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSAmJiBjdXJyZW50Lm5vZGVOYW1lID09PSBjaGlsZC5ub2RlTmFtZSAmJiBjdXJyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbm9kZVBhdGhcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGgsIGMsIHAsIGNEZXB0aCwgc3BsaWNlRGVwdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbm9kZVBhdGhMZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5vZGVQYXRoQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAmJiBwYXRoW2RlcHRoXSA9PT0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjaGlsZCwgcCA9IGN1cnJlbnQsIGNEZXB0aCA9IGRlcHRoLCBzcGxpY2VEZXB0aCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNEZXB0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0LmdldEFycmF5SW5kZXgocC5jaGlsZE5vZGVzLCBjKSAhPT0gcGF0aFtjRGVwdGhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VEZXB0aCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNoaWxkLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBjLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNEZXB0aC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaWNlRGVwdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zcGxpY2UoZGVwdGgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoXSA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSB0YWdcclxuICAgICAgICAgICAgICAgICAgICBpbnN0LmNvcHlUYWdBdHRyaWJ1dGVzKGNoaWxkLCBjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0LnJlbW92ZUl0ZW0oY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGRlcHRoICsgMSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lID09PSBuZXh0Lm5vZGVOYW1lICYmIGluc3QuaXNTYW1lQXR0cmlidXRlcyhjaGlsZCwgbmV4dCkgJiYgY2hpbGQuaHJlZiA9PT0gbmV4dC5ocmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRzID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBuTGVuID0gY2hpbGRzLmxlbmd0aDsgbiA8IG5MZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRzW25dLnRleHRDb250ZW50Lmxlbmd0aCA+IDApIGNoaWxkTGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gY2hpbGQubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuZXh0LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0T2Zmc2V0ID0gbC5ub2RlVHlwZSA9PT0gMyAmJiByLm5vZGVUeXBlID09PSAzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRPZmZzZXQgPSBsLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBMID0gbC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHRlbXBMICYmIHRlbXBMLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPZmZzZXQgKz0gdGVtcEwudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEwgPSB0ZW1wTC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZExlbmd0aCA+IDAgJiYgbC5ub2RlVHlwZSA9PT0gMyAmJiByLm5vZGVUeXBlID09PSAzICYmIChsLnRleHRDb250ZW50Lmxlbmd0aCA+IDAgfHwgci50ZXh0Q29udGVudC5sZW5ndGggPiAwKSkgY2hpbGRMZW5ndGgtLTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlUGF0aExlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBub2RlUGF0aExlbjsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5vZGVQYXRoQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgcGF0aFtkZXB0aF0gPiBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcGF0aFtkZXB0aCAtIDFdICE9PSBkZXB0aEluZGV4KSBjb250aW51ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoXSAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFtkZXB0aCArIDFdID49IDAgJiYgcGF0aFtkZXB0aF0gPT09IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhbZGVwdGggKyAxXSArPSBjaGlsZExlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0T2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgbC5ub2RlVHlwZSA9PT0gMyAmJiByICYmIHIubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1tuXSArPSBhZGRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkT2Zmc2V0ID0gY2hpbGQudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50ZXh0Q29udGVudCArPSBuZXh0LnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbm9kZVBhdGhMZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBub2RlUGF0aEFycmF5W25dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGhbZGVwdGhdID4gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPiAwICYmIHBhdGhbZGVwdGggLSAxXSAhPT0gZGVwdGhJbmRleCkgY29udGludWU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFtkZXB0aF0gLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhbZGVwdGggKyAxXSA+PSAwICYmIHBhdGhbZGVwdGhdID09PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoICsgMV0gKz0gY2hpbGRMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW25dICs9IGFkZE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCArPSBuZXh0LmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdC5yZW1vdmVJdGVtKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBkZXB0aCArIDEsIGkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkoZWxlbWVudCwgMCwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvZmZzZXRzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgbmVzdGVkIHRhZ3Mgd2l0aG91dCBvdGhlciBjaGlsZCBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd8bnVsbH0gdmFsaWRhdGlvbiBWYWxpZGF0aW9uIGZ1bmN0aW9uIC8gU3RyaW5nKFwidGFnMXx0YWcyLi5cIikgLyBJZiBudWxsLCBhbGwgdGFncyBhcmUgYXBwbGljYWJsZS5cclxuICAgICAqL1xyXG4gICAgbWVyZ2VOZXN0ZWRUYWdzOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsaWRhdGlvbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiB0aGlzLnRlc3QoY3VycmVudC50YWdOYW1lKTsgfS5iaW5kKG5ldyB0aGlzLl93LlJlZ0V4cCgnXignICsgKHZhbGlkYXRpb24gPyB2YWxpZGF0aW9uIDogJy4rJykgKyAnKSQnLCAnaScpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWxpZGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGN1cnJlbnQuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgY2hpbGRyZW5bMF0ubm9kZU5hbWUgPT09IGN1cnJlbnQubm9kZU5hbWUgJiYgdmFsaWRhdGlvbihjdXJyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IGNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0ZW1wLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKHRlbXApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY3VycmVudC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjdXJyZW50LmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgYSBlbXB0eSBjaGlsZCBub2RlIG9mIGFyZ3VtZW50IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxudWxsfSBub3RSZW1vdmVOb2RlIERvIG5vdCByZW1vdmUgbm9kZVxyXG4gICAgICovXHJcbiAgICByZW1vdmVFbXB0eU5vZGU6IGZ1bmN0aW9uIChlbGVtZW50LCBub3RSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdCA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChub3RSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgIG5vdFJlbW92ZU5vZGUgPSBpbnN0LmdldFBhcmVudEVsZW1lbnQobm90UmVtb3ZlTm9kZSwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChpbnN0Ll9ub3RUZXh0Tm9kZShjdXJyZW50KSB8fCBjdXJyZW50ID09PSBub3RSZW1vdmVOb2RlIHx8IGluc3QuaXNOb25FZGl0YWJsZShjdXJyZW50KSkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBlbGVtZW50ICYmIGluc3Qub25seVplcm9XaWR0aFNwYWNlKGN1cnJlbnQudGV4dENvbnRlbnQpICYmICghY3VycmVudC5maXJzdENoaWxkIHx8ICFpbnN0LmlzQnJlYWsoY3VycmVudC5maXJzdENoaWxkKSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjdXJyZW50LmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aCwgciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5baSArIHJdIHx8IGluc3QuaXNDb21wb25lbnQoY2hpbGRyZW5baSArIHJdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgciArPSByZWN1cnNpb25GdW5jKGNoaWxkcmVuW2kgKyByXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgZWxlbWVudC5pbm5lckhUTUwgPSAnPGJyPic7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBpbiBIVE1MIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIEhUTUwgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBodG1sUmVtb3ZlV2hpdGVTcGFjZTogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICBpZiAoIWh0bWwpIHJldHVybiAnJztcclxuICAgICAgICByZXR1cm4gaHRtbC50cmltKCkucmVwbGFjZSgvPFxcLz8oPyFzdHJvbmd8c3Bhbnxmb250fGJ8dmFyfGl8ZW18dXxpbnN8c3xzdHJpa2V8ZGVsfHN1YnxzdXB8bWFya3xhfGxhYmVsfGNvZGUpW14+XjxdKz5cXHMrKD89PCkvaWcsIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnRyaW0oKTsgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNvcnQgYSBlbGVtZW50IGFycmF5IGJ5IGRlcHRoIG9mIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzIHRydWU6IGRlc2NlbmRpbmcgb3JkZXIgLyBmYWxzZTogYXNjZW5kaW5nIG9yZGVyXHJcbiAgICAgKi9cclxuICAgIHNvcnRCeURlcHRoOiBmdW5jdGlvbiAoYXJyYXksIGRlcykge1xyXG4gICAgICAgIGNvbnN0IHQgPSAhZGVzID8gLTEgOiAxO1xyXG4gICAgICAgIGNvbnN0IGYgPSB0ICogLTE7XHJcblxyXG4gICAgICAgIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlzdENlbGwoYSkgfHwgIXRoaXMuaXNMaXN0Q2VsbChiKSkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGEgPSB0aGlzLmdldEVsZW1lbnREZXB0aChhKTtcclxuICAgICAgICAgICAgYiA9IHRoaXMuZ2V0RWxlbWVudERlcHRoKGIpO1xyXG4gICAgICAgICAgICByZXR1cm4gYSA+IGIgPyB0IDogYSA8IGIgPyBmIDogMDtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlcyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgd2l0aG91dCBtb2RpZmljYXRpb24gd2hlbiBjaGFuZ2luZyB0ZXh0IG5vZGVzXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaXNJZ25vcmVOb2RlQ2hhbmdlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDMgJiYgKHRoaXMuaXNOb25FZGl0YWJsZShlbGVtZW50KSB8fCAhdGhpcy5pc1RleHRTdHlsZUVsZW1lbnQoZWxlbWVudCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlcyB0aGF0IG11c3QgcmVtYWluIHVuZGV0YWNoZWQgd2hlbiBjaGFuZ2luZyB0ZXh0IG5vZGVzIChBLCBMYWJlbCwgQ29kZSlcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaXNNYWludGFpbmVkTm9kZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAzICYmIC9eKGF8bGFiZWx8Y29kZSkkL2kudGVzdCh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogZWxlbWVudC5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE5vZGUgd2l0aCBmb250LXNpemUgc3R5bGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBFbGVtZW50IHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9pc1NpemVOb2RlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDMgJiYgdGhpcy5pc1RleHRTdHlsZUVsZW1lbnQoZWxlbWVudCkgJiYgISFlbGVtZW50LnN0eWxlLmZvbnRTaXplO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlcyB3aXRob3V0IHRleHRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBFbGVtZW50IHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9ub3RUZXh0Tm9kZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAzICYmICh0aGlzLmlzQ29tcG9uZW50KGVsZW1lbnQpIHx8IC9eKGJyfGlucHV0fHNlbGVjdHxjYW52YXN8aW1nfGlmcmFtZXxhdWRpb3x2aWRlbykkL2kudGVzdCh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogZWxlbWVudC5ub2RlTmFtZSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBkaXNhbGxvd2VkIHRhZ3NcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBFbGVtZW50IHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9kaXNhbGxvd2VkVGFnczogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gL14obWV0YXxzY3JpcHR8bGlua3xzdHlsZXxbYS16XStcXDpbYS16XSspJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSB3aGl0ZWxpc3QgUmVnRXhwIG9iamVjdC5cclxuICAgICAqIFJldHVybiBSZWdFeHAgZm9ybWF0OiBuZXcgUmVnRXhwKFwiPFxcXFwvP1xcXFxiKD8hXCIgKyBsaXN0ICsgXCIpXFxcXGJbXj5ePF0qKz5cIiwgXCJnaVwiKVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxpc3QgVGFncyBsaXN0IChcImJyfHB8ZGl2fHByZS4uLlwiKVxyXG4gICAgICogQHJldHVybnMge1JlZ0V4cH1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVGFnc1doaXRlbGlzdDogZnVuY3Rpb24gKGxpc3QpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnPFxcXFwvP1xcXFxiKD8hXFxcXGInICsgbGlzdC5yZXBsYWNlKC9cXHwvZywgJ1xcXFxifFxcXFxiJykgKyAnXFxcXGIpW14+XSo+JywgJ2dpJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBrZXkgb2YgdGhlIG9wdGlvbnMuYWxsb3dTdHlsZXNcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlXHJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2dldENoZWNrRm9ybWF0OiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzID8gJ251bGwnIDpcclxuICAgICAgICAgdGhpcy5pc0NvbXBvbmVudChub2RlKSA/ICdjb21wb25lbnQnIDpcclxuICAgICAgICAgdGhpcy5pc0Nsb3N1cmVGcmVlRm9ybWF0RWxlbWVudChub2RlKSA/ICdjbG9zdXJlRnJlZUZvcm1hdCcgOlxyXG4gICAgICAgICB0aGlzLmlzRnJlZUZvcm1hdEVsZW1lbnQobm9kZSkgPyAnZnJlZUZvcm1hdCcgOlxyXG4gICAgICAgICB0aGlzLmlzQ2xvc3VyZVJhbmdlRm9ybWF0RWxlbWVudChub2RlKSA/ICdjbG9zdXJlUmFuZ2VGb3JtYXQnIDpcclxuICAgICAgICAgdGhpcy5pc1JhbmdlRm9ybWF0RWxlbWVudChub2RlKSA/ICdyYW5nZUZvcm1hdCcgOlxyXG4gICAgICAgICB0aGlzLmlzRm9ybWF0RWxlbWVudChub2RlKSA/ICdmb3JtYXQnIDogbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGaXggdGFncyB0aGF0IGRvIG5vdCBmaXQgdGhlIGVkaXRvciBmb3JtYXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvY3VtZW50RnJhZ21lbnQgRG9jdW1lbnQgZnJhZ21lbnQgXCJET0NVTUVOVF9GUkFHTUVOVF9OT0RFXCIgKG5vZGVUeXBlID09PSAxMSlcclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBodG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAgRWRpdG9yIHRhZ3Mgd2hpdGVsaXN0IChjb3JlLl9odG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHApXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWxsb3dTdHlsZXMgb3B0aW9ucy5hbGxvd1N0eWxlc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2NvbnNpc3RlbmN5Q2hlY2tPZkhUTUw6IGZ1bmN0aW9uIChkb2N1bWVudEZyYWdtZW50LCBodG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAsIGFsbG93U3R5bGVzKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXQgaXMgY2FuIHVzZSBcIi5jaGlsZHJlbih1dGlsLmdldExpc3RDaGlsZHJlbilcIiB0byBleGNsdWRlIHRleHQgbm9kZXMsIGJ1dCBcImRvY3VtZW50RnJhZ21lbnQuY2hpbGRyZW5cIiBpcyBub3Qgc3VwcG9ydGVkIGluIElFLlxyXG4gICAgICAgICAqIFNvIGNoZWNrIHRoZSBub2RlIHR5cGUgYW5kIGV4Y2x1ZGUgdGhlIHRleHQgbm8gKGN1cnJlbnQubm9kZVR5cGUgIT09IDEpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlVGFncyA9IFtdLCBlbXB0eVRhZ3MgPSBbXSwgd3JvbmdMaXN0ID0gW10sIHdpdGhvdXRGb3JtYXRDZWxscyA9IFtdO1xyXG5cclxuICAgICAgICAvLyB3cm9uZyBwb3NpdGlvblxyXG4gICAgICAgIGNvbnN0IHdyb25nVGFncyA9IHRoaXMuZ2V0TGlzdENoaWxkTm9kZXMoZG9jdW1lbnRGcmFnbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIHdoaXRlIGxpc3RcclxuICAgICAgICAgICAgaWYgKCFodG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAudGVzdChjdXJyZW50Lm5vZGVOYW1lKSAmJiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwICYmIHRoaXMuaXNOb3RDaGVja2luZ05vZGUoY3VycmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZVRhZ3MucHVzaChjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbnJ0YWcgPSAhdGhpcy5nZXRQYXJlbnRFbGVtZW50KGN1cnJlbnQsIHRoaXMuaXNOb3RDaGVja2luZ05vZGUpO1xyXG4gICAgICAgICAgICAvLyBlbXB0eSB0YWdzXHJcbiAgICAgICAgICAgIGlmICgoIXRoaXMuaXNUYWJsZShjdXJyZW50KSAmJiAhdGhpcy5pc0xpc3RDZWxsKGN1cnJlbnQpKSAmJiAodGhpcy5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudCkgfHwgdGhpcy5pc1JhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50KSB8fCB0aGlzLmlzVGV4dFN0eWxlRWxlbWVudChjdXJyZW50KSkgJiYgY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCAmJiBucnRhZykge1xyXG4gICAgICAgICAgICAgICAgZW1wdHlUYWdzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHdyb25nIGxpc3RcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXN0KGN1cnJlbnQucGFyZW50Tm9kZSkgJiYgIXRoaXMuaXNMaXN0KGN1cnJlbnQpICYmICF0aGlzLmlzTGlzdENlbGwoY3VycmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHdyb25nTGlzdC5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB0YWJsZSBjZWxsc1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0NlbGwoY3VycmVudCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZlbCA9IGN1cnJlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JtYXRFbGVtZW50KGZlbCkgJiYgIXRoaXMuaXNSYW5nZUZvcm1hdEVsZW1lbnQoZmVsKSAmJiAhdGhpcy5pc0NvbXBvbmVudChmZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2l0aG91dEZvcm1hdENlbGxzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50LnBhcmVudE5vZGUgIT09IGRvY3VtZW50RnJhZ21lbnQgJiZcclxuICAgICAgICAgICAgICh0aGlzLmlzRm9ybWF0RWxlbWVudChjdXJyZW50KSB8fCB0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpIHx8IHRoaXMuaXNMaXN0KGN1cnJlbnQpKSAmJlxyXG4gICAgICAgICAgICAgIXRoaXMuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY3VycmVudC5wYXJlbnROb2RlKSAmJiAhdGhpcy5pc0xpc3RDZWxsKGN1cnJlbnQucGFyZW50Tm9kZSkgJiZcclxuICAgICAgICAgICAgICF0aGlzLmdldFBhcmVudEVsZW1lbnQoY3VycmVudCwgdGhpcy5pc0NvbXBvbmVudCkgJiYgbnJ0YWc7XHJcblxyXG4gICAgICAgICAgICAvLyBAdjNcclxuICAgICAgICAgICAgLy8gIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBzdHlsZXMgPSBhbGxvd1N0eWxlc1t0aGlzLl9nZXRDaGVja0Zvcm1hdChjdXJyZW50KV07XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoISFzdHlsZXMgJiYgc3R5bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsZXQgcyA9ICcnO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN1cnJlbnRTdHlsZSA9IGN1cnJlbnQuc3R5bGU7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0eWxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzICs9IHN0eWxlc1tpXSArICc6JyArIGN1cnJlbnRTdHlsZVtzdHlsZXNbaV1dICsgJzsgJztcclxuICAgICAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKCFzKSBjdXJyZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICBlbHNlIGN1cnJlbnQuc3R5bGUuY3NzVGV4dCA9IHM7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZW1vdmVUYWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShyZW1vdmVUYWdzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2hlY2tUYWdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHdyb25nVGFncy5sZW5ndGgsIHQsIHA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0ID0gd3JvbmdUYWdzW2ldO1xyXG4gICAgICAgICAgICBwID0gdC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBpZiAoIXAgfHwgIXAucGFyZW50Tm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHAucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCwgcCk7XHJcbiAgICAgICAgICAgIGNoZWNrVGFncy5wdXNoKHApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoZWNrVGFncy5sZW5ndGgsIHQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0ID0gY2hlY2tUYWdzW2ldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbmx5WmVyb1dpZHRoU3BhY2UodC50ZXh0Q29udGVudC50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0odCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBlbXB0eVRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGVtcHR5VGFnc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gd3JvbmdMaXN0Lmxlbmd0aCwgdCwgdHAsIGNoaWxkcmVuLCBwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdCA9IHdyb25nTGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIHRwID0gdGhpcy5jcmVhdGVFbGVtZW50KCdMSScpO1xyXG4gICAgICAgICAgICBjaGlsZHJlbiA9IHQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICB0cC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHAgPSB0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGlmICghcCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHAuaW5zZXJ0QmVmb3JlKHRwLCB0KTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHdpdGhvdXRGb3JtYXRDZWxscy5sZW5ndGgsIHQsIGY7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0ID0gd2l0aG91dEZvcm1hdENlbGxzW2ldO1xyXG4gICAgICAgICAgICBmID0gdGhpcy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgZi5pbm5lckhUTUwgPSAodC50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID09PSAwICYmIHQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSA/ICc8YnI+JyA6IHQuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB0LmlubmVySFRNTCA9IGYub3V0ZXJIVE1MO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3NldERlZmF1bHRPcHRpb25TdHlsZTogZnVuY3Rpb24gKG9wdGlvbnMsIGRlZmF1bHRTdHlsZSkge1xyXG4gICAgICAgIGxldCBvcHRpb25TdHlsZSA9ICcnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmhlaWdodCkgb3B0aW9uU3R5bGUgKz0gJ2hlaWdodDonICsgb3B0aW9ucy5oZWlnaHQgKyAnOyc7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubWluSGVpZ2h0KSBvcHRpb25TdHlsZSArPSAnbWluLWhlaWdodDonICsgb3B0aW9ucy5taW5IZWlnaHQgKyAnOyc7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4SGVpZ2h0KSBvcHRpb25TdHlsZSArPSAnbWF4LWhlaWdodDonICsgb3B0aW9ucy5tYXhIZWlnaHQgKyAnOyc7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24pIG9wdGlvblN0eWxlICs9ICdwb3NpdGlvbjonICsgb3B0aW9ucy5wb3NpdGlvbiArICc7JztcclxuICAgICAgICBpZiAob3B0aW9ucy53aWR0aCkgb3B0aW9uU3R5bGUgKz0gJ3dpZHRoOicgKyBvcHRpb25zLndpZHRoICsgJzsnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLm1pbldpZHRoKSBvcHRpb25TdHlsZSArPSAnbWluLXdpZHRoOicgKyBvcHRpb25zLm1pbldpZHRoICsgJzsnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLm1heFdpZHRoKSBvcHRpb25TdHlsZSArPSAnbWF4LXdpZHRoOicgKyBvcHRpb25zLm1heFdpZHRoICsgJzsnO1xyXG5cclxuICAgICAgICBsZXQgdG9wID0gJycsIGZyYW1lID0gJycsIGVkaXRvciA9ICcnO1xyXG4gICAgICAgIGRlZmF1bHRTdHlsZSA9IG9wdGlvblN0eWxlICsgZGVmYXVsdFN0eWxlO1xyXG4gICAgICAgIGNvbnN0IHN0eWxlQXJyID0gZGVmYXVsdFN0eWxlLnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0eWxlQXJyLmxlbmd0aCwgczsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBzdHlsZUFycltpXS50cmltKCk7XHJcbiAgICAgICAgICAgIGlmICghcykgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmICgvXihtaW4tfG1heC0pP3dpZHRoXFxzKjovLnRlc3QocykpIHtcclxuICAgICAgICAgICAgICAgIHRvcCArPSBzICsgJzsnO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKC9eKG1pbi18bWF4LSk/aGVpZ2h0XFxzKjovLnRlc3QocykpIHtcclxuICAgICAgICAgICAgICAgIGlmICgvXmhlaWdodC8udGVzdChzKSAmJiBzLnNwbGl0KCc6JylbMV0udHJpbSgpID09PSAnYXV0bycpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZyYW1lICs9IHMgKyAnOyc7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlZGl0b3IgKz0gcyArICc7JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvcDogdG9wLFxyXG4gICAgICAgICAgICBmcmFtZTogZnJhbWUsXHJcbiAgICAgICAgICAgIGVkaXRvcjogZWRpdG9yXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldElmcmFtZURvY3VtZW50OiBmdW5jdGlvbiAoZnJhbWUsIG9wdGlvbnMpIHtcclxuICAgICAgICBmcmFtZS5zZXRBdHRyaWJ1dGUoJ3Njcm9sbGluZycsICdhdXRvJyk7XHJcbiAgICAgICAgZnJhbWUuY29udGVudERvY3VtZW50LmhlYWQuaW5uZXJIVE1MID0gJycgK1xyXG4gICAgICAgICAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nICtcclxuICAgICAgICAgICAgJzxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPicgK1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRJZnJhbWVDc3NUYWdzKG9wdGlvbnMpO1xyXG4gICAgICAgIGZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3M7XHJcbiAgICAgICAgZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldElmcmFtZUNzc1RhZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgbGlua05hbWVzID0gb3B0aW9ucy5pZnJhbWVDU1NGaWxlTmFtZTtcclxuICAgICAgICBjb25zdCB3UmVnRXhwID0gdGhpcy5fdy5SZWdFeHA7XHJcbiAgICAgICAgbGV0IHRhZ1N0cmluZyA9ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBmID0gMCwgbGVuID0gbGlua05hbWVzLmxlbmd0aCwgcGF0aDsgZiA8IGxlbjsgZisrKSB7XHJcbiAgICAgICAgICAgIHBhdGggPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICgvKF5odHRwcz86XFwvXFwvKXwoXmRhdGE6dGV4dFxcL2NzcywpLy50ZXN0KGxpbmtOYW1lc1tmXSkpIHtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChsaW5rTmFtZXNbZl0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgQ1NTRmlsZU5hbWUgPSBuZXcgd1JlZ0V4cCgnKF58LipbXFxcXC9dKScgKyBsaW5rTmFtZXNbZl0gKyAnKFxcXFwuLispP1xcXFwuY3NzKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaW5rJyksIGkgPSAwLCBsZW4gPSBjLmxlbmd0aCwgc3R5bGVUYWc7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlVGFnID0gY1tpXS5ocmVmLm1hdGNoKENTU0ZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVUYWcpIHBhdGgucHVzaChzdHlsZVRhZ1swXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkgdGhyb3cgJ1tTVU5FRElUT1IuY29uc3RydWN0b3IuaWZyYW1lLmZhaWxdIFRoZSBzdW5lZGl0b3IgQ1NTIGZpbGVzIGluc3RhbGxhdGlvbiBwYXRoIGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiBQbGVhc2Ugc2V0IHRoZSBvcHRpb24gcHJvcGVydHkgXCJpZnJhbWVDU1NGaWxlTmFtZVwiIGJlZm9yZSBjcmVhdGluZyBlZGl0b3IgaW5zdGFuY2VzLic7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGFnU3RyaW5nICs9ICc8bGluayBocmVmPVwiJyArIHBhdGhbaV0gKyAnXCIgcmVsPVwic3R5bGVzaGVldFwiPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0YWdTdHJpbmcgKyAob3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyA/ICc8c3R5bGU+XFxuLyoqIElmcmFtZSBoZWlnaHQgYXV0byAqL1xcbmJvZHl7aGVpZ2h0OiBtaW4tY29udGVudDsgb3ZlcmZsb3c6IGhpZGRlbjt9XFxuPC9zdHlsZT4nIDogJycpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXRpbDsiLCIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IF9pY29ucyBmcm9tICcuLi9hc3NldHMvZGVmYXVsdEljb25zJztcclxuaW1wb3J0IF9kZWZhdWx0TGFuZyBmcm9tICcuLi9sYW5nL2VuJztcclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGRvY3VtZW50IGNyZWF0ZVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRleHRhcmVhXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgZG9jID0gZG9jdW1lbnQ7XHJcblxyXG4gICAgICAgIC8qKiAtLS0gaW5pdCBvcHRpb25zIC0tLSAqL1xyXG4gICAgICAgIHRoaXMuX2luaXRPcHRpb25zKGVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgXHJcbiAgICAgICAgLy8gc3VuZWRpdG9yIGRpdlxyXG4gICAgICAgIGNvbnN0IHRvcF9kaXYgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgdG9wX2Rpdi5jbGFzc05hbWUgPSAnc3VuLWVkaXRvcicgKyAob3B0aW9ucy5ydGwgPyAnIHNlLXJ0bCcgOiAnJyk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHRvcF9kaXYuaWQgPSAnc3VuZWRpdG9yXycgKyBlbGVtZW50LmlkO1xyXG4gICAgXHJcbiAgICAgICAgLy8gcmVsYXRpdmUgZGl2XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmUgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgcmVsYXRpdmUuY2xhc3NOYW1lID0gJ3NlLWNvbnRhaW5lcic7XHJcbiAgICBcclxuICAgICAgICAvLyB0b29sYmFyXHJcbiAgICAgICAgY29uc3QgdG9vbF9iYXIgPSB0aGlzLl9jcmVhdGVUb29sQmFyKGRvYywgb3B0aW9ucy5idXR0b25MaXN0LCBvcHRpb25zLnBsdWdpbnMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRvb2xfYmFyLmVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgIGlmICh0b29sX2Jhci5wbHVnaW5DYWxsQnV0dG9ucy5tYXRoKSB0aGlzLl9jaGVja0thdGV4TWF0aChvcHRpb25zLmthdGV4KTtcclxuICAgICAgICBjb25zdCBhcnJvdyA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBhcnJvdy5jbGFzc05hbWUgPSAnc2UtYXJyb3cnO1xyXG5cclxuICAgICAgICAvLyBzdGlja3kgdG9vbGJhciBkdW1teVxyXG4gICAgICAgIGNvbnN0IHN0aWNreV9kdW1teSA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBzdGlja3lfZHVtbXkuY2xhc3NOYW1lID0gJ3NlLXRvb2xiYXItc3RpY2t5LWR1bW15JztcclxuICAgIFxyXG4gICAgICAgIC8vIGlubmVyIGVkaXRvciBkaXZcclxuICAgICAgICBjb25zdCBlZGl0b3JfZGl2ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIGVkaXRvcl9kaXYuY2xhc3NOYW1lID0gJ3NlLXdyYXBwZXInO1xyXG5cclxuICAgICAgICAvKiogLS0tIGluaXQgZWxlbWVudHMgYW5kIGNyZWF0ZSBib3R0b20gYmFyIC0tLSAqL1xyXG4gICAgICAgIGNvbnN0IGluaXRFbGVtZW50cyA9IHRoaXMuX2luaXRFbGVtZW50cyhvcHRpb25zLCB0b3BfZGl2LCB0b29sX2Jhci5lbGVtZW50LCBhcnJvdyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvdHRvbUJhciA9IGluaXRFbGVtZW50cy5ib3R0b21CYXI7XHJcbiAgICAgICAgY29uc3Qgd3lzaXd5Z19kaXYgPSBpbml0RWxlbWVudHMud3lzaXd5Z0ZyYW1lO1xyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyX3NwYW4gPSBpbml0RWxlbWVudHMucGxhY2Vob2xkZXI7XHJcbiAgICAgICAgbGV0IHRleHRhcmVhID0gaW5pdEVsZW1lbnRzLmNvZGVWaWV3O1xyXG5cclxuICAgICAgICAvLyByZXNpemluZyBiYXJcclxuICAgICAgICBjb25zdCByZXNpemluZ19iYXIgPSBib3R0b21CYXIucmVzaXppbmdCYXI7XHJcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbiA9IGJvdHRvbUJhci5uYXZpZ2F0aW9uO1xyXG4gICAgICAgIGNvbnN0IGNoYXJfd3JhcHBlciA9IGJvdHRvbUJhci5jaGFyV3JhcHBlcjtcclxuICAgICAgICBjb25zdCBjaGFyX2NvdW50ZXIgPSBib3R0b21CYXIuY2hhckNvdW50ZXI7XHJcbiAgICBcclxuICAgICAgICAvLyBsb2FkaW5nIGJveFxyXG4gICAgICAgIGNvbnN0IGxvYWRpbmdfYm94ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIGxvYWRpbmdfYm94LmNsYXNzTmFtZSA9ICdzZS1sb2FkaW5nLWJveCBzdW4tZWRpdG9yLWNvbW1vbic7XHJcbiAgICAgICAgbG9hZGluZ19ib3guaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJzZS1sb2FkaW5nLWVmZmVjdFwiPjwvZGl2Pic7XHJcblxyXG4gICAgICAgIC8vIGVudGVyIGxpbmVcclxuICAgICAgICBjb25zdCBsaW5lX2JyZWFrZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgbGluZV9icmVha2VyLmNsYXNzTmFtZSA9ICdzZS1saW5lLWJyZWFrZXInO1xyXG4gICAgICAgIGxpbmVfYnJlYWtlci5pbm5lckhUTUwgPSAnPGJ1dHRvbiBjbGFzcz1cInNlLWJ0blwiPicgKyBvcHRpb25zLmljb25zLmxpbmVfYnJlYWsgKyAnPC9idXR0b24+JztcclxuICAgICAgICBjb25zdCBsaW5lX2JyZWFrZXJfdCA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBsaW5lX2JyZWFrZXJfdC5jbGFzc05hbWUgKz0gJ3NlLWxpbmUtYnJlYWtlci1jb21wb25lbnQnO1xyXG4gICAgICAgIGNvbnN0IGxpbmVfYnJlYWtlcl9iID0gbGluZV9icmVha2VyX3QuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgIGxpbmVfYnJlYWtlcl90LmlubmVySFRNTCA9IGxpbmVfYnJlYWtlcl9iLmlubmVySFRNTCA9IG9wdGlvbnMuaWNvbnMubGluZV9icmVhaztcclxuICAgIFxyXG4gICAgICAgIC8vIHJlc2l6ZSBvcGVyYXRpb24gYmFja2dyb3VuZFxyXG4gICAgICAgIGNvbnN0IHJlc2l6ZV9iYWNrID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIHJlc2l6ZV9iYWNrLmNsYXNzTmFtZSA9ICdzZS1yZXNpemluZy1iYWNrJztcclxuXHJcbiAgICAgICAgLy8gdG9vbGJhciBjb250YWluZXJcclxuICAgICAgICBjb25zdCB0b29sYmFyQ29udGFpbmVyID0gb3B0aW9ucy50b29sYmFyQ29udGFpbmVyO1xyXG4gICAgICAgIGlmICh0b29sYmFyQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRvb2xiYXJDb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbF9iYXIuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXHJcbiAgICAgICAgZWRpdG9yX2Rpdi5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7XHJcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyX3NwYW4pIGVkaXRvcl9kaXYuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJfc3Bhbik7XHJcbiAgICAgICAgaWYgKCF0b29sYmFyQ29udGFpbmVyKSByZWxhdGl2ZS5hcHBlbmRDaGlsZCh0b29sX2Jhci5lbGVtZW50KTtcclxuICAgICAgICByZWxhdGl2ZS5hcHBlbmRDaGlsZChzdGlja3lfZHVtbXkpO1xyXG4gICAgICAgIHJlbGF0aXZlLmFwcGVuZENoaWxkKGVkaXRvcl9kaXYpO1xyXG4gICAgICAgIHJlbGF0aXZlLmFwcGVuZENoaWxkKHJlc2l6ZV9iYWNrKTtcclxuICAgICAgICByZWxhdGl2ZS5hcHBlbmRDaGlsZChsb2FkaW5nX2JveCk7XHJcbiAgICAgICAgcmVsYXRpdmUuYXBwZW5kQ2hpbGQobGluZV9icmVha2VyKTtcclxuICAgICAgICByZWxhdGl2ZS5hcHBlbmRDaGlsZChsaW5lX2JyZWFrZXJfdCk7XHJcbiAgICAgICAgcmVsYXRpdmUuYXBwZW5kQ2hpbGQobGluZV9icmVha2VyX2IpO1xyXG4gICAgICAgIGlmIChyZXNpemluZ19iYXIpIHJlbGF0aXZlLmFwcGVuZENoaWxkKHJlc2l6aW5nX2Jhcik7XHJcbiAgICAgICAgdG9wX2Rpdi5hcHBlbmRDaGlsZChyZWxhdGl2ZSk7XHJcblxyXG4gICAgICAgIHRleHRhcmVhID0gdGhpcy5fY2hlY2tDb2RlTWlycm9yKG9wdGlvbnMsIHRleHRhcmVhKTtcclxuICAgIFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdGVkOiB7XHJcbiAgICAgICAgICAgICAgICBfdG9wOiB0b3BfZGl2LFxyXG4gICAgICAgICAgICAgICAgX3JlbGF0aXZlOiByZWxhdGl2ZSxcclxuICAgICAgICAgICAgICAgIF90b29sQmFyOiB0b29sX2Jhci5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgX21lbnVUcmF5OiB0b29sX2Jhci5fbWVudVRyYXksXHJcbiAgICAgICAgICAgICAgICBfZWRpdG9yQXJlYTogZWRpdG9yX2RpdixcclxuICAgICAgICAgICAgICAgIF93eXNpd3lnQXJlYTogd3lzaXd5Z19kaXYsXHJcbiAgICAgICAgICAgICAgICBfY29kZUFyZWE6IHRleHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcl9zcGFuLFxyXG4gICAgICAgICAgICAgICAgX3Jlc2l6aW5nQmFyOiByZXNpemluZ19iYXIsXHJcbiAgICAgICAgICAgICAgICBfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcclxuICAgICAgICAgICAgICAgIF9jaGFyV3JhcHBlcjogY2hhcl93cmFwcGVyLFxyXG4gICAgICAgICAgICAgICAgX2NoYXJDb3VudGVyOiBjaGFyX2NvdW50ZXIsXHJcbiAgICAgICAgICAgICAgICBfbG9hZGluZzogbG9hZGluZ19ib3gsXHJcbiAgICAgICAgICAgICAgICBfbGluZUJyZWFrZXI6IGxpbmVfYnJlYWtlcixcclxuICAgICAgICAgICAgICAgIF9saW5lQnJlYWtlcl90OiBsaW5lX2JyZWFrZXJfdCxcclxuICAgICAgICAgICAgICAgIF9saW5lQnJlYWtlcl9iOiBsaW5lX2JyZWFrZXJfYixcclxuICAgICAgICAgICAgICAgIF9yZXNpemVCYWNrOiByZXNpemVfYmFjayxcclxuICAgICAgICAgICAgICAgIF9zdGlja3lEdW1teTogc3RpY2t5X2R1bW15LFxyXG4gICAgICAgICAgICAgICAgX2Fycm93OiBhcnJvd1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxyXG4gICAgICAgICAgICBwbHVnaW5zOiB0b29sX2Jhci5wbHVnaW5zLFxyXG4gICAgICAgICAgICBwbHVnaW5DYWxsQnV0dG9uczogdG9vbF9iYXIucGx1Z2luQ2FsbEJ1dHRvbnMsXHJcbiAgICAgICAgICAgIF9yZXNwb25zaXZlQnV0dG9uczogdG9vbF9iYXIucmVzcG9uc2l2ZUJ1dHRvbnNcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgQ29kZU1pcnJvciBvcHRpb24gdG8gYXBwbHkgdGhlIENvZGVNaXJyb3IgYW5kIHJldHVybiB0aGUgQ29kZU1pcnJvciBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0ZXh0YXJlYSB0ZXh0YXJlYSBlbGVtZW50XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfY2hlY2tDb2RlTWlycm9yOiBmdW5jdGlvbiAob3B0aW9ucywgdGV4dGFyZWEpIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5jb2RlTWlycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNtT3B0aW9ucyA9IFt7XHJcbiAgICAgICAgICAgICAgICBtb2RlOiAnaHRtbG1peGVkJyxcclxuICAgICAgICAgICAgICAgIGh0bWxNb2RlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBsaW5lV3JhcHBpbmc6IHRydWVcclxuICAgICAgICAgICAgfSwgKG9wdGlvbnMuY29kZU1pcnJvci5vcHRpb25zIHx8IHt9KV0ucmVkdWNlKGZ1bmN0aW9uIChpbml0LCBvcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNPd24ob3B0aW9uLCBrZXkpKSBpbml0W2tleV0gPSBvcHRpb25ba2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBpbml0O1xyXG4gICAgICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJykge1xyXG4gICAgICAgICAgICAgICAgY21PcHRpb25zLnZpZXdwb3J0TWFyZ2luID0gSW5maW5pdHk7XHJcbiAgICAgICAgICAgICAgICBjbU9wdGlvbnMuaGVpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjbSA9IG9wdGlvbnMuY29kZU1pcnJvci5zcmMuZnJvbVRleHRBcmVhKHRleHRhcmVhLCBjbU9wdGlvbnMpO1xyXG4gICAgICAgICAgICBjbS5kaXNwbGF5LndyYXBwZXIuc3R5bGUuY3NzVGV4dCA9IHRleHRhcmVhLnN0eWxlLmNzc1RleHQ7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IgPSBjbTtcclxuICAgICAgICAgICAgdGV4dGFyZWEgPSBjbS5kaXNwbGF5LndyYXBwZXI7XHJcbiAgICAgICAgICAgIHRleHRhcmVhLmNsYXNzTmFtZSArPSAnIHNlLXdyYXBwZXItY29kZS1taXJyb3InO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHRhcmVhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBmb3IgYSBrYXRleCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2F0ZXgga2F0ZXggb2JqZWN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfY2hlY2tLYXRleE1hdGg6IGZ1bmN0aW9uIChrYXRleCkge1xyXG4gICAgICAgIGlmICgha2F0ZXgpIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNyZWF0ZS5mYWlsXSBUbyB1c2UgdGhlIG1hdGggYnV0dG9uIHlvdSBuZWVkIHRvIGFkZCBhIFwia2F0ZXhcIiBvYmplY3QgdG8gdGhlIG9wdGlvbnMuJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGthdGV4T3B0aW9ucyA9IFt7XHJcbiAgICAgICAgICAgIHRocm93T25FcnJvcjogZmFsc2UsXHJcbiAgICAgICAgfSwgKGthdGV4Lm9wdGlvbnMgfHwge30pXS5yZWR1Y2UoZnVuY3Rpb24gKGluaXQsIG9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gb3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNPd24ob3B0aW9uLCBrZXkpKSBpbml0W2tleV0gPSBvcHRpb25ba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaW5pdDtcclxuICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICAgIGthdGV4Lm9wdGlvbnMgPSBrYXRleE9wdGlvbnM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBvciByZXNldCBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVyZ2VPcHRpb25zIE5ldyBvcHRpb25zIHByb3BlcnR5XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBDb250ZXh0IG9iamVjdCBvZiBjb3JlXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luT3B0aW9ucyBPcmlnaW4gb3B0aW9uc1xyXG4gICAgICogQHJldHVybnMge09iamVjdH0gcGx1Z2luQ2FsbEJ1dHRvbnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9zZXRPcHRpb25zOiBmdW5jdGlvbiAobWVyZ2VPcHRpb25zLCBjb250ZXh0LCBvcmlnaW5PcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5faW5pdE9wdGlvbnMoY29udGV4dC5lbGVtZW50Lm9yaWdpbkVsZW1lbnQsIG1lcmdlT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlID0gZWwucmVsYXRpdmU7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yQXJlYSA9IGVsLmVkaXRvckFyZWE7XHJcbiAgICAgICAgY29uc3QgaXNOZXdUb29sYmFyQ29udGFpbmVyID0gbWVyZ2VPcHRpb25zLnRvb2xiYXJDb250YWluZXIgJiYgbWVyZ2VPcHRpb25zLnRvb2xiYXJDb250YWluZXIgIT09IG9yaWdpbk9wdGlvbnMudG9vbGJhckNvbnRhaW5lcjtcclxuICAgICAgICBjb25zdCBpc05ld1Rvb2xiYXIgPSBtZXJnZU9wdGlvbnMuYnV0dG9uTGlzdCAhPT0gb3JpZ2luT3B0aW9ucy5idXR0b25MaXN0IHx8IG1lcmdlT3B0aW9ucy5tb2RlICE9PSBvcmlnaW5PcHRpb25zLm1vZGUgfHwgaXNOZXdUb29sYmFyQ29udGFpbmVyO1xyXG5cclxuICAgICAgICBjb25zdCB0b29sX2JhciA9IHRoaXMuX2NyZWF0ZVRvb2xCYXIoZG9jdW1lbnQsIChpc05ld1Rvb2xiYXIgPyBtZXJnZU9wdGlvbnMuYnV0dG9uTGlzdCA6IG9yaWdpbk9wdGlvbnMuYnV0dG9uTGlzdCksIG1lcmdlT3B0aW9ucy5wbHVnaW5zLCBtZXJnZU9wdGlvbnMpO1xyXG4gICAgICAgIGlmICh0b29sX2Jhci5wbHVnaW5DYWxsQnV0dG9ucy5tYXRoKSB0aGlzLl9jaGVja0thdGV4TWF0aChtZXJnZU9wdGlvbnMua2F0ZXgpO1xyXG4gICAgICAgIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgYXJyb3cuY2xhc3NOYW1lID0gJ3NlLWFycm93JztcclxuXHJcbiAgICAgICAgaWYgKGlzTmV3VG9vbGJhcikge1xyXG4gICAgICAgICAgICB0b29sX2Jhci5lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgLy8gdG9vbGJhciBjb250YWluZXJcclxuICAgICAgICAgICAgaWYgKGlzTmV3VG9vbGJhckNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgbWVyZ2VPcHRpb25zLnRvb2xiYXJDb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbF9iYXIuZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBlbC50b29sYmFyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWwudG9vbGJhcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbC50b29sYmFyLnBhcmVudEVsZW1lbnQucmVwbGFjZUNoaWxkKHRvb2xfYmFyLmVsZW1lbnQsIGVsLnRvb2xiYXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbC50b29sYmFyID0gdG9vbF9iYXIuZWxlbWVudDtcclxuICAgICAgICAgICAgZWwuX21lbnVUcmF5ID0gdG9vbF9iYXIuX21lbnVUcmF5O1xyXG4gICAgICAgICAgICBlbC5fYXJyb3cgPSBhcnJvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaW5pdEVsZW1lbnRzID0gdGhpcy5faW5pdEVsZW1lbnRzKG1lcmdlT3B0aW9ucywgZWwudG9wQXJlYSwgKGlzTmV3VG9vbGJhciA/IHRvb2xfYmFyLmVsZW1lbnQgOiBlbC50b29sYmFyKSwgYXJyb3cpO1xyXG5cclxuICAgICAgICBjb25zdCBib3R0b21CYXIgPSBpbml0RWxlbWVudHMuYm90dG9tQmFyO1xyXG4gICAgICAgIGNvbnN0IHd5c2l3eWdGcmFtZSA9IGluaXRFbGVtZW50cy53eXNpd3lnRnJhbWU7XHJcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJfc3BhbiA9IGluaXRFbGVtZW50cy5wbGFjZWhvbGRlcjtcclxuICAgICAgICBsZXQgY29kZSA9IGluaXRFbGVtZW50cy5jb2RlVmlldztcclxuXHJcbiAgICAgICAgaWYgKGVsLnJlc2l6aW5nQmFyKSByZWxhdGl2ZS5yZW1vdmVDaGlsZChlbC5yZXNpemluZ0Jhcik7XHJcbiAgICAgICAgaWYgKGJvdHRvbUJhci5yZXNpemluZ0JhcikgcmVsYXRpdmUuYXBwZW5kQ2hpbGQoYm90dG9tQmFyLnJlc2l6aW5nQmFyKTtcclxuXHJcbiAgICAgICAgZWRpdG9yQXJlYS5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICBlZGl0b3JBcmVhLmFwcGVuZENoaWxkKGNvZGUpO1xyXG4gICAgICAgIGlmIChwbGFjZWhvbGRlcl9zcGFuKSBlZGl0b3JBcmVhLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyX3NwYW4pO1xyXG5cclxuICAgICAgICBjb2RlID0gdGhpcy5fY2hlY2tDb2RlTWlycm9yKG1lcmdlT3B0aW9ucywgY29kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZWwucmVzaXppbmdCYXIgPSBib3R0b21CYXIucmVzaXppbmdCYXI7XHJcbiAgICAgICAgZWwubmF2aWdhdGlvbiA9IGJvdHRvbUJhci5uYXZpZ2F0aW9uO1xyXG4gICAgICAgIGVsLmNoYXJXcmFwcGVyID0gYm90dG9tQmFyLmNoYXJXcmFwcGVyO1xyXG4gICAgICAgIGVsLmNoYXJDb3VudGVyID0gYm90dG9tQmFyLmNoYXJDb3VudGVyO1xyXG4gICAgICAgIGVsLnd5c2l3eWdGcmFtZSA9IHd5c2l3eWdGcmFtZTtcclxuICAgICAgICBlbC5jb2RlID0gY29kZTtcclxuICAgICAgICBlbC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyX3NwYW47XHJcblxyXG4gICAgICAgIGlmIChtZXJnZU9wdGlvbnMucnRsKSB1dGlsLmFkZENsYXNzKGVsLnRvcEFyZWEsICdzZS1ydGwnKTtcclxuICAgICAgICBlbHNlIHV0aWwucmVtb3ZlQ2xhc3MoZWwudG9wQXJlYSwgJ3NlLXJ0bCcpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjYWxsQnV0dG9uczogdG9vbF9iYXIucGx1Z2luQ2FsbEJ1dHRvbnMsXHJcbiAgICAgICAgICAgIHBsdWdpbnM6IHRvb2xfYmFyLnBsdWdpbnMsXHJcbiAgICAgICAgICAgIHRvb2xiYXI6IHRvb2xfYmFyXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZSBwcm9wZXJ0eSBvZiBzdW5lZGl0b3IgZWxlbWVudHNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdG9wRGl2IFN1bmVkaXRvciB0b3AgZGl2XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRvb2xCYXIgVG9vbCBiYXJcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdG9vbEJhckFycm93IFRvb2wgYmFyIGFycm93IChiYWxsb29uIGVkaXRvcilcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEJvdHRvbSBiYXIgZWxlbWVudHMgKHJlc2l6aW5nQmFyLCBuYXZpZ2F0aW9uLCBjaGFyV3JhcHBlciwgY2hhckNvdW50ZXIpXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaW5pdEVsZW1lbnRzOiBmdW5jdGlvbiAob3B0aW9ucywgdG9wRGl2LCB0b29sQmFyLCB0b29sQmFyQXJyb3cpIHtcclxuICAgICAgICAvKiogdG9wIGRpdiAqL1xyXG4gICAgICAgIHRvcERpdi5zdHlsZS5jc3NUZXh0ID0gb3B0aW9ucy5fZWRpdG9yU3R5bGVzLnRvcDtcclxuXHJcbiAgICAgICAgLyoqIHRvb2xiYXIgKi9cclxuICAgICAgICBpZiAoL2lubGluZS9pLnRlc3Qob3B0aW9ucy5tb2RlKSkge1xyXG4gICAgICAgICAgICB0b29sQmFyLmNsYXNzTmFtZSArPSAnIHNlLXRvb2xiYXItaW5saW5lJztcclxuICAgICAgICAgICAgdG9vbEJhci5zdHlsZS53aWR0aCA9IG9wdGlvbnMudG9vbGJhcldpZHRoO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoL2JhbGxvb24vaS50ZXN0KG9wdGlvbnMubW9kZSkpIHtcclxuICAgICAgICAgICAgdG9vbEJhci5jbGFzc05hbWUgKz0gJyBzZS10b29sYmFyLWJhbGxvb24nO1xyXG4gICAgICAgICAgICB0b29sQmFyLnN0eWxlLndpZHRoID0gb3B0aW9ucy50b29sYmFyV2lkdGg7XHJcbiAgICAgICAgICAgIHRvb2xCYXIuYXBwZW5kQ2hpbGQodG9vbEJhckFycm93KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBlZGl0b3IgKi9cclxuICAgICAgICAvLyB3eXNpd3lnIGRpdiBvciBpZnJhbWVcclxuICAgICAgICBjb25zdCB3eXNpd3lnRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCghb3B0aW9ucy5pZnJhbWUgPyAnRElWJyA6ICdJRlJBTUUnKTtcclxuICAgICAgICB3eXNpd3lnRGl2LmNsYXNzTmFtZSA9ICdzZS13cmFwcGVyLWlubmVyIHNlLXdyYXBwZXItd3lzaXd5Zyc7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgICAgICB3eXNpd3lnRGl2LnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHd5c2l3eWdEaXYuc2V0QXR0cmlidXRlKCdzY3JvbGxpbmcnLCAnYXV0bycpO1xyXG4gICAgICAgICAgICB3eXNpd3lnRGl2LmNsYXNzTmFtZSArPSAnICcgKyBvcHRpb25zLl9lZGl0YWJsZUNsYXNzO1xyXG4gICAgICAgICAgICB3eXNpd3lnRGl2LnN0eWxlLmNzc1RleHQgPSBvcHRpb25zLl9lZGl0b3JTdHlsZXMuZnJhbWUgKyBvcHRpb25zLl9lZGl0b3JTdHlsZXMuZWRpdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHd5c2l3eWdEaXYuYWxsb3dGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgd3lzaXd5Z0Rpdi5mcmFtZUJvcmRlciA9IDA7XHJcbiAgICAgICAgICAgIHd5c2l3eWdEaXYuc3R5bGUuY3NzVGV4dCA9IG9wdGlvbnMuX2VkaXRvclN0eWxlcy5mcmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRleHRhcmVhIGZvciBjb2RlIHZpZXdcclxuICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1RFWFRBUkVBJyk7XHJcbiAgICAgICAgdGV4dGFyZWEuY2xhc3NOYW1lID0gJ3NlLXdyYXBwZXItaW5uZXIgc2Utd3JhcHBlci1jb2RlJztcclxuICAgICAgICB0ZXh0YXJlYS5zdHlsZS5jc3NUZXh0ID0gb3B0aW9ucy5fZWRpdG9yU3R5bGVzLmZyYW1lO1xyXG4gICAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0bycpIHRleHRhcmVhLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcblxyXG4gICAgICAgIC8qKiByZXNpemUgYmFyICovXHJcbiAgICAgICAgbGV0IHJlc2l6aW5nQmFyID0gbnVsbDtcclxuICAgICAgICBsZXQgbmF2aWdhdGlvbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IGNoYXJXcmFwcGVyID0gbnVsbDtcclxuICAgICAgICBsZXQgY2hhckNvdW50ZXIgPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJlc2l6aW5nQmFyKSB7XHJcbiAgICAgICAgICAgIHJlc2l6aW5nQmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgIHJlc2l6aW5nQmFyLmNsYXNzTmFtZSA9ICdzZS1yZXNpemluZy1iYXIgc3VuLWVkaXRvci1jb21tb24nO1xyXG5cclxuICAgICAgICAgICAgLyoqIG5hdmlnYXRpb24gKi9cclxuICAgICAgICAgICAgbmF2aWdhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgICAgICBuYXZpZ2F0aW9uLmNsYXNzTmFtZSA9ICdzZS1uYXZpZ2F0aW9uIHN1bi1lZGl0b3ItY29tbW9uJztcclxuICAgICAgICAgICAgcmVzaXppbmdCYXIuYXBwZW5kQ2hpbGQobmF2aWdhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAvKiogY2hhciBjb3VudGVyICovXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNoYXJDb3VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFyV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgICAgICAgICAgY2hhcldyYXBwZXIuY2xhc3NOYW1lID0gJ3NlLWNoYXItY291bnRlci13cmFwcGVyJztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jaGFyQ291bnRlckxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXJMYWJlbC5jbGFzc05hbWUgPSAnc2UtY2hhci1sYWJlbCc7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhckxhYmVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5jaGFyQ291bnRlckxhYmVsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXJXcmFwcGVyLmFwcGVuZENoaWxkKGNoYXJMYWJlbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGNoYXJDb3VudGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xyXG4gICAgICAgICAgICAgICAgY2hhckNvdW50ZXIuY2xhc3NOYW1lID0gJ3NlLWNoYXItY291bnRlcic7XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnRlci50ZXh0Q29udGVudCA9ICcwJztcclxuICAgICAgICAgICAgICAgIGNoYXJXcmFwcGVyLmFwcGVuZENoaWxkKGNoYXJDb3VudGVyKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4Q2hhckNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfbWF4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXJfbWF4LnRleHRDb250ZW50ID0gJyAvICcgKyBvcHRpb25zLm1heENoYXJDb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBjaGFyV3JhcHBlci5hcHBlbmRDaGlsZChjaGFyX21heCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzaXppbmdCYXIuYXBwZW5kQ2hpbGQoY2hhcldyYXBwZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBwbGFjZWhvbGRlciA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdTUEFOJyk7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmNsYXNzTmFtZSA9ICdzZS1wbGFjZWhvbGRlcic7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmlubmVyVGV4dCA9IG9wdGlvbnMucGxhY2Vob2xkZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBib3R0b21CYXI6IHtcclxuICAgICAgICAgICAgICAgIHJlc2l6aW5nQmFyOiByZXNpemluZ0JhcixcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb246IG5hdmlnYXRpb24sXHJcbiAgICAgICAgICAgICAgICBjaGFyV3JhcHBlcjogY2hhcldyYXBwZXIsXHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnRlcjogY2hhckNvdW50ZXJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgd3lzaXd5Z0ZyYW1lOiB3eXNpd3lnRGl2LFxyXG4gICAgICAgICAgICBjb2RlVmlldzogdGV4dGFyZWEsXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlclxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2luaXRPcHRpb25zOiBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICAgIC8qKiBWYWx1ZXMgKi9cclxuICAgICAgICBvcHRpb25zLmxhbmcgPSBvcHRpb25zLmxhbmcgfHwgX2RlZmF1bHRMYW5nO1xyXG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdFRhZyA9IHR5cGVvZiBvcHRpb25zLmRlZmF1bHRUYWcgPT09ICdzdHJpbmcnID8gb3B0aW9ucy5kZWZhdWx0VGFnIDogJ3AnO1xyXG4gICAgICAgIGNvbnN0IHRleHRUYWdzID0gb3B0aW9ucy50ZXh0VGFncyA9IFt7Ym9sZDogJ1NUUk9ORycsIHVuZGVybGluZTogJ1UnLCBpdGFsaWM6ICdFTScsIHN0cmlrZTogJ0RFTCd9LCAob3B0aW9ucy50ZXh0VGFncyB8fCB7fSldLnJlZHVjZShmdW5jdGlvbiAoX2RlZmF1bHQsIF9uZXcpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIF9uZXcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLmhhc093bihfbmV3LCBrZXkpKSBfZGVmYXVsdFtrZXldID0gX25ld1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdDtcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgb3B0aW9ucy5fdGV4dFRhZ3NNYXAgPSB7XHJcbiAgICAgICAgICAgICdzdHJvbmcnOiB0ZXh0VGFncy5ib2xkLFxyXG4gICAgICAgICAgICAnYic6IHRleHRUYWdzLmJvbGQsXHJcbiAgICAgICAgICAgICd1JzogdGV4dFRhZ3MudW5kZXJsaW5lLFxyXG4gICAgICAgICAgICAnaW5zJzogdGV4dFRhZ3MudW5kZXJsaW5lLFxyXG4gICAgICAgICAgICAnZW0nOiB0ZXh0VGFncy5pdGFsaWMsXHJcbiAgICAgICAgICAgICdpJzogdGV4dFRhZ3MuaXRhbGljLFxyXG4gICAgICAgICAgICAnZGVsJzogdGV4dFRhZ3Muc3RyaWtlLFxyXG4gICAgICAgICAgICAnc3RyaWtlJzogdGV4dFRhZ3Muc3RyaWtlLFxyXG4gICAgICAgICAgICAncyc6IHRleHRUYWdzLnN0cmlrZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IHR5cGVvZiBvcHRpb25zLnZhbHVlID09PSAnc3RyaW5nJyA/IG9wdGlvbnMudmFsdWUgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMuaGlzdG9yeVN0YWNrRGVsYXlUaW1lID0gdHlwZW9mIG9wdGlvbnMuaGlzdG9yeVN0YWNrRGVsYXlUaW1lID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuaGlzdG9yeVN0YWNrRGVsYXlUaW1lIDogNDAwO1xyXG4gICAgICAgIC8qKiBXaGl0ZWxpc3QgKi9cclxuICAgICAgICBvcHRpb25zLl9kZWZhdWx0VGFnc1doaXRlbGlzdCA9IHR5cGVvZiBvcHRpb25zLl9kZWZhdWx0VGFnc1doaXRlbGlzdCA9PT0gJ3N0cmluZycgPyBvcHRpb25zLl9kZWZhdWx0VGFnc1doaXRlbGlzdCA6ICdicnxwfGRpdnxwcmV8YmxvY2txdW90ZXxoWzEtNl18b2x8dWx8bGl8aHJ8ZmlndXJlfGZpZ2NhcHRpb258aW1nfGlmcmFtZXxhdWRpb3x2aWRlb3xzb3VyY2V8dGFibGV8dGhlYWR8dGJvZHl8dHJ8dGh8dGR8YXxifHN0cm9uZ3x2YXJ8aXxlbXx1fGluc3xzfHNwYW58c3RyaWtlfGRlbHxzdWJ8c3VwfGNvZGUnO1xyXG4gICAgICAgIG9wdGlvbnMuX2VkaXRvclRhZ3NXaGl0ZWxpc3QgPSBvcHRpb25zLl9kZWZhdWx0VGFnc1doaXRlbGlzdCArICh0eXBlb2Ygb3B0aW9ucy5hZGRUYWdzV2hpdGVsaXN0ID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmFkZFRhZ3NXaGl0ZWxpc3QubGVuZ3RoID4gMCA/ICd8JyArIG9wdGlvbnMuYWRkVGFnc1doaXRlbGlzdCA6ICcnKTtcclxuICAgICAgICBvcHRpb25zLnBhc3RlVGFnc1doaXRlbGlzdCA9IHR5cGVvZiBvcHRpb25zLnBhc3RlVGFnc1doaXRlbGlzdCA9PT0gJ3N0cmluZycgPyBvcHRpb25zLnBhc3RlVGFnc1doaXRlbGlzdCA6IG9wdGlvbnMuX2VkaXRvclRhZ3NXaGl0ZWxpc3Q7XHJcbiAgICAgICAgb3B0aW9ucy5hdHRyaWJ1dGVzV2hpdGVsaXN0ID0gKCFvcHRpb25zLmF0dHJpYnV0ZXNXaGl0ZWxpc3QgfHwgdHlwZW9mIG9wdGlvbnMuYXR0cmlidXRlc1doaXRlbGlzdCAhPT0gJ29iamVjdCcpID8gbnVsbCA6IG9wdGlvbnMuYXR0cmlidXRlc1doaXRlbGlzdDtcclxuICAgICAgICAvLyBAdjNcclxuICAgICAgICAvLyBjb25zdCBkZWZhdWx0QWxsb3dTdHlsZXMgPSB7XHJcbiAgICAgICAgLy8gICAgIGZvcm1hdDogWydtYXJnaW4tbGVmdCcsICdtYXJnaW4tcmlnaHQnLCAndGV4dC1hbGlnbicsICdsaW5lLWhlaWdodCddLFxyXG4gICAgICAgIC8vICAgICByYW5nZUZvcm1hdDogW10sXHJcbiAgICAgICAgLy8gICAgIGNsb3N1cmVSYW5nZUZvcm1hdDogW10sXHJcbiAgICAgICAgLy8gICAgIGZyZWVGb3JtYXQ6IFtdLFxyXG4gICAgICAgIC8vICAgICBjbG9zdXJlRnJlZUZvcm1hdDogW10sXHJcbiAgICAgICAgLy8gICAgIGNvbXBvbmVudDogW10sXHJcbiAgICAgICAgLy8gICAgIHNwYW46IFsnZm9udC1mYW1pbHknLCAnY29sb3InLCAnYmFja2dyb3VuZC1jb2xvcicsICdmb250LXNpemUnXVxyXG4gICAgICAgIC8vIH07XHJcbiAgICAgICAgLy8gb3B0aW9ucy5hbGxvd1N0eWxlcyA9ICghb3B0aW9ucy5hbGxvd1N0eWxlcyB8fCB0eXBlb2Ygb3B0aW9ucy5hbGxvd1N0eWxlcyAhPT0gJ29iamVjdCcpID8gZGVmYXVsdEFsbG93U3R5bGVzIDogW2RlZmF1bHRBbGxvd1N0eWxlcywgb3B0aW9ucy5hbGxvd1N0eWxlc10ucmVkdWNlKGZ1bmN0aW9uIChfZGVmYXVsdCwgX25ldykge1xyXG4gICAgICAgIC8vICAgICBmb3IgKGxldCBrZXkgaW4gX25ldykge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCFfZGVmYXVsdFtrZXldKSBfZGVmYXVsdFtrZXldID0gW107XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBuZXdTdHlsZSA9IF9uZXdba2V5XTtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0eXBlb2YgbmV3U3R5bGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgX2RlZmF1bHRba2V5XSA9ICFuZXdTdHlsZSA/IFtdIDogbmV3U3R5bGUuc3BsaXQoJ3wnKTtcclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5ld1N0eWxlLmxlbmd0aCwgbjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIG4gPSBuZXdTdHlsZVtpXTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgaWYgKF9kZWZhdWx0W2tleV0uaW5kZXhPZihuKSA9PT0gLTEpIF9kZWZhdWx0W2tleV0ucHVzaChuKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICByZXR1cm4gX2RlZmF1bHQ7XHJcbiAgICAgICAgLy8gfSwge30pO1xyXG4gICAgICAgIC8qKiBMYXlvdXQgKi9cclxuICAgICAgICBvcHRpb25zLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgJ2NsYXNzaWMnOyAvLyBjbGFzc2ljLCBpbmxpbmUsIGJhbGxvb24sIGJhbGxvb24tYWx3YXlzXHJcbiAgICAgICAgb3B0aW9ucy5ydGwgPSAhIW9wdGlvbnMucnRsO1xyXG4gICAgICAgIG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3MgPSAnc3VuLWVkaXRvci1lZGl0YWJsZScgKyAob3B0aW9ucy5ydGwgPyAnIHNlLXJ0bCcgOiAnJyk7XHJcbiAgICAgICAgb3B0aW9ucy50b29sYmFyV2lkdGggPSBvcHRpb25zLnRvb2xiYXJXaWR0aCA/ICh1dGlsLmlzTnVtYmVyKG9wdGlvbnMudG9vbGJhcldpZHRoKSA/IG9wdGlvbnMudG9vbGJhcldpZHRoICsgJ3B4JyA6IG9wdGlvbnMudG9vbGJhcldpZHRoKSA6ICdhdXRvJztcclxuICAgICAgICBvcHRpb25zLnRvb2xiYXJDb250YWluZXIgPSB0eXBlb2Ygb3B0aW9ucy50b29sYmFyQ29udGFpbmVyID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucy50b29sYmFyQ29udGFpbmVyKSA6IG9wdGlvbnMudG9vbGJhckNvbnRhaW5lcjtcclxuICAgICAgICBvcHRpb25zLnN0aWNreVRvb2xiYXIgPSAoL2JhbGxvb24vaS50ZXN0KG9wdGlvbnMubW9kZSkgfHwgISFvcHRpb25zLnRvb2xiYXJDb250YWluZXIpID8gLTEgOiBvcHRpb25zLnN0aWNreVRvb2xiYXIgPT09IHVuZGVmaW5lZCA/IDAgOiAoL15cXGQrLy50ZXN0KG9wdGlvbnMuc3RpY2t5VG9vbGJhcikgPyB1dGlsLmdldE51bWJlcihvcHRpb25zLnN0aWNreVRvb2xiYXIsIDApIDogLTEpO1xyXG4gICAgICAgIG9wdGlvbnMuZnVsbFNjcmVlbk9mZnNldCA9IG9wdGlvbnMuZnVsbFNjcmVlbk9mZnNldCA9PT0gdW5kZWZpbmVkID8gMCA6ICgvXlxcZCsvLnRlc3Qob3B0aW9ucy5mdWxsU2NyZWVuT2Zmc2V0KSA/IHV0aWwuZ2V0TnVtYmVyKG9wdGlvbnMuZnVsbFNjcmVlbk9mZnNldCwgMCkgOiAwKTtcclxuICAgICAgICBvcHRpb25zLmlmcmFtZSA9IG9wdGlvbnMuZnVsbFBhZ2UgfHwgb3B0aW9ucy5pZnJhbWU7XHJcbiAgICAgICAgb3B0aW9ucy5mdWxsUGFnZSA9ICEhb3B0aW9ucy5mdWxsUGFnZTtcclxuICAgICAgICBvcHRpb25zLmlmcmFtZUNTU0ZpbGVOYW1lID0gb3B0aW9ucy5pZnJhbWUgPyB0eXBlb2Ygb3B0aW9ucy5pZnJhbWVDU1NGaWxlTmFtZSA9PT0gJ3N0cmluZycgPyBbb3B0aW9ucy5pZnJhbWVDU1NGaWxlTmFtZV0gOiAob3B0aW9ucy5pZnJhbWVDU1NGaWxlTmFtZSB8fCBbJ3N1bmVkaXRvciddKSA6IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUgPSB0eXBlb2Ygb3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUgPT09ICdzdHJpbmcnID8gb3B0aW9ucy5wcmV2aWV3VGVtcGxhdGUgOiBudWxsO1xyXG4gICAgICAgIC8qKiBDb2RlTWlycm9yIG9iamVjdCAqL1xyXG4gICAgICAgIG9wdGlvbnMuY29kZU1pcnJvciA9IG9wdGlvbnMuY29kZU1pcnJvciA/IG9wdGlvbnMuY29kZU1pcnJvci5zcmMgPyBvcHRpb25zLmNvZGVNaXJyb3IgOiB7c3JjOiBvcHRpb25zLmNvZGVNaXJyb3J9IDogbnVsbDtcclxuICAgICAgICAvKioga2F0ZXggb2JqZWN0IChNYXRoIHBsdWdpbikgKi9cclxuICAgICAgICBvcHRpb25zLmthdGV4ID0gb3B0aW9ucy5rYXRleCA/IG9wdGlvbnMua2F0ZXguc3JjID8gb3B0aW9ucy5rYXRleCA6IHtzcmM6IG9wdGlvbnMua2F0ZXh9IDogbnVsbDtcclxuICAgICAgICAvKiogRGlzcGxheSAqL1xyXG4gICAgICAgIG9wdGlvbnMucG9zaXRpb24gPSB0eXBlb2Ygb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3N0cmluZycgPyBvcHRpb25zLnBvc2l0aW9uIDogbnVsbDtcclxuICAgICAgICBvcHRpb25zLmRpc3BsYXkgPSBvcHRpb25zLmRpc3BsYXkgfHwgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8ICFlbGVtZW50LnN0eWxlLmRpc3BsYXkgPyAnYmxvY2snIDogZWxlbWVudC5zdHlsZS5kaXNwbGF5KTtcclxuICAgICAgICBvcHRpb25zLnBvcHVwRGlzcGxheSA9IG9wdGlvbnMucG9wdXBEaXNwbGF5IHx8ICdmdWxsJztcclxuICAgICAgICAvKiogQm90dG9tIHJlc2l6aW5nIGJhciAqL1xyXG4gICAgICAgIG9wdGlvbnMucmVzaXppbmdCYXIgPSBvcHRpb25zLnJlc2l6aW5nQmFyID09PSB1bmRlZmluZWQgPyAoL2lubGluZXxiYWxsb29uL2kudGVzdChvcHRpb25zLm1vZGUpID8gZmFsc2UgOiB0cnVlKSA6IG9wdGlvbnMucmVzaXppbmdCYXI7XHJcbiAgICAgICAgb3B0aW9ucy5zaG93UGF0aExhYmVsID0gIW9wdGlvbnMucmVzaXppbmdCYXIgPyBmYWxzZSA6IHR5cGVvZiBvcHRpb25zLnNob3dQYXRoTGFiZWwgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc2hvd1BhdGhMYWJlbCA6IHRydWU7XHJcbiAgICAgICAgLyoqIENoYXJhY3RlciBjb3VudCAqL1xyXG4gICAgICAgIG9wdGlvbnMuY2hhckNvdW50ZXIgPSBvcHRpb25zLm1heENoYXJDb3VudCA+IDAgPyB0cnVlIDogdHlwZW9mIG9wdGlvbnMuY2hhckNvdW50ZXIgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuY2hhckNvdW50ZXIgOiBmYWxzZTtcclxuICAgICAgICBvcHRpb25zLmNoYXJDb3VudGVyVHlwZSA9IHR5cGVvZiBvcHRpb25zLmNoYXJDb3VudGVyVHlwZSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmNoYXJDb3VudGVyVHlwZSA6ICdjaGFyJztcclxuICAgICAgICBvcHRpb25zLmNoYXJDb3VudGVyTGFiZWwgPSB0eXBlb2Ygb3B0aW9ucy5jaGFyQ291bnRlckxhYmVsID09PSAnc3RyaW5nJyA/IG9wdGlvbnMuY2hhckNvdW50ZXJMYWJlbC50cmltKCkgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMubWF4Q2hhckNvdW50ID0gdXRpbC5pc051bWJlcihvcHRpb25zLm1heENoYXJDb3VudCkgJiYgb3B0aW9ucy5tYXhDaGFyQ291bnQgPiAtMSA/IG9wdGlvbnMubWF4Q2hhckNvdW50ICogMSA6IG51bGw7XHJcbiAgICAgICAgLyoqIFdpZHRoIHNpemUgKi9cclxuICAgICAgICBvcHRpb25zLndpZHRoID0gb3B0aW9ucy53aWR0aCA/ICh1dGlsLmlzTnVtYmVyKG9wdGlvbnMud2lkdGgpID8gb3B0aW9ucy53aWR0aCArICdweCcgOiBvcHRpb25zLndpZHRoKSA6IChlbGVtZW50LmNsaWVudFdpZHRoID8gZWxlbWVudC5jbGllbnRXaWR0aCArICdweCcgOiAnMTAwJScpO1xyXG4gICAgICAgIG9wdGlvbnMubWluV2lkdGggPSAodXRpbC5pc051bWJlcihvcHRpb25zLm1pbldpZHRoKSA/IG9wdGlvbnMubWluV2lkdGggKyAncHgnIDogb3B0aW9ucy5taW5XaWR0aCkgfHwgJyc7XHJcbiAgICAgICAgb3B0aW9ucy5tYXhXaWR0aCA9ICh1dGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4V2lkdGgpID8gb3B0aW9ucy5tYXhXaWR0aCArICdweCcgOiBvcHRpb25zLm1heFdpZHRoKSB8fCAnJztcclxuICAgICAgICAvKiogSGVpZ2h0IHNpemUgKi9cclxuICAgICAgICBvcHRpb25zLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ID8gKHV0aWwuaXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpID8gb3B0aW9ucy5oZWlnaHQgKyAncHgnIDogb3B0aW9ucy5oZWlnaHQpIDogKGVsZW1lbnQuY2xpZW50SGVpZ2h0ID8gZWxlbWVudC5jbGllbnRIZWlnaHQgKyAncHgnIDogJ2F1dG8nKTtcclxuICAgICAgICBvcHRpb25zLm1pbkhlaWdodCA9ICh1dGlsLmlzTnVtYmVyKG9wdGlvbnMubWluSGVpZ2h0KSA/IG9wdGlvbnMubWluSGVpZ2h0ICsgJ3B4JyA6IG9wdGlvbnMubWluSGVpZ2h0KSB8fCAnJztcclxuICAgICAgICBvcHRpb25zLm1heEhlaWdodCA9ICh1dGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4SGVpZ2h0KSA/IG9wdGlvbnMubWF4SGVpZ2h0ICsgJ3B4JyA6IG9wdGlvbnMubWF4SGVpZ2h0KSB8fCAnJztcclxuICAgICAgICAvKiogRWRpdGluZyBhcmVhIGRlZmF1bHQgc3R5bGUgKi9cclxuICAgICAgICBvcHRpb25zLmRlZmF1bHRTdHlsZSA9IHR5cGVvZiBvcHRpb25zLmRlZmF1bHRTdHlsZSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmRlZmF1bHRTdHlsZSA6ICcnO1xyXG4gICAgICAgIC8qKiBEZWZpbmluZyBtZW51IGl0ZW1zICovXHJcbiAgICAgICAgb3B0aW9ucy5mb250ID0gIW9wdGlvbnMuZm9udCA/IG51bGwgOiBvcHRpb25zLmZvbnQ7XHJcbiAgICAgICAgb3B0aW9ucy5mb250U2l6ZSA9ICFvcHRpb25zLmZvbnRTaXplID8gbnVsbCA6IG9wdGlvbnMuZm9udFNpemU7XHJcbiAgICAgICAgb3B0aW9ucy5mb3JtYXRzID0gIW9wdGlvbnMuZm9ybWF0cyA/IG51bGwgOiBvcHRpb25zLmZvcm1hdHM7XHJcbiAgICAgICAgb3B0aW9ucy5jb2xvckxpc3QgPSAhb3B0aW9ucy5jb2xvckxpc3QgPyBudWxsIDogb3B0aW9ucy5jb2xvckxpc3Q7XHJcbiAgICAgICAgb3B0aW9ucy5saW5lSGVpZ2h0cyA9ICFvcHRpb25zLmxpbmVIZWlnaHRzID8gbnVsbCA6IG9wdGlvbnMubGluZUhlaWdodHM7XHJcbiAgICAgICAgb3B0aW9ucy5wYXJhZ3JhcGhTdHlsZXMgPSAhb3B0aW9ucy5wYXJhZ3JhcGhTdHlsZXMgPyBudWxsIDogb3B0aW9ucy5wYXJhZ3JhcGhTdHlsZXM7XHJcbiAgICAgICAgb3B0aW9ucy50ZXh0U3R5bGVzID0gIW9wdGlvbnMudGV4dFN0eWxlcyA/IG51bGwgOiBvcHRpb25zLnRleHRTdHlsZXM7XHJcbiAgICAgICAgb3B0aW9ucy5mb250U2l6ZVVuaXQgPSB0eXBlb2Ygb3B0aW9ucy5mb250U2l6ZVVuaXQgPT09ICdzdHJpbmcnID8gKG9wdGlvbnMuZm9udFNpemVVbml0LnRyaW0oKSB8fCAncHgnKSA6ICdweCc7XHJcbiAgICAgICAgLyoqIEltYWdlICovXHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVJlc2l6aW5nID0gb3B0aW9ucy5pbWFnZVJlc2l6aW5nID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9ucy5pbWFnZVJlc2l6aW5nO1xyXG4gICAgICAgIG9wdGlvbnMuaW1hZ2VIZWlnaHRTaG93ID0gb3B0aW9ucy5pbWFnZUhlaWdodFNob3cgPT09IHVuZGVmaW5lZCA/IHRydWUgOiAhIW9wdGlvbnMuaW1hZ2VIZWlnaHRTaG93O1xyXG4gICAgICAgIG9wdGlvbnMuaW1hZ2VXaWR0aCA9ICFvcHRpb25zLmltYWdlV2lkdGggPyAnYXV0bycgOiB1dGlsLmlzTnVtYmVyKG9wdGlvbnMuaW1hZ2VXaWR0aCkgPyBvcHRpb25zLmltYWdlV2lkdGggKyAncHgnIDogb3B0aW9ucy5pbWFnZVdpZHRoO1xyXG4gICAgICAgIG9wdGlvbnMuaW1hZ2VIZWlnaHQgPSAhb3B0aW9ucy5pbWFnZUhlaWdodCA/ICdhdXRvJyA6IHV0aWwuaXNOdW1iZXIob3B0aW9ucy5pbWFnZUhlaWdodCkgPyBvcHRpb25zLmltYWdlSGVpZ2h0ICsgJ3B4JyA6IG9wdGlvbnMuaW1hZ2VIZWlnaHQ7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVNpemVPbmx5UGVyY2VudGFnZSA9ICEhb3B0aW9ucy5pbWFnZVNpemVPbmx5UGVyY2VudGFnZTtcclxuICAgICAgICBvcHRpb25zLl9pbWFnZVNpemVVbml0ID0gb3B0aW9ucy5pbWFnZVNpemVPbmx5UGVyY2VudGFnZSA/ICclJyA6ICdweCc7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVJvdGF0aW9uID0gb3B0aW9ucy5pbWFnZVJvdGF0aW9uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmltYWdlUm90YXRpb24gOiAhKG9wdGlvbnMuaW1hZ2VTaXplT25seVBlcmNlbnRhZ2UgfHwgIW9wdGlvbnMuaW1hZ2VIZWlnaHRTaG93KTtcclxuICAgICAgICBvcHRpb25zLmltYWdlRmlsZUlucHV0ID0gb3B0aW9ucy5pbWFnZUZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuaW1hZ2VGaWxlSW5wdXQ7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVVybElucHV0ID0gKG9wdGlvbnMuaW1hZ2VVcmxJbnB1dCA9PT0gdW5kZWZpbmVkIHx8ICFvcHRpb25zLmltYWdlRmlsZUlucHV0KSA/IHRydWUgOiBvcHRpb25zLmltYWdlVXJsSW5wdXQ7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVVwbG9hZEhlYWRlciA9IG9wdGlvbnMuaW1hZ2VVcGxvYWRIZWFkZXIgfHwgbnVsbDtcclxuICAgICAgICBvcHRpb25zLmltYWdlVXBsb2FkVXJsID0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VVcGxvYWRVcmwgPT09ICdzdHJpbmcnID8gb3B0aW9ucy5pbWFnZVVwbG9hZFVybCA6IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZVVwbG9hZFNpemVMaW1pdCA9IC9cXGQrLy50ZXN0KG9wdGlvbnMuaW1hZ2VVcGxvYWRTaXplTGltaXQpID8gdXRpbC5nZXROdW1iZXIob3B0aW9ucy5pbWFnZVVwbG9hZFNpemVMaW1pdCwgMCkgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMuaW1hZ2VNdWx0aXBsZUZpbGUgPSAhIW9wdGlvbnMuaW1hZ2VNdWx0aXBsZUZpbGU7XHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZUFjY2VwdCA9ICh0eXBlb2Ygb3B0aW9ucy5pbWFnZUFjY2VwdCAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5pbWFnZUFjY2VwdC50cmltKCkgPT09IFwiKlwiKSA/ICdpbWFnZS8qJyA6IG9wdGlvbnMuaW1hZ2VBY2NlcHQudHJpbSgpIHx8ICdpbWFnZS8qJztcclxuICAgICAgICAvKiogSW1hZ2UgLSBpbWFnZSBnYWxsZXJ5ICovXHJcbiAgICAgICAgb3B0aW9ucy5pbWFnZUdhbGxlcnlVcmwgPSB0eXBlb2Ygb3B0aW9ucy5pbWFnZUdhbGxlcnlVcmwgPT09ICdzdHJpbmcnID8gb3B0aW9ucy5pbWFnZUdhbGxlcnlVcmwgOiBudWxsO1xyXG4gICAgICAgIC8qKiBWaWRlbyAqL1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW9SZXNpemluZyA9IG9wdGlvbnMudmlkZW9SZXNpemluZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMudmlkZW9SZXNpemluZztcclxuICAgICAgICBvcHRpb25zLnZpZGVvSGVpZ2h0U2hvdyA9IG9wdGlvbnMudmlkZW9IZWlnaHRTaG93ID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRpb25zLnZpZGVvSGVpZ2h0U2hvdztcclxuICAgICAgICBvcHRpb25zLnZpZGVvUmF0aW9TaG93ID0gb3B0aW9ucy52aWRlb1JhdGlvU2hvdyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhb3B0aW9ucy52aWRlb1JhdGlvU2hvdztcclxuICAgICAgICBvcHRpb25zLnZpZGVvV2lkdGggPSAhb3B0aW9ucy52aWRlb1dpZHRoIHx8ICF1dGlsLmdldE51bWJlcihvcHRpb25zLnZpZGVvV2lkdGgsIDApID8gJycgOiB1dGlsLmlzTnVtYmVyKG9wdGlvbnMudmlkZW9XaWR0aCkgPyBvcHRpb25zLnZpZGVvV2lkdGggKyAncHgnIDogb3B0aW9ucy52aWRlb1dpZHRoO1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW9IZWlnaHQgPSAhb3B0aW9ucy52aWRlb0hlaWdodCB8fCAhdXRpbC5nZXROdW1iZXIob3B0aW9ucy52aWRlb0hlaWdodCwgMCkgPyAnJyA6IHV0aWwuaXNOdW1iZXIob3B0aW9ucy52aWRlb0hlaWdodCkgPyBvcHRpb25zLnZpZGVvSGVpZ2h0ICsgJ3B4JyA6IG9wdGlvbnMudmlkZW9IZWlnaHQ7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1NpemVPbmx5UGVyY2VudGFnZSA9ICEhb3B0aW9ucy52aWRlb1NpemVPbmx5UGVyY2VudGFnZTtcclxuICAgICAgICBvcHRpb25zLl92aWRlb1NpemVVbml0ID0gb3B0aW9ucy52aWRlb1NpemVPbmx5UGVyY2VudGFnZSA/ICclJyA6ICdweCc7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1JvdGF0aW9uID0gb3B0aW9ucy52aWRlb1JvdGF0aW9uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnZpZGVvUm90YXRpb24gOiAhKG9wdGlvbnMudmlkZW9TaXplT25seVBlcmNlbnRhZ2UgfHwgIW9wdGlvbnMudmlkZW9IZWlnaHRTaG93KTtcclxuICAgICAgICBvcHRpb25zLnZpZGVvUmF0aW8gPSAodXRpbC5nZXROdW1iZXIob3B0aW9ucy52aWRlb1JhdGlvLCA0KSB8fCAwLjU2MjUpO1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW9SYXRpb0xpc3QgPSAhb3B0aW9ucy52aWRlb1JhdGlvTGlzdCA/IG51bGwgOiBvcHRpb25zLnZpZGVvUmF0aW9MaXN0O1xyXG4gICAgICAgIG9wdGlvbnMueW91dHViZVF1ZXJ5ID0gKG9wdGlvbnMueW91dHViZVF1ZXJ5IHx8ICcnKS5yZXBsYWNlKCc/JywgJycpO1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW9GaWxlSW5wdXQgPSAhIW9wdGlvbnMudmlkZW9GaWxlSW5wdXQ7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1VybElucHV0ID0gKG9wdGlvbnMudmlkZW9VcmxJbnB1dCA9PT0gdW5kZWZpbmVkIHx8ICFvcHRpb25zLnZpZGVvRmlsZUlucHV0KSA/IHRydWUgOiBvcHRpb25zLnZpZGVvVXJsSW5wdXQ7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1VwbG9hZEhlYWRlciA9IG9wdGlvbnMudmlkZW9VcGxvYWRIZWFkZXIgfHwgbnVsbDtcclxuICAgICAgICBvcHRpb25zLnZpZGVvVXBsb2FkVXJsID0gdHlwZW9mIG9wdGlvbnMudmlkZW9VcGxvYWRVcmwgPT09ICdzdHJpbmcnID8gb3B0aW9ucy52aWRlb1VwbG9hZFVybCA6IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1VwbG9hZFNpemVMaW1pdCA9IC9cXGQrLy50ZXN0KG9wdGlvbnMudmlkZW9VcGxvYWRTaXplTGltaXQpID8gdXRpbC5nZXROdW1iZXIob3B0aW9ucy52aWRlb1VwbG9hZFNpemVMaW1pdCwgMCkgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW9NdWx0aXBsZUZpbGUgPSAhIW9wdGlvbnMudmlkZW9NdWx0aXBsZUZpbGU7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb1RhZ0F0dHJzID0gb3B0aW9ucy52aWRlb1RhZ0F0dHJzIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb0lmcmFtZUF0dHJzID0gb3B0aW9ucy52aWRlb0lmcmFtZUF0dHJzIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy52aWRlb0FjY2VwdCA9ICh0eXBlb2Ygb3B0aW9ucy52aWRlb0FjY2VwdCAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy52aWRlb0FjY2VwdC50cmltKCkgPT09IFwiKlwiKSA/ICd2aWRlby8qJyA6IG9wdGlvbnMudmlkZW9BY2NlcHQudHJpbSgpIHx8ICd2aWRlby8qJztcclxuICAgICAgICAvKiogQXVkaW8gKi9cclxuICAgICAgICBvcHRpb25zLmF1ZGlvV2lkdGggPSAhb3B0aW9ucy5hdWRpb1dpZHRoID8gJycgOiB1dGlsLmlzTnVtYmVyKG9wdGlvbnMuYXVkaW9XaWR0aCkgPyBvcHRpb25zLmF1ZGlvV2lkdGggKyAncHgnIDogb3B0aW9ucy5hdWRpb1dpZHRoO1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9IZWlnaHQgPSAhb3B0aW9ucy5hdWRpb0hlaWdodCA/ICcnIDogdXRpbC5pc051bWJlcihvcHRpb25zLmF1ZGlvSGVpZ2h0KSA/IG9wdGlvbnMuYXVkaW9IZWlnaHQgKyAncHgnIDogb3B0aW9ucy5hdWRpb0hlaWdodDtcclxuICAgICAgICBvcHRpb25zLmF1ZGlvRmlsZUlucHV0ID0gISFvcHRpb25zLmF1ZGlvRmlsZUlucHV0O1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9VcmxJbnB1dCA9IChvcHRpb25zLmF1ZGlvVXJsSW5wdXQgPT09IHVuZGVmaW5lZCB8fCAhb3B0aW9ucy5hdWRpb0ZpbGVJbnB1dCkgPyB0cnVlIDogb3B0aW9ucy5hdWRpb1VybElucHV0O1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9VcGxvYWRIZWFkZXIgPSBvcHRpb25zLmF1ZGlvVXBsb2FkSGVhZGVyIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5hdWRpb1VwbG9hZFVybCA9IHR5cGVvZiBvcHRpb25zLmF1ZGlvVXBsb2FkVXJsID09PSAnc3RyaW5nJyA/IG9wdGlvbnMuYXVkaW9VcGxvYWRVcmwgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9VcGxvYWRTaXplTGltaXQgPSAvXFxkKy8udGVzdChvcHRpb25zLmF1ZGlvVXBsb2FkU2l6ZUxpbWl0KSA/IHV0aWwuZ2V0TnVtYmVyKG9wdGlvbnMuYXVkaW9VcGxvYWRTaXplTGltaXQsIDApIDogbnVsbDtcclxuICAgICAgICBvcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlID0gISFvcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlO1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9UYWdBdHRycyA9IG9wdGlvbnMuYXVkaW9UYWdBdHRycyB8fCBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW9BY2NlcHQgPSAodHlwZW9mIG9wdGlvbnMuYXVkaW9BY2NlcHQgIT09ICdzdHJpbmcnIHx8IG9wdGlvbnMuYXVkaW9BY2NlcHQudHJpbSgpID09PSBcIipcIikgPyAnYXVkaW8vKicgOiBvcHRpb25zLmF1ZGlvQWNjZXB0LnRyaW0oKSB8fCAnYXVkaW8vKic7XHJcbiAgICAgICAgLyoqIFRhYmxlICovXHJcbiAgICAgICAgb3B0aW9ucy50YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24gPSB0eXBlb2Ygb3B0aW9ucy50YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24gPT09ICdzdHJpbmcnID8gb3B0aW9ucy50YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24udG9Mb3dlckNhc2UoKSA6ICdjZWxsJztcclxuICAgICAgICAvKiogTGluayAqL1xyXG4gICAgICAgIG9wdGlvbnMubGlua1Byb3RvY29sID0gdHlwZW9mIG9wdGlvbnMubGlua1Byb3RvY29sID09PSAnc3RyaW5nJyA/IG9wdGlvbnMubGlua1Byb3RvY29sIDogbnVsbDtcclxuICAgICAgICBvcHRpb25zLmxpbmtSZWwgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMubGlua1JlbCkgPyBvcHRpb25zLmxpbmtSZWwgOiBbXTtcclxuICAgICAgICAvKiogS2V5IGFjdGlvbnMgKi9cclxuICAgICAgICBvcHRpb25zLnRhYkRpc2FibGUgPSAhIW9wdGlvbnMudGFiRGlzYWJsZTtcclxuICAgICAgICBvcHRpb25zLnNob3J0Y3V0c0Rpc2FibGUgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuc2hvcnRjdXRzRGlzYWJsZSkgPyBvcHRpb25zLnNob3J0Y3V0c0Rpc2FibGUgOiBbXTtcclxuICAgICAgICBvcHRpb25zLnNob3J0Y3V0c0hpbnQgPSBvcHRpb25zLnNob3J0Y3V0c0hpbnQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiAhIW9wdGlvbnMuc2hvcnRjdXRzSGludDtcclxuICAgICAgICAvKiogRGVmaW5pbmcgc2F2ZSBidXR0b24gKi9cclxuICAgICAgICBvcHRpb25zLmNhbGxCYWNrU2F2ZSA9ICFvcHRpb25zLmNhbGxCYWNrU2F2ZSA/IG51bGwgOiBvcHRpb25zLmNhbGxCYWNrU2F2ZTtcclxuICAgICAgICAvKiogVGVtcGxhdGVzIEFycmF5ICovXHJcbiAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXMgPSAhb3B0aW9ucy50ZW1wbGF0ZXMgPyBudWxsIDogb3B0aW9ucy50ZW1wbGF0ZXM7XHJcbiAgICAgICAgLyoqIEVUQyAqL1xyXG4gICAgICAgIG9wdGlvbnMucGxhY2Vob2xkZXIgPSB0eXBlb2Ygb3B0aW9ucy5wbGFjZWhvbGRlciA9PT0gJ3N0cmluZycgPyBvcHRpb25zLnBsYWNlaG9sZGVyIDogbnVsbDtcclxuICAgICAgICAvKiogQnV0dG9ucyAqL1xyXG4gICAgICAgIG9wdGlvbnMuYnV0dG9uTGlzdCA9ICEhb3B0aW9ucy5idXR0b25MaXN0ID8gb3B0aW9ucy5idXR0b25MaXN0IDogW1xyXG4gICAgICAgICAgICBbJ3VuZG8nLCAncmVkbyddLFxyXG4gICAgICAgICAgICBbJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2l0YWxpYycsICdzdHJpa2UnLCAnc3Vic2NyaXB0JywgJ3N1cGVyc2NyaXB0J10sXHJcbiAgICAgICAgICAgIFsncmVtb3ZlRm9ybWF0J10sXHJcbiAgICAgICAgICAgIFsnb3V0ZGVudCcsICdpbmRlbnQnXSxcclxuICAgICAgICAgICAgWydmdWxsU2NyZWVuJywgJ3Nob3dCbG9ja3MnLCAnY29kZVZpZXcnXSxcclxuICAgICAgICAgICAgWydwcmV2aWV3JywgJ3ByaW50J11cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvKiogUlRMIC0gYnV0dG9ucyAqL1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJ0bCkge1xyXG4gICAgICAgICAgICBvcHRpb25zLmJ1dHRvbkxpc3QgPSBvcHRpb25zLmJ1dHRvbkxpc3QucmV2ZXJzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIC0tLSBEZWZpbmUgaWNvbnMgLS0tICovXHJcbiAgICAgICAgLy8gY3VzdG9tIGljb25zXHJcbiAgICAgICAgb3B0aW9ucy5pY29ucyA9ICghb3B0aW9ucy5pY29ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pY29ucyAhPT0gJ29iamVjdCcpID8gX2ljb25zIDogW19pY29ucywgb3B0aW9ucy5pY29uc10ucmVkdWNlKGZ1bmN0aW9uIChfZGVmYXVsdCwgX25ldykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX25ldykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaGFzT3duKF9uZXcsIGtleSkpIF9kZWZhdWx0W2tleV0gPSBfbmV3W2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0O1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgICAvLyBydGwgaWNvbnNcclxuICAgICAgICBvcHRpb25zLmljb25zID0gIW9wdGlvbnMucnRsID8gb3B0aW9ucy5pY29ucyA6IFtvcHRpb25zLmljb25zLCBvcHRpb25zLmljb25zLnJ0bF0ucmVkdWNlKGZ1bmN0aW9uIChfZGVmYXVsdCwgX25ldykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX25ldykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaGFzT3duKF9uZXcsIGtleSkpIF9kZWZhdWx0W2tleV0gPSBfbmV3W2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0O1xyXG4gICAgICAgIH0sIHt9KTtcclxuXHJcbiAgICAgICAgLyoqIF9pbml0IG9wdGlvbnMgKi9cclxuICAgICAgICBvcHRpb25zLl9lZGl0b3JTdHlsZXMgPSB1dGlsLl9zZXREZWZhdWx0T3B0aW9uU3R5bGUob3B0aW9ucywgb3B0aW9ucy5kZWZhdWx0U3R5bGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdW5lZGl0b3IncyBEZWZhdWx0IGJ1dHRvbiBsaXN0XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvcHRpb25zXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfZGVmYXVsdEJ1dHRvbnM6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25zO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBvcHRpb25zLmxhbmc7XHJcbiAgICAgICAgY29uc3QgY21kID0gdXRpbC5pc09TWF9JT1MgPyAn4oyYJyA6ICdDVFJMJztcclxuICAgICAgICBjb25zdCBhZGRTaGlmdCA9IHV0aWwuaXNPU1hfSU9TID8gJ+KHpycgOiAnK1NISUZUJztcclxuICAgICAgICBjb25zdCBzaG9ydGN1dHNEaXNhYmxlID0gIW9wdGlvbnMuc2hvcnRjdXRzSGludCA/IFsnYm9sZCcsICdzdHJpa2UnLCAndW5kZXJsaW5lJywgJ2l0YWxpYycsICd1bmRvJywgJ2luZGVudCcsICdzYXZlJ10gOiBvcHRpb25zLnNob3J0Y3V0c0Rpc2FibGU7XHJcbiAgICAgICAgY29uc3QgaW5kZW50S2V5ID0gb3B0aW9ucy5ydGwgPyBbJ1snLCddJ10gOiBbJ10nLCdbJ107XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8qKiBkZWZhdWx0IGNvbW1hbmQgKi9cclxuICAgICAgICAgICAgYm9sZDogWydfc2VfY29tbWFuZF9ib2xkJywgbGFuZy50b29sYmFyLmJvbGQgKyAnPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dFwiPicgKyAoc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdib2xkJykgPiAtMSA/ICcnIDogY21kICsgJys8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0LWtleVwiPkI8L3NwYW4+JykgKyAnPC9zcGFuPicsICdib2xkJywgJycsIGljb25zLmJvbGRdLFxyXG4gICAgICAgICAgICB1bmRlcmxpbmU6IFsnX3NlX2NvbW1hbmRfdW5kZXJsaW5lJywgbGFuZy50b29sYmFyLnVuZGVybGluZSArICc8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0XCI+JyArIChzaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3VuZGVybGluZScpID4gLTEgPyAnJyA6IGNtZCArICcrPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dC1rZXlcIj5VPC9zcGFuPicpICsgJzwvc3Bhbj4nLCAndW5kZXJsaW5lJywgJycsIGljb25zLnVuZGVybGluZV0sXHJcbiAgICAgICAgICAgIGl0YWxpYzogWydfc2VfY29tbWFuZF9pdGFsaWMnLCBsYW5nLnRvb2xiYXIuaXRhbGljICsgJzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXRcIj4nICsgKHNob3J0Y3V0c0Rpc2FibGUuaW5kZXhPZignaXRhbGljJykgPiAtMSA/ICcnIDogY21kICsgJys8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0LWtleVwiPkk8L3NwYW4+JykgKyAnPC9zcGFuPicsICdpdGFsaWMnLCAnJywgaWNvbnMuaXRhbGljXSxcclxuICAgICAgICAgICAgc3RyaWtlOiBbJ19zZV9jb21tYW5kX3N0cmlrZScsIGxhbmcudG9vbGJhci5zdHJpa2UgKyAnPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dFwiPicgKyAoc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdzdHJpa2UnKSA+IC0xID8gJycgOiBjbWQgKyBhZGRTaGlmdCArICcrPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dC1rZXlcIj5TPC9zcGFuPicpICsgJzwvc3Bhbj4nLCAnc3RyaWtlJywgJycsIGljb25zLnN0cmlrZV0sXHJcbiAgICAgICAgICAgIHN1YnNjcmlwdDogWydfc2VfY29tbWFuZF9zdWJzY3JpcHQnLCBsYW5nLnRvb2xiYXIuc3Vic2NyaXB0LCAnU1VCJywgJycsIGljb25zLnN1YnNjcmlwdF0sXHJcbiAgICAgICAgICAgIHN1cGVyc2NyaXB0OiBbJ19zZV9jb21tYW5kX3N1cGVyc2NyaXB0JywgbGFuZy50b29sYmFyLnN1cGVyc2NyaXB0LCAnU1VQJywgJycsIGljb25zLnN1cGVyc2NyaXB0XSxcclxuICAgICAgICAgICAgcmVtb3ZlRm9ybWF0OiBbJycsIGxhbmcudG9vbGJhci5yZW1vdmVGb3JtYXQsICdyZW1vdmVGb3JtYXQnLCAnJywgaWNvbnMuZXJhc2VdLFxyXG4gICAgICAgICAgICBpbmRlbnQ6IFsnX3NlX2NvbW1hbmRfaW5kZW50JywgbGFuZy50b29sYmFyLmluZGVudCArICc8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0XCI+JyArIChzaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ2luZGVudCcpID4gLTEgPyAnJyA6IGNtZCArICcrPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dC1rZXlcIj4nICsgaW5kZW50S2V5WzBdICsgJzwvc3Bhbj4nKSArICc8L3NwYW4+JywgJ2luZGVudCcsICcnLCBpY29ucy5vdXRkZW50XSxcclxuICAgICAgICAgICAgb3V0ZGVudDogWydfc2VfY29tbWFuZF9vdXRkZW50JywgbGFuZy50b29sYmFyLm91dGRlbnQgKyAnPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dFwiPicgKyAoc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdpbmRlbnQnKSA+IC0xID8gJycgOiBjbWQgKyAnKzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXQta2V5XCI+JyArIGluZGVudEtleVsxXSArICc8L3NwYW4+JykgKyAnPC9zcGFuPicsICdvdXRkZW50JywgJycsIGljb25zLmluZGVudF0sXHJcbiAgICAgICAgICAgIGZ1bGxTY3JlZW46IFsnc2UtY29kZS12aWV3LWVuYWJsZWQgc2UtcmVzaXppbmctZW5hYmxlZCBfc2VfY29tbWFuZF9mdWxsU2NyZWVuJywgbGFuZy50b29sYmFyLmZ1bGxTY3JlZW4sICdmdWxsU2NyZWVuJywgJycsIGljb25zLmV4cGFuc2lvbl0sXHJcbiAgICAgICAgICAgIHNob3dCbG9ja3M6IFsnX3NlX2NvbW1hbmRfc2hvd0Jsb2NrcycsIGxhbmcudG9vbGJhci5zaG93QmxvY2tzLCAnc2hvd0Jsb2NrcycsICcnLCBpY29ucy5zaG93X2Jsb2Nrc10sXHJcbiAgICAgICAgICAgIGNvZGVWaWV3OiBbJ3NlLWNvZGUtdmlldy1lbmFibGVkIHNlLXJlc2l6aW5nLWVuYWJsZWQgX3NlX2NvbW1hbmRfY29kZVZpZXcnLCBsYW5nLnRvb2xiYXIuY29kZVZpZXcsICdjb2RlVmlldycsICcnLCBpY29ucy5jb2RlX3ZpZXddLFxyXG4gICAgICAgICAgICB1bmRvOiBbJ19zZV9jb21tYW5kX3VuZG8gc2UtcmVzaXppbmctZW5hYmxlZCcsIGxhbmcudG9vbGJhci51bmRvICsgJzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXRcIj4nICsgKHNob3J0Y3V0c0Rpc2FibGUuaW5kZXhPZigndW5kbycpID4gLTEgPyAnJyA6IGNtZCArICcrPHNwYW4gY2xhc3M9XCJzZS1zaG9ydGN1dC1rZXlcIj5aPC9zcGFuPicpICsgJzwvc3Bhbj4nLCAndW5kbycsICcnLCBpY29ucy51bmRvXSxcclxuICAgICAgICAgICAgcmVkbzogWydfc2VfY29tbWFuZF9yZWRvIHNlLXJlc2l6aW5nLWVuYWJsZWQnLCBsYW5nLnRvb2xiYXIucmVkbyArICc8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0XCI+JyArIChzaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3VuZG8nKSA+IC0xID8gJycgOiBjbWQgKyAnKzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXQta2V5XCI+WTwvc3Bhbj4gLyAnICsgY21kICsgYWRkU2hpZnQgKyAnKzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXQta2V5XCI+Wjwvc3Bhbj4nKSArICc8L3NwYW4+JywgJ3JlZG8nLCAnJywgaWNvbnMucmVkb10sXHJcbiAgICAgICAgICAgIHByZXZpZXc6IFsnc2UtcmVzaXppbmctZW5hYmxlZCcsIGxhbmcudG9vbGJhci5wcmV2aWV3LCAncHJldmlldycsICcnLCBpY29ucy5wcmV2aWV3XSxcclxuICAgICAgICAgICAgcHJpbnQ6IFsnc2UtcmVzaXppbmctZW5hYmxlZCcsIGxhbmcudG9vbGJhci5wcmludCwgJ3ByaW50JywgJycsIGljb25zLnByaW50XSxcclxuICAgICAgICAgICAgc2F2ZTogWydfc2VfY29tbWFuZF9zYXZlIHNlLXJlc2l6aW5nLWVuYWJsZWQnLCBsYW5nLnRvb2xiYXIuc2F2ZSArICc8c3BhbiBjbGFzcz1cInNlLXNob3J0Y3V0XCI+JyArIChzaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3NhdmUnKSA+IC0xID8gJycgOiBjbWQgKyAnKzxzcGFuIGNsYXNzPVwic2Utc2hvcnRjdXQta2V5XCI+Uzwvc3Bhbj4nKSArICc8L3NwYW4+JywgJ3NhdmUnLCAnJywgaWNvbnMuc2F2ZV0sXHJcbiAgICAgICAgICAgIC8qKiBwbHVnaW5zIC0gY29tbWFuZCAqL1xyXG4gICAgICAgICAgICBibG9ja3F1b3RlOiBbJycsIGxhbmcudG9vbGJhci50YWdfYmxvY2txdW90ZSwgJ2Jsb2NrcXVvdGUnLCAnY29tbWFuZCcsIGljb25zLmJsb2NrcXVvdGVdLFxyXG4gICAgICAgICAgICAvKiogcGx1Z2lucyAtIHN1Ym1lbnUgKi9cclxuICAgICAgICAgICAgZm9udDogWydzZS1idG4tc2VsZWN0IHNlLWJ0bi10b29sLWZvbnQnLCBsYW5nLnRvb2xiYXIuZm9udCwgJ2ZvbnQnLCAnc3VibWVudScsICc8c3BhbiBjbGFzcz1cInR4dFwiPicgKyBsYW5nLnRvb2xiYXIuZm9udCArICc8L3NwYW4+JyArIGljb25zLmFycm93X2Rvd25dLFxyXG4gICAgICAgICAgICBmb3JtYXRCbG9jazogWydzZS1idG4tc2VsZWN0IHNlLWJ0bi10b29sLWZvcm1hdCcsIGxhbmcudG9vbGJhci5mb3JtYXRzLCAnZm9ybWF0QmxvY2snLCAnc3VibWVudScsICc8c3BhbiBjbGFzcz1cInR4dFwiPicgKyBsYW5nLnRvb2xiYXIuZm9ybWF0cyArICc8L3NwYW4+JyArIGljb25zLmFycm93X2Rvd25dLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogWydzZS1idG4tc2VsZWN0IHNlLWJ0bi10b29sLXNpemUnLCBsYW5nLnRvb2xiYXIuZm9udFNpemUsICdmb250U2l6ZScsICdzdWJtZW51JywgJzxzcGFuIGNsYXNzPVwidHh0XCI+JyArIGxhbmcudG9vbGJhci5mb250U2l6ZSArICc8L3NwYW4+JyArIGljb25zLmFycm93X2Rvd25dLFxyXG4gICAgICAgICAgICBmb250Q29sb3I6IFsnJywgbGFuZy50b29sYmFyLmZvbnRDb2xvciwgJ2ZvbnRDb2xvcicsICdzdWJtZW51JywgaWNvbnMuZm9udF9jb2xvcl0sXHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yOiBbJycsIGxhbmcudG9vbGJhci5oaWxpdGVDb2xvciwgJ2hpbGl0ZUNvbG9yJywgJ3N1Ym1lbnUnLCBpY29ucy5oaWdobGlnaHRfY29sb3JdLFxyXG4gICAgICAgICAgICBhbGlnbjogWydzZS1idG4tYWxpZ24nLCBsYW5nLnRvb2xiYXIuYWxpZ24sICdhbGlnbicsICdzdWJtZW51JywgKG9wdGlvbnMucnRsID8gaWNvbnMuYWxpZ25fcmlnaHQgOiBpY29ucy5hbGlnbl9sZWZ0KV0sXHJcbiAgICAgICAgICAgIGxpc3Q6IFsnJywgbGFuZy50b29sYmFyLmxpc3QsICdsaXN0JywgJ3N1Ym1lbnUnLCBpY29ucy5saXN0X251bWJlcl0sXHJcbiAgICAgICAgICAgIGhvcml6b250YWxSdWxlOiBbJ2J0bl9saW5lJywgbGFuZy50b29sYmFyLmhvcml6b250YWxSdWxlLCAnaG9yaXpvbnRhbFJ1bGUnLCAnc3VibWVudScsIGljb25zLmhvcml6b250YWxfcnVsZV0sXHJcbiAgICAgICAgICAgIHRhYmxlOiBbJycsIGxhbmcudG9vbGJhci50YWJsZSwgJ3RhYmxlJywgJ3N1Ym1lbnUnLCBpY29ucy50YWJsZV0sXHJcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFsnJywgbGFuZy50b29sYmFyLmxpbmVIZWlnaHQsICdsaW5lSGVpZ2h0JywgJ3N1Ym1lbnUnLCBpY29ucy5saW5lX2hlaWdodF0sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiBbJycsIGxhbmcudG9vbGJhci50ZW1wbGF0ZSwgJ3RlbXBsYXRlJywgJ3N1Ym1lbnUnLCBpY29ucy50ZW1wbGF0ZV0sXHJcbiAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlOiBbJycsIGxhbmcudG9vbGJhci5wYXJhZ3JhcGhTdHlsZSwgJ3BhcmFncmFwaFN0eWxlJywgJ3N1Ym1lbnUnLCBpY29ucy5wYXJhZ3JhcGhfc3R5bGVdLFxyXG4gICAgICAgICAgICB0ZXh0U3R5bGU6IFsnJywgbGFuZy50b29sYmFyLnRleHRTdHlsZSwgJ3RleHRTdHlsZScsICdzdWJtZW51JywgaWNvbnMudGV4dF9zdHlsZV0sXHJcbiAgICAgICAgICAgIC8qKiBwbHVnaW5zIC0gZGlhbG9nICovXHJcbiAgICAgICAgICAgIGxpbms6IFsnJywgbGFuZy50b29sYmFyLmxpbmssICdsaW5rJywgJ2RpYWxvZycsIGljb25zLmxpbmtdLFxyXG4gICAgICAgICAgICBpbWFnZTogWycnLCBsYW5nLnRvb2xiYXIuaW1hZ2UsICdpbWFnZScsICdkaWFsb2cnLCBpY29ucy5pbWFnZV0sXHJcbiAgICAgICAgICAgIHZpZGVvOiBbJycsIGxhbmcudG9vbGJhci52aWRlbywgJ3ZpZGVvJywgJ2RpYWxvZycsIGljb25zLnZpZGVvXSxcclxuICAgICAgICAgICAgYXVkaW86IFsnJywgbGFuZy50b29sYmFyLmF1ZGlvLCAnYXVkaW8nLCAnZGlhbG9nJywgaWNvbnMuYXVkaW9dLFxyXG4gICAgICAgICAgICBtYXRoOiBbJycsIGxhbmcudG9vbGJhci5tYXRoLCAnbWF0aCcsICdkaWFsb2cnLCBpY29ucy5tYXRoXSxcclxuICAgICAgICAgICAgLyoqIHBsdWdpbnMgLSBmaWxlQnJvd3NlciAqL1xyXG4gICAgICAgICAgICBpbWFnZUdhbGxlcnk6IFsnJywgbGFuZy50b29sYmFyLmltYWdlR2FsbGVyeSwgJ2ltYWdlR2FsbGVyeScsICdmaWxlQnJvd3NlcicsIGljb25zLmltYWdlX2dhbGxlcnldXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgZ3JvdXAgZGl2IGNvbnRhaW5pbmcgZWFjaCBtb2R1bGVcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfY3JlYXRlTW9kdWxlR3JvdXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBvRGl2ID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBvRGl2LmNsYXNzTmFtZSA9ICdzZS1idG4tbW9kdWxlIHNlLWJ0bi1tb2R1bGUtYm9yZGVyJztcclxuXHJcbiAgICAgICAgY29uc3Qgb1VsID0gdXRpbC5jcmVhdGVFbGVtZW50KCdVTCcpO1xyXG4gICAgICAgIG9VbC5jbGFzc05hbWUgPSAnc2UtbWVudS1saXN0JztcclxuICAgICAgICBvRGl2LmFwcGVuZENoaWxkKG9VbCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICdkaXYnOiBvRGl2LFxyXG4gICAgICAgICAgICAndWwnOiBvVWxcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBidXR0b24gZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1dHRvbkNsYXNzIGNsYXNzTmFtZSBpbiBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRsZSBpbiBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhQ29tbWFuZCBUaGUgZGF0YS1jb21tYW5kIHByb3BlcnR5IG9mIHRoZSBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhRGlzcGxheSBUaGUgZGF0YS1kaXNwbGF5IHByb3BlcnR5IG9mIHRoZSBidXR0b24gKCdkaWFsb2cnLCAnc3VibWVudScsICdjb21tYW5kJylcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbm5lckhUTUwgSHRtbCBpbiBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBfZGlzYWJsZWQgQnV0dG9uIGRpc2FibGVkXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gX2ljb25zIEljb25zXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2NyZWF0ZUJ1dHRvbjogZnVuY3Rpb24gKGJ1dHRvbkNsYXNzLCB0aXRsZSwgZGF0YUNvbW1hbmQsIGRhdGFEaXNwbGF5LCBpbm5lckhUTUwsIF9kaXNhYmxlZCwgX2ljb25zKSB7XHJcbiAgICAgICAgY29uc3Qgb0xpID0gdXRpbC5jcmVhdGVFbGVtZW50KCdMSScpO1xyXG4gICAgICAgIGNvbnN0IG9CdXR0b24gPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JVVFRPTicpO1xyXG5cclxuICAgICAgICBvQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgICAgICBvQnV0dG9uLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnc2UtYnRuJyArIChidXR0b25DbGFzcyA/ICcgJyArIGJ1dHRvbkNsYXNzIDogJycpICsgJyBzZS10b29sdGlwJyk7XHJcbiAgICAgICAgb0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcsIGRhdGFDb21tYW5kKTtcclxuICAgICAgICBvQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNwbGF5JywgZGF0YURpc3BsYXkpO1xyXG4gICAgICAgIG9CdXR0b24uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghaW5uZXJIVE1MKSBpbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJzZS1pY29uLXRleHRcIj4hPC9zcGFuPic7XHJcbiAgICAgICAgaWYgKC9eZGVmYXVsdFxcLi9pLnRlc3QoaW5uZXJIVE1MKSkge1xyXG4gICAgICAgICAgICBpbm5lckhUTUwgPSBfaWNvbnNbaW5uZXJIVE1MLnJlcGxhY2UoL15kZWZhdWx0XFwuL2ksICcnKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgvXnRleHRcXC4vaS50ZXN0KGlubmVySFRNTCkpIHtcclxuICAgICAgICAgICAgaW5uZXJIVE1MID0gaW5uZXJIVE1MLnJlcGxhY2UoL150ZXh0XFwuL2ksICcnKTtcclxuICAgICAgICAgICAgb0J1dHRvbi5jbGFzc05hbWUgKz0gJyBzZS1idG4tbW9yZS10ZXh0JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgKHRpdGxlIHx8IGRhdGFDb21tYW5kKSArICc8L3NwYW4+PC9zcGFuPic7XHJcblxyXG4gICAgICAgIGlmIChfZGlzYWJsZWQpIG9CdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIG9CdXR0b24uaW5uZXJIVE1MID0gaW5uZXJIVE1MO1xyXG4gICAgICAgIG9MaS5hcHBlbmRDaGlsZChvQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgJ2xpJzogb0xpLFxyXG4gICAgICAgICAgICAnYnV0dG9uJzogb0J1dHRvblxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBlZGl0b3IgSFRNTFxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gZG9jIGRvY3VtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gYnV0dG9uTGlzdCBvcHRpb24uYnV0dG9uTGlzdFxyXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8bnVsbH0gX3BsdWdpbnMgUGx1Z2luc1xyXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucyBvcHRpb25zXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IGVsZW1lbnQ6IChFbGVtZW50KSBUb29sYmFyIGVsZW1lbnQsIHBsdWdpbnM6IChBcnJheXxudWxsKSBQbHVnaW5zIEFycmF5LCBwbHVnaW5DYWxsQnV0dG9uczogKE9iamVjdCksIHJlc3BvbnNpdmVCdXR0b25zOiAoQXJyYXkpIH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9jcmVhdGVUb29sQmFyOiBmdW5jdGlvbiAoZG9jLCBidXR0b25MaXN0LCBfcGx1Z2lucywgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHNlcGFyYXRvcl92ZXJ0aWNhbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBzZXBhcmF0b3JfdmVydGljYWwuY2xhc3NOYW1lID0gJ3NlLXRvb2xiYXItc2VwYXJhdG9yLXZlcnRpY2FsJztcclxuXHJcbiAgICAgICAgY29uc3QgdG9vbF9iYXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgdG9vbF9iYXIuY2xhc3NOYW1lID0gJ3NlLXRvb2xiYXIgc3VuLWVkaXRvci1jb21tb24nO1xyXG5cclxuICAgICAgICBjb25zdCBfYnV0dG9uVHJheSA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBfYnV0dG9uVHJheS5jbGFzc05hbWUgPSAnc2UtYnRuLXRyYXknO1xyXG4gICAgICAgIHRvb2xfYmFyLmFwcGVuZENoaWxkKF9idXR0b25UcmF5KTtcclxuXHJcbiAgICAgICAgLyoqIGNyZWF0ZSBidXR0b24gbGlzdCAqL1xyXG4gICAgICAgIGJ1dHRvbkxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGJ1dHRvbkxpc3QpKTtcclxuICAgICAgICBjb25zdCBpY29ucyA9IG9wdGlvbnMuaWNvbnM7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdEJ1dHRvbkxpc3QgPSB0aGlzLl9kZWZhdWx0QnV0dG9ucyhvcHRpb25zKTtcclxuICAgICAgICBjb25zdCBwbHVnaW5DYWxsQnV0dG9ucyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNpdmVCdXR0b25zID0gW107XHJcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IHt9O1xyXG4gICAgICAgIGlmIChfcGx1Z2lucykge1xyXG4gICAgICAgICAgICBjb25zdCBwbHVnaW5zVmFsdWVzID0gX3BsdWdpbnMubGVuZ3RoID8gX3BsdWdpbnMgOiBPYmplY3Qua2V5cyhfcGx1Z2lucykubWFwKGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIF9wbHVnaW5zW25hbWVdOyB9KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBsdWdpbnNWYWx1ZXMubGVuZ3RoLCBwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHAgPSBwbHVnaW5zVmFsdWVzW2ldLmRlZmF1bHQgfHwgcGx1Z2luc1ZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICAgIHBsdWdpbnNbcC5uYW1lXSA9IHA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtb2R1bGUgPSBudWxsO1xyXG4gICAgICAgIGxldCBidXR0b24gPSBudWxsO1xyXG4gICAgICAgIGxldCBtb2R1bGVFbGVtZW50ID0gbnVsbDtcclxuICAgICAgICBsZXQgYnV0dG9uRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSAnJztcclxuICAgICAgICBsZXQgdmVydGljYWwgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBtb3JlTGF5ZXIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIG1vcmVMYXllci5jbGFzc05hbWUgPSAnc2UtdG9vbGJhci1tb3JlLWxheWVyJztcclxuXHJcbiAgICAgICAgYnV0dG9uR3JvdXBMb29wOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtb3JlLCBtb3JlQ29udGFpbmVyLCBtb3JlQ29tbWFuZCwgYnV0dG9uR3JvdXAsIGFsaWduOyBpIDwgYnV0dG9uTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtb3JlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGFsaWduID0gJyc7XHJcbiAgICAgICAgICAgIGJ1dHRvbkdyb3VwID0gYnV0dG9uTGlzdFtpXTtcclxuICAgICAgICAgICAgbW9kdWxlRWxlbWVudCA9IHRoaXMuX2NyZWF0ZU1vZHVsZUdyb3VwKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBidXR0b24gb2JqZWN0XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnV0dG9uR3JvdXAgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBidXR0b25zIGxvb3BcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBtb3JlQnV0dG9uOyBqIDwgYnV0dG9uR3JvdXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24gPSBidXR0b25Hcm91cFtqXTtcclxuICAgICAgICAgICAgICAgICAgICBtb3JlQnV0dG9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXlxcJVxcZCsvLnRlc3QoYnV0dG9uKSAmJiBqID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkdyb3VwWzBdID0gYnV0dG9uLnJlcGxhY2UoL1teXFxkXS9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVCdXR0b25zLnB1c2goYnV0dG9uR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25MaXN0LnNwbGljZShpLS0sIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBidXR0b25Hcm91cExvb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnV0dG9uID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJ1dHRvbi5hZGQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbk5hbWUgPSBidXR0b24ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IGRlZmF1bHRCdXR0b25MaXN0W3BsdWdpbk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luc1twbHVnaW5OYW1lXSA9IGJ1dHRvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbk5hbWUgPSBidXR0b24ubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IFtidXR0b24uYnV0dG9uQ2xhc3MsIGJ1dHRvbi50aXRsZSwgYnV0dG9uLm5hbWUsIGJ1dHRvbi5kYXRhRGlzcGxheSwgYnV0dG9uLmlubmVySFRNTCwgYnV0dG9uLl9kaXNhYmxlZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGlnblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoL15cXC0vLnRlc3QoYnV0dG9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBidXR0b24uc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5kaXYuc3R5bGUuZmxvYXQgPSBhbGlnbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoL15cXDovLnRlc3QoYnV0dG9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gYnV0dG9uLm1hdGNoKC9eXFw6KFteXFwtXSspXFwtKFteXFwtXSspXFwtKFteXFwtXSspLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlQ29tbWFuZCA9ICdfX3NlX18nICsgbWF0Y2hlZFsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IG1hdGNoZWRbMl0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJIVE1MID0gbWF0Y2hlZFszXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBbJ3NlLWJ0bi1tb3JlJywgdGl0bGUsIG1vcmVDb21tYW5kLCAnTU9SRScsIGlubmVySFRNTF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0dG9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IGRlZmF1bHRCdXR0b25MaXN0W2J1dHRvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbk5hbWUgPSBidXR0b247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b20gPSBwbHVnaW5zW3BsdWdpbk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXN0b20pIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNyZWF0ZS50b29sYmFyLmZhaWxdIFRoZSBidXR0b24gbmFtZSBvZiBhIHBsdWdpbiB0aGF0IGRvZXMgbm90IGV4aXN0LiBbJyArIHBsdWdpbk5hbWUgKyAnXScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gW2N1c3RvbS5idXR0b25DbGFzcywgY3VzdG9tLnRpdGxlLCBjdXN0b20ubmFtZSwgY3VzdG9tLmRpc3BsYXksIGN1c3RvbS5pbm5lckhUTUwsIGN1c3RvbS5fZGlzYWJsZWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBidXR0b25FbGVtZW50ID0gdGhpcy5fY3JlYXRlQnV0dG9uKG1vZHVsZVswXSwgbW9kdWxlWzFdLCBtb2R1bGVbMl0sIG1vZHVsZVszXSwgbW9kdWxlWzRdLCBtb2R1bGVbNV0sIGljb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAobW9yZSA/IG1vcmVDb250YWluZXIgOiBtb2R1bGVFbGVtZW50LnVsKS5hcHBlbmRDaGlsZChidXR0b25FbGVtZW50LmxpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbnNbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luQ2FsbEJ1dHRvbnNbcGx1Z2luTmFtZV0gPSBidXR0b25FbGVtZW50LmJ1dHRvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVCdXR0b24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVDb250YWluZXIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzZS1tb3JlLWxheWVyICcgKyBtb3JlQ29tbWFuZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInNlLW1vcmUtZm9ybVwiPjx1bCBjbGFzcz1cInNlLW1lbnUtbGlzdFwiJyArIChhbGlnbiA/ICcgc3R5bGU9XCJmbG9hdDogJyArIGFsaWduICsgJztcIicgOiAnJykgKyAnPjwvdWw+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUxheWVyLmFwcGVuZENoaWxkKG1vcmVDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGFpbmVyID0gbW9yZUNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3YgPSAgc2VwYXJhdG9yX3ZlcnRpY2FsLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWduKSBzdi5zdHlsZS5mbG9hdCA9IGFsaWduO1xyXG4gICAgICAgICAgICAgICAgICAgIF9idXR0b25UcmF5LmFwcGVuZENoaWxkKHN2KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgX2J1dHRvblRyYXkuYXBwZW5kQ2hpbGQobW9kdWxlRWxlbWVudC5kaXYpO1xyXG4gICAgICAgICAgICAgICAgdmVydGljYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8qKiBsaW5lIGJyZWFrICAqL1xyXG4gICAgICAgICAgICBlbHNlIGlmICgvXlxcLyQvLnRlc3QoYnV0dG9uR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRlckRpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgICAgIGVudGVyRGl2LmNsYXNzTmFtZSA9ICdzZS1idG4tbW9kdWxlLWVudGVyJztcclxuICAgICAgICAgICAgICAgIF9idXR0b25UcmF5LmFwcGVuZENoaWxkKGVudGVyRGl2KTtcclxuICAgICAgICAgICAgICAgIHZlcnRpY2FsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN3aXRjaCAoX2J1dHRvblRyYXkuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIF9idXR0b25UcmF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhfYnV0dG9uVHJheS5maXJzdEVsZW1lbnRDaGlsZCwgJ3NlLWJ0bi1tb2R1bGUtYm9yZGVyJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zaXZlQnV0dG9ucy5sZW5ndGggPiAwKSByZXNwb25zaXZlQnV0dG9ucy51bnNoaWZ0KGJ1dHRvbkxpc3QpO1xyXG4gICAgICAgIGlmIChtb3JlTGF5ZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkgX2J1dHRvblRyYXkuYXBwZW5kQ2hpbGQobW9yZUxheWVyKTtcclxuXHJcbiAgICAgICAgLy8gbWVudSB0cmF5XHJcbiAgICAgICAgY29uc3QgX21lbnVUcmF5ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIF9tZW51VHJheS5jbGFzc05hbWUgPSAnc2UtbWVudS10cmF5JztcclxuICAgICAgICB0b29sX2Jhci5hcHBlbmRDaGlsZChfbWVudVRyYXkpO1xyXG5cclxuICAgICAgICAvLyBjb3ZlclxyXG4gICAgICAgIGNvbnN0IHRvb2xfY292ZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgdG9vbF9jb3Zlci5jbGFzc05hbWUgPSAnc2UtdG9vbGJhci1jb3Zlcic7XHJcbiAgICAgICAgdG9vbF9iYXIuYXBwZW5kQ2hpbGQodG9vbF9jb3Zlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICdlbGVtZW50JzogdG9vbF9iYXIsXHJcbiAgICAgICAgICAgICdwbHVnaW5zJzogcGx1Z2lucyxcclxuICAgICAgICAgICAgJ3BsdWdpbkNhbGxCdXR0b25zJzogcGx1Z2luQ2FsbEJ1dHRvbnMsXHJcbiAgICAgICAgICAgICdyZXNwb25zaXZlQnV0dG9ucyc6IHJlc3BvbnNpdmVCdXR0b25zLFxyXG4gICAgICAgICAgICAnX21lbnVUcmF5JzogX21lbnVUcmF5LFxyXG4gICAgICAgICAgICAnX2J1dHRvblRyYXknOiBfYnV0dG9uVHJheVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn07IiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgYW5kIHZhcmlhYmxlcyB5b3Ugc2hvdWxkIGhhdmVcclxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IHRleHRhcmVhIGVsZW1lbnRcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbnMgVG9vbGJhciBlbGVtZW50IHlvdSBjcmVhdGVkXHJcbiAqIEBwYXJhbSB7SlNPTnxPYmplY3R9IG9wdGlvbnMgSW5zZXJ0ZWQgb3B0aW9uc1xyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB7RWxlbWVudHMsIHZhcmlhYmxlcyBvZiB0aGUgZWRpdG9yLCBvcHRpb259XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBfQ29udGV4dCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25zLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGVsZW1lbnQ6IHtcclxuICAgICAgICAgICAgb3JpZ2luRWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgdG9wQXJlYTogY29ucy5fdG9wLFxyXG4gICAgICAgICAgICByZWxhdGl2ZTogY29ucy5fcmVsYXRpdmUsXHJcbiAgICAgICAgICAgIHRvb2xiYXI6IGNvbnMuX3Rvb2xCYXIsXHJcbiAgICAgICAgICAgIF9idXR0b25UcmF5OiBjb25zLl90b29sQmFyLnF1ZXJ5U2VsZWN0b3IoJy5zZS1idG4tdHJheScpLFxyXG4gICAgICAgICAgICBfbWVudVRyYXk6IGNvbnMuX21lbnVUcmF5LFxyXG4gICAgICAgICAgICByZXNpemluZ0JhcjogY29ucy5fcmVzaXppbmdCYXIsXHJcbiAgICAgICAgICAgIG5hdmlnYXRpb246IGNvbnMuX25hdmlnYXRpb24sXHJcbiAgICAgICAgICAgIGNoYXJXcmFwcGVyOiBjb25zLl9jaGFyV3JhcHBlcixcclxuICAgICAgICAgICAgY2hhckNvdW50ZXI6IGNvbnMuX2NoYXJDb3VudGVyLFxyXG4gICAgICAgICAgICBlZGl0b3JBcmVhOiBjb25zLl9lZGl0b3JBcmVhLFxyXG4gICAgICAgICAgICB3eXNpd3lnRnJhbWU6IGNvbnMuX3d5c2l3eWdBcmVhLFxyXG4gICAgICAgICAgICB3eXNpd3lnOiBjb25zLl93eXNpd3lnQXJlYSwgLy8gaWYgKG9wdGlvbnMuaWZyYW1lKSBjb25zLl93eXNpd3lnQXJlYS5jb250ZW50RG9jdW1lbnQuYm9keVxyXG4gICAgICAgICAgICBjb2RlOiBjb25zLl9jb2RlQXJlYSxcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGNvbnMuX3BsYWNlaG9sZGVyLFxyXG4gICAgICAgICAgICBsb2FkaW5nOiBjb25zLl9sb2FkaW5nLFxyXG4gICAgICAgICAgICBsaW5lQnJlYWtlcjogY29ucy5fbGluZUJyZWFrZXIsXHJcbiAgICAgICAgICAgIGxpbmVCcmVha2VyX3Q6IGNvbnMuX2xpbmVCcmVha2VyX3QsXHJcbiAgICAgICAgICAgIGxpbmVCcmVha2VyX2I6IGNvbnMuX2xpbmVCcmVha2VyX2IsXHJcbiAgICAgICAgICAgIHJlc2l6ZUJhY2tncm91bmQ6IGNvbnMuX3Jlc2l6ZUJhY2ssXHJcbiAgICAgICAgICAgIF9zdGlja3lEdW1teTogY29ucy5fc3RpY2t5RHVtbXksXHJcbiAgICAgICAgICAgIF9hcnJvdzogY29ucy5fYXJyb3dcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2w6IHtcclxuICAgICAgICAgICAgY292ZXI6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLnNlLXRvb2xiYXItY292ZXInKSxcclxuICAgICAgICAgICAgYm9sZDogY29ucy5fdG9vbEJhci5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbW1hbmRfYm9sZCcpLFxyXG4gICAgICAgICAgICB1bmRlcmxpbmU6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX3VuZGVybGluZScpLFxyXG4gICAgICAgICAgICBpdGFsaWM6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX2l0YWxpYycpLFxyXG4gICAgICAgICAgICBzdHJpa2U6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX3N0cmlrZScpLFxyXG4gICAgICAgICAgICBzdWJzY3JpcHQ6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX3N1YnNjcmlwdCcpLFxyXG4gICAgICAgICAgICBzdXBlcnNjcmlwdDogY29ucy5fdG9vbEJhci5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbW1hbmRfc3VwZXJzY3JpcHQnKSxcclxuICAgICAgICAgICAgdW5kbzogY29ucy5fdG9vbEJhci5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbW1hbmRfdW5kbycpLFxyXG4gICAgICAgICAgICByZWRvOiBjb25zLl90b29sQmFyLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfY29tbWFuZF9yZWRvJyksXHJcbiAgICAgICAgICAgIHNhdmU6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX3NhdmUnKSxcclxuICAgICAgICAgICAgb3V0ZGVudDogY29ucy5fdG9vbEJhci5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbW1hbmRfb3V0ZGVudCcpLFxyXG4gICAgICAgICAgICBpbmRlbnQ6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX2luZGVudCcpLFxyXG4gICAgICAgICAgICBmdWxsU2NyZWVuOiBjb25zLl90b29sQmFyLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfY29tbWFuZF9mdWxsU2NyZWVuJyksXHJcbiAgICAgICAgICAgIHNob3dCbG9ja3M6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX3Nob3dCbG9ja3MnKSxcclxuICAgICAgICAgICAgY29kZVZpZXc6IGNvbnMuX3Rvb2xCYXIucXVlcnlTZWxlY3RvcignLl9zZV9jb21tYW5kX2NvZGVWaWV3JylcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXHJcbiAgICAgICAgb3B0aW9uOiBvcHRpb25zXHJcbiAgICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgX0NvbnRleHQ7IiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnbm90aWNlJyxcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29yZSBDb3JlIG9iamVjdCBcbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQubm90aWNlID0ge307XG5cbiAgICAgICAgLyoqIGRpYWxvZyAqL1xuICAgICAgICBsZXQgbm90aWNlX2RpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGV0IG5vdGljZV9zcGFuID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcbiAgICAgICAgbGV0IG5vdGljZV9idXR0b24gPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7XG5cbiAgICAgICAgbm90aWNlX2Rpdi5jbGFzc05hbWUgPSAnc2Utbm90aWNlJztcbiAgICAgICAgbm90aWNlX2J1dHRvbi5jbGFzc05hbWUgPSAnY2xvc2UnO1xuICAgICAgICBub3RpY2VfYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xuICAgICAgICBub3RpY2VfYnV0dG9uLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBjb3JlLmxhbmcuZGlhbG9nQm94LmNsb3NlKTtcbiAgICAgICAgbm90aWNlX2J1dHRvbi5pbm5lckhUTUwgPSBjb3JlLmljb25zLmNhbmNlbDtcbiAgICAgICAgXG4gICAgICAgIG5vdGljZV9kaXYuYXBwZW5kQ2hpbGQobm90aWNlX3NwYW4pO1xuICAgICAgICBub3RpY2VfZGl2LmFwcGVuZENoaWxkKG5vdGljZV9idXR0b24pO1xuXG4gICAgICAgIGNvbnRleHQubm90aWNlLm1vZGFsID0gbm90aWNlX2RpdjtcbiAgICAgICAgY29udGV4dC5ub3RpY2UubWVzc2FnZSA9IG5vdGljZV9zcGFuO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIG5vdGljZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfY2FuY2VsLmJpbmQoY29yZSkpO1xuICAgICAgICBcbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLmFwcGVuZENoaWxkKG5vdGljZV9kaXYpO1xuICAgICAgICBcbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBub3RpY2VfZGl2ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgRXZlbnQgb2JqZWN0XG4gICAgICovXG4gICAgb25DbGlja19jYW5jZWw6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLm5vdGljZS5jbG9zZS5jYWxsKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gIE9wZW4gdGhlIG5vdGljZSBwYW5lbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IE5vdGljZSBtZXNzYWdlXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKHRleHQpICB7XG4gICAgICAgIHRoaXMuY29udGV4dC5ub3RpY2UubWVzc2FnZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgIHRoaXMuY29udGV4dC5ub3RpY2UubW9kYWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiAgT3BlbiB0aGUgbm90aWNlIHBhbmVsXG4gICAgICovXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm5vdGljZS5tb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNvcmUgZnJvbSAnLi9saWIvY29yZSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2xpYi91dGlsJztcbmltcG9ydCBfQ29uc3RydWN0b3IgZnJvbSAnLi9saWIvY29uc3RydWN0b3InO1xuaW1wb3J0IF9Db250ZXh0IGZyb20gJy4vbGliL2NvbnRleHQnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNyZWF0ZSBmdW5jdGlvbiB3aXRoIHByZXNldCBvcHRpb25zLlxuICAgICAqIElmIHRoZSBvcHRpb25zIG92ZXJsYXAsIHRoZSBvcHRpb25zIG9mIHRoZSAnY3JlYXRlJyBmdW5jdGlvbiB0YWtlIHByZWNlZGVuY2UuXG4gICAgICogQHBhcmFtIHtKc29ufSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uIChpbml0X29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGlkT3JFbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKGlkT3JFbGVtZW50LCBvcHRpb25zLCBpbml0X29wdGlvbnMpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGhlIHN1bmVkaXRvclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR9IGlkT3JFbGVtZW50IHRleHRhcmVhIElkIG9yIHRleHRhcmVhIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0pTT058T2JqZWN0fSBvcHRpb25zIHVzZXIgb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoaWRPckVsZW1lbnQsIG9wdGlvbnMsIF9pbml0X29wdGlvbnMpIHtcbiAgICAgICAgdXRpbC5fcHJvcGVydGllc0luaXQoKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSBvcHRpb25zID0ge307XG4gICAgICAgIGlmIChfaW5pdF9vcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gIFtfaW5pdF9vcHRpb25zLCBvcHRpb25zXS5yZWR1Y2UoZnVuY3Rpb24gKGluaXQsIG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGlsLmhhc093bihvcHRpb24sIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAncGx1Z2lucycgJiYgb3B0aW9uW2tleV0gJiYgaW5pdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGluaXRba2V5XSwgbyA9IG9wdGlvbltrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkubGVuZ3RoID8gaSA6IE9iamVjdC5rZXlzKGkpLm1hcChmdW5jdGlvbihuYW1lKSB7IHJldHVybiBpW25hbWVdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBvLmxlbmd0aCA/IG8gOiBPYmplY3Qua2V5cyhvKS5tYXAoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gb1tuYW1lXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0W2tleV0gPSAoby5maWx0ZXIoZnVuY3Rpb24odmFsKSB7IHJldHVybiBpLmluZGV4T2YodmFsKSA9PT0gLTE7IH0pKS5jb25jYXQoaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0W2tleV0gPSBvcHRpb25ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHR5cGVvZiBpZE9yRWxlbWVudCA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZE9yRWxlbWVudCkgOiBpZE9yRWxlbWVudDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRPckVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuY3JlYXRlLmZhaWxdIFRoZSBlbGVtZW50IGZvciB0aGF0IGlkIHdhcyBub3QgZm91bmQgKElEOlwiJyArIGlkT3JFbGVtZW50ICsgJ1wiKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jcmVhdGUuZmFpbF0gc3VuZWRpdG9yIHJlcXVpcmVzIHRleHRhcmVhXFwncyBlbGVtZW50IG9yIGlkIHZhbHVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zID0gX0NvbnN0cnVjdG9yLmluaXQoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGNvbnMuY29uc3RydWN0ZWQuX3RvcC5pZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb25zLmNvbnN0cnVjdGVkLl90b3AuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jcmVhdGUuZmFpbF0gVGhlIElEIG9mIHRoZSBzdW5lZGl0b3IgeW91IGFyZSB0cnlpbmcgdG8gY3JlYXRlIGFscmVhZHkgZXhpc3RzIChJRDpcIicgKyBjb25zLmNvbnN0cnVjdGVkLl90b3AuaWQgKyAnXCIpJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29yZShfQ29udGV4dChlbGVtZW50LCBjb25zLmNvbnN0cnVjdGVkLCBjb25zLm9wdGlvbnMpLCBjb25zLnBsdWdpbkNhbGxCdXR0b25zLCBjb25zLnBsdWdpbnMsIGNvbnMub3B0aW9ucy5sYW5nLCBvcHRpb25zLCBjb25zLl9yZXNwb25zaXZlQnV0dG9ucyk7XG4gICAgfVxufTtcbiIsIi8qXHJcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxyXG4gKlxyXG4gKiBzdW5lZGl0b3IuanNcclxuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cclxuICogTUlUIGxpY2Vuc2UuXHJcbiAqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgX0NvbnN0cnVjdG9yIGZyb20gJy4vY29uc3RydWN0b3InO1xyXG5pbXBvcnQgX0NvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcclxuaW1wb3J0IF9oaXN0b3J5IGZyb20gJy4vaGlzdG9yeSc7XHJcbmltcG9ydCBfdXRpbCBmcm9tICcuL3V0aWwnO1xyXG5pbXBvcnQgX25vdGljZSBmcm9tICcuLi9wbHVnaW5zL21vZHVsZXMvX25vdGljZSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIFN1bkVkaXRvciBjb25zdHVjdG9yIGZ1bmN0aW9uLlxyXG4gKiBjcmVhdGUgY29yZSBvYmplY3QgYW5kIGV2ZW50IHJlZ2lzdHJhdGlvbi5cclxuICogY29yZSwgZXZlbnQsIGZ1bmN0aW9uc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxyXG4gKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luQ2FsbEJ1dHRvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbnMgXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYW5nXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBfcmVzcG9uc2l2ZUJ1dHRvbnNcclxuICogQHJldHVybnMge09iamVjdH0gZnVuY3Rpb25zIE9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbnRleHQsIHBsdWdpbkNhbGxCdXR0b25zLCBwbHVnaW5zLCBsYW5nLCBvcHRpb25zLCBfcmVzcG9uc2l2ZUJ1dHRvbnMpIHtcclxuICAgIGNvbnN0IF9kID0gY29udGV4dC5lbGVtZW50Lm9yaWdpbkVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcclxuICAgIGNvbnN0IF93ID0gX2QuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xyXG4gICAgY29uc3QgdXRpbCA9IF91dGlsO1xyXG4gICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25zO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGVkaXRvciBjb3JlIG9iamVjdFxyXG4gICAgICogc2hvdWxkIGFsd2F5cyBiaW5kIHRoaXMgb2JqZWN0IHdoZW4gcmVnaXN0ZXJpbmcgYW4gZXZlbnQgaW4gdGhlIHBsdWctaW4uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGNvcmUgPSB7XHJcbiAgICAgICAgX2Q6IF9kLFxyXG4gICAgICAgIF93OiBfdyxcclxuICAgICAgICBfcGFyc2VyOiBuZXcgX3cuRE9NUGFyc2VyKCksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEb2N1bWVudCBvYmplY3Qgb2YgdGhlIGlmcmFtZSBpZiBjcmVhdGVkIGFzIGFuIGlmcmFtZSB8fCBfZFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3dkOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gV2luZG93IG9iamVjdCBvZiB0aGUgaWZyYW1lIGlmIGNyZWF0ZWQgYXMgYW4gaWZyYW1lIHx8IF93XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfd3c6IG51bGwsXHJcbiAgICAgICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3Nlc3QgU2hhZG93Um9vdCB0byBlZGl0b3IgaWYgZm91bmRcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zaGFkb3dSb290OiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVXRpbCBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICB1dGlsOiB1dGlsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb25zIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uczogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEVkaXRvciBvcHRpb25zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb3B0aW9uczogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE5vdGljZSBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2U6IF9ub3RpY2UsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGljb25zIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGljb25zOiBpY29ucyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEhpc3Rvcnkgb2JqZWN0IGZvciB1bmRvLCByZWRvXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGlzdG9yeTogbnVsbCxcclxuICAgICAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgYW5kIHVzZXIgb3B0aW9ucyBwYXJhbWV0ZXJzIG9mIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUGx1Z2luIGJ1dHRvbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBwbHVnaW5DYWxsQnV0dG9uczogcGx1Z2luQ2FsbEJ1dHRvbnMsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBMb2FkZWQgcGx1Z2luc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMgfHwge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbml0UGx1Z2luczoge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBPYmplY3QgZm9yIG1hbmFnaW5nIHN1Ym1lbnUgZWxlbWVudHNcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF90YXJnZXRQbHVnaW5zOiB7fSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNhdmUgcmVuZGVyZWQgc3VibWVudXMgYW5kIGNvbnRhaW5lcnNcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9tZW51VHJheToge30sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBsb2FkZWQgbGFuZ3VhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBsYW5nOiBsYW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlbGVjdGlvbiBub2RlIChjb3JlLmdldFNlbGVjdGlvbk5vZGUoKSkgdG8gd2hpY2ggdGhlIGVmZmVjdCB3YXMgbGFzdCBhcHBsaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZWZmZWN0Tm9kZTogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHN1Ym1lbnUgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnU6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRhaW5lcjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGN1cnJlbnQgc3VibWVudCBuYW1lXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc3VibWVudU5hbWU6ICcnLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYmluZGVkIHN1Ym1lbnVPZmYgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYmluZGVkU3VibWVudU9mZjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGJpbmRlZCBjb250YWluZXJPZmYgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYmluZGVkQ29udGFpbmVyT2ZmOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYWN0aXZlIGJ1dHRvbiBlbGVtZW50IGluIHN1Ym1lbnVcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51QWN0aXZlQnV0dG9uOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYWN0aXZlIGJ1dHRvbiBlbGVtZW50IGluIGNvbnRhaW5lclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRhaW5lckFjdGl2ZUJ1dHRvbjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBlbGVtZW50cyBhcnJheSB0byBiZSBwcm9jZXNzZWQgdW52aXNpYmxlIHdoZW4gdGhlIGNvbnRyb2xsZXJzT2ZmIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIChyZXNpemluZywgbGluayBtb2RpZmllZCBidXR0b24sIHRhYmxlIGNvbnRyb2xsZXIpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udHJvbGxlckFycmF5OiBbXSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBjYWxsZWQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udHJvbGxlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGN1cnJlbnRDb250cm9sbGVyTmFtZTogJycsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdGFyZ2V0IGVsZW1lbnQgb2YgY3VycmVudCBjb250cm9sbGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY3VycmVudENvbnRyb2xsZXJUYXJnZXQ6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgZmlsZSBjb21wb25lbnQgb2JqZWN0IG9mIGN1cnJlbnQgc2VsZWN0ZWQgZmlsZSB0YWcgKGdldEZpbGVDb21wb25lbnQpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY3VycmVudEZpbGVDb21wb25lbnRJbmZvOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQW4gYXJyYXkgb2YgYnV0dG9ucyB3aG9zZSBjbGFzcyBuYW1lIGlzIG5vdCBcInNlLWNvZGUtdmlldy1lbmFibGVkXCJcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb2RlVmlld0Rpc2FibGVkQnV0dG9uczogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIGFycmF5IG9mIGJ1dHRvbnMgd2hvc2UgY2xhc3MgbmFtZSBpcyBub3QgXCJzZS1yZXNpemluZy1lbmFibGVkXCJcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXNpemluZ0Rpc2FibGVkQnV0dG9uczogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGFjdGl2ZSBtb3JlIGxheWVyIGVsZW1lbnQgaW4gc3VibWVudVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX21vcmVMYXllckFjdGl2ZUJ1dHRvbjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRhZyB3aGl0ZWxpc3QgUmVnRXhwIG9iamVjdCB1c2VkIGluIFwiX2NvbnNpc3RlbmN5Q2hlY2tPZkhUTUxcIiBtZXRob2RcclxuICAgICAgICAgKiBeKG9wdGlvbnMuX2VkaXRvclRhZ3NXaGl0ZWxpc3QpJFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2h0bWxDaGVja1doaXRlbGlzdFJlZ0V4cDogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJlZ0V4cCB3aGVuIHVzaW5nIGNoZWNrIGRpc2FsbG93ZCB0YWdzLiAoYiwgaSwgaW5zLCBzdHJpa2UsIHMpXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfZGlzYWxsb3dlZFRleHRUYWdzUmVnRXhwOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWRpdG9yIHRhZ3Mgd2hpdGVsaXN0IChSZWdFeHAgb2JqZWN0KVxyXG4gICAgICAgICAqIHV0aWwuY3JlYXRlVGFnc1doaXRlbGlzdChvcHRpb25zLl9lZGl0b3JUYWdzV2hpdGVsaXN0KVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVkaXRvclRhZ3NXaGl0ZWxpc3RSZWdFeHA6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUYWcgd2hpdGVsaXN0IHdoZW4gcGFzdGluZyAoUmVnRXhwIG9iamVjdClcclxuICAgICAgICAgKiB1dGlsLmNyZWF0ZVRhZ3NXaGl0ZWxpc3Qob3B0aW9ucy5wYXN0ZVRhZ3NXaGl0ZWxpc3QpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGFzdGVUYWdzV2hpdGVsaXN0UmVnRXhwOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQm9vbGVhbiB2YWx1ZSBvZiB3aGV0aGVyIHRoZSBlZGl0b3IgaGFzIGZvY3VzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGFzRm9jdXM6IGZhbHNlLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQm9vbGVhbiB2YWx1ZSBvZiB3aGV0aGVyIHRoZSBlZGl0b3IgaXMgZGlzYWJsZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEF0dHJpYnV0ZXMgd2hpdGVsaXN0IHVzZWQgYnkgdGhlIGNsZWFuSFRNTCBtZXRob2RcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9hdHRyaWJ1dGVzV2hpdGVsaXN0UmVnRXhwOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQXR0cmlidXRlcyBvZiB0YWdzIHdoaXRlbGlzdCB1c2VkIGJ5IHRoZSBjbGVhbkhUTUwgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYXR0cmlidXRlc1RhZ3NXaGl0ZWxpc3Q6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBiaW5kZWQgY29udHJvbGxlcnNPZmYgbWV0aG9kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfYmluZENvbnRyb2xsZXJzT2ZmOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgaW5saW5lIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNJbmxpbmU6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJcyBiYWxsb29ufGJhbGxvb24tYWx3YXlzIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNCYWxsb29uOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXMgYmFsbG9vbi1hbHdheXMgbW9kZT9cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pc0JhbGxvb25BbHdheXM6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXF1aXJlZCB2YWx1ZSB3aGVuIHVzaW5nIGlubGluZSBtb2RlIHRvIHN0aWNreSB0b29sYmFyXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaW5saW5lVG9vbGJhckF0dHI6IHt0b3A6ICcnLCB3aWR0aDogJycsIGlzU2hvdzogZmFsc2V9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVmFyaWFibGUgdGhhdCBjb250cm9scyB0aGUgXCJibHVyXCIgZXZlbnQgaW4gdGhlIGVkaXRvciBvZiBpbmxpbmUgb3IgYmFsbG9vbiBtb2RlIHdoZW4gdGhlIGZvY3VzIGlzIG1vdmVkIHRvIHN1Ym1lbnVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9ub3RIaWRlVG9vbGJhcjogZmFsc2UsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBWYXJpYWJsZSB2YWx1ZSB0aGF0IHN0aWNreSB0b29sYmFyIG1vZGVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zdGlja3k6IGZhbHNlLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVmFyaWFibGVzIGZvciBjb250cm9sbGluZyBmb2N1cyBhbmQgYmx1ciBldmVudHNcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9hbnRpQmx1cjogZmFsc2UsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgbGluZSBicmVha2VyIGVsZW1lbnRcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9saW5lQnJlYWtlcjogbnVsbCxcclxuICAgICAgICBfbGluZUJyZWFrZXJCdXR0b246IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJZiB0cnVlLCAoaW5pdGlhbGl6ZSwgcmVzZXQpIGFsbCBpbmRleGVzIG9mIGltYWdlLCB2aWRlbyBpbmZvcm1hdGlvblxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2NvbXBvbmVudHNJbmZvSW5pdDogdHJ1ZSxcclxuICAgICAgICBfY29tcG9uZW50c0luZm9SZXNldDogZmFsc2UsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBQbHVnaW5zIGFycmF5IHdpdGggXCJhY3RpdmVcIiBtZXRob2QuXHJcbiAgICAgICAgICogXCJhY3RpdmVQbHVnaW5zXCIgcnVucyB0aGUgXCJhZGRcIiBtZXRob2Qgd2hlbiBjcmVhdGluZyB0aGUgZWRpdG9yLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFjdGl2ZVBsdWdpbnM6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbmZvcm1hdGlvbiBvZiB0YWdzIHRoYXQgc2hvdWxkIG1haW50YWluIEhUTUwgc3RydWN0dXJlLCBzdHlsZSwgY2xhc3MgbmFtZSwgZXRjLiAoSW4gdXNlIGJ5IFwibWF0aFwiIHBsdWdpbilcclxuICAgICAgICAgKiBXaGVuIGluc2VydGluZyBcImh0bWxcIiBzdWNoIGFzIHBhc3RlLCBpdCBpcyBleGVjdXRlZCBvbiB0aGUgXCJodG1sXCIgdG8gYmUgaW5zZXJ0ZWQuIChjb3JlLmNsZWFuSFRNTClcclxuICAgICAgICAgKiBCYXNpYyBFZGl0b3IgQWN0aW9uczpcclxuICAgICAgICAgKiAxLiBBbGwgY2xhc3NlcyBub3Qgc3RhcnRpbmcgd2l0aCBcIl9fc2VfX1wiIG9yIFwic2UtXCIgaW4gdGhlIGVkaXRvciBhcmUgcmVtb3ZlZC5cclxuICAgICAgICAgKiAyLiBUaGUgc3R5bGUgb2YgYWxsIHRhZ3MgZXhjZXB0IHRoZSBcInNwYW5cIiB0YWcgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlZGl0b3IuXHJcbiAgICAgICAgICogXCJtYW5hZ2VkVGFnc0luZm9cIiBzdHJ1Y3R1cmUgZXg6XHJcbiAgICAgICAgICogbWFuYWdlZFRhZ3NJbmZvOiB7XHJcbiAgICAgICAgICogICBxdWVyeTogJy5fX3NlX194eHgsIHNlLXh4eCdcclxuICAgICAgICAgKiAgIG1hcDoge1xyXG4gICAgICAgICAqICAgICAnX19zZV9feHh4JzogbWV0aG9kLmJpbmQoY29yZSksXHJcbiAgICAgICAgICogICAgICdzZS14eHgnOiBtZXRob2QuYmluZChjb3JlKSxcclxuICAgICAgICAgKiAgIH1cclxuICAgICAgICAgKiB9XHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiBEZWZpbmUgaW4gdGhlIGZvbGxvd2luZyByZXR1cm4gZm9ybWF0IGluIHRoZSBcIm1hbmFnZWRUYWdJbmZvXCIgZnVuY3Rpb24gb2YgdGhlIHBsdWdpbi5cclxuICAgICAgICAgKiBtYW5hZ2VkVGFnSW5mbygpID0+IHtcclxuICAgICAgICAgKiAgcmV0dXJuIHtcclxuICAgICAgICAgKiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLCAvLyBDbGFzcyBuYW1lIHRvIGlkZW50aWZ5IHRoZSB0YWcuIChcIl9fc2VfX3h4eFwiLCBcInNlLXh4eFwiKVxyXG4gICAgICAgICAqICAgIC8vIENoYW5nZSB0aGUgaHRtbCBvZiB0aGUgXCJlbGVtZW50XCIuIChcImVsZW1lbnRcIiBpcyB0aGUgZWxlbWVudCBmb3VuZCB3aXRoIFwiY2xhc3NOYW1lXCIuKVxyXG4gICAgICAgICAqICAgIC8vIFwibWV0aG9kXCIgaXMgZXhlY3V0ZWQgYnkgYmluZGluZyBcImNvcmVcIi5cclxuICAgICAgICAgKiAgICBtZXRob2Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICogICAgICAvLyB0aGlzID09PSBjb3JlXHJcbiAgICAgICAgICogICAgICBlbGVtZW50LmlubmVySFRNTCA9IC8vIChyZW5kZXJlZCBodG1sKTtcclxuICAgICAgICAgKiAgICB9XHJcbiAgICAgICAgICogIH1cclxuICAgICAgICAgKiB9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWFuYWdlZFRhZ3NJbmZvOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gY2FzaGluZzogb3B0aW9ucy5jaGFyQ291bnRlclR5cGUgPT09ICdieXRlLWh0bWwnXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfY2hhclR5cGVIVE1MOiBmYWxzZSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIFwiY2hlY2tGaWxlSW5mb1wiIGZ1bmN0aW9ucyB3aXRoIHRoZSBjb3JlIGJvdW5kXHJcbiAgICAgICAgICogKFBsdWdpbnMgd2l0aCBcImNoZWNrRmlsZUluZm9cIiBhbmQgXCJyZXNldEZpbGVJbmZvXCIgbWV0aG9kcylcclxuICAgICAgICAgKiBcImZpbGVJbmZvUGx1Z2luc1wiIHJ1bnMgdGhlIFwiYWRkXCIgbWV0aG9kIHdoZW4gY3JlYXRpbmcgdGhlIGVkaXRvci5cclxuICAgICAgICAgKiBcImNoZWNrRmlsZUluZm9cIiBtZXRob2QgaXMgYWx3YXlzIGNhbGwganVzdCBiZWZvcmUgdGhlIFwiY2hhbmdlXCIgZXZlbnQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfZmlsZUluZm9QbHVnaW5zQ2hlY2s6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBcInJlc2V0RmlsZUluZm9cIiBmdW5jdGlvbnMgd2l0aCB0aGUgY29yZSBib3VuZFxyXG4gICAgICAgICAqIChQbHVnaW5zIHdpdGggXCJjaGVja0ZpbGVJbmZvXCIgYW5kIFwicmVzZXRGaWxlSW5mb1wiIG1ldGhvZHMpXHJcbiAgICAgICAgICogXCJjaGVja0ZpbGVJbmZvXCIgbWV0aG9kIGlzIGFsd2F5cyBjYWxsIGp1c3QgYmVmb3JlIHRoZSBcImZ1bmN0aW9ucy5zZXRPcHRpb25zXCIgbWV0aG9kLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2ZpbGVJbmZvUGx1Z2luc1Jlc2V0OiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVmFyaWFibGVzIGZvciBmaWxlIGNvbXBvbmVudCBtYW5hZ2VtZW50XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfZmlsZU1hbmFnZXI6IHtcclxuICAgICAgICAgICAgdGFnczogbnVsbCxcclxuICAgICAgICAgICAgcmVnRXhwOiBudWxsLFxyXG4gICAgICAgICAgICBxdWVyeVN0cmluZzogbnVsbCxcclxuICAgICAgICAgICAgcGx1Z2luUmVnRXhwOiBudWxsLFxyXG4gICAgICAgICAgICBwbHVnaW5NYXA6IG51bGxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZSB0ZXh0IG9yIGNsYXNzTmFtZSBmb3IgZWFjaCBzZWxlY3Rpb24gY2hhbmdlXHJcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgdGhlIGVkaXRvciwgXCJhY3RpdmVQbHVnaW5zXCIgYXJlIGFkZGVkLlxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gU1RST05HIGJvbGQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBVIHVuZGVybGluZSBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IEVNIGl0YWxpYyBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IERFTCBzdHJpa2UgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBTVUIgc3Vic2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gU1VQIHN1cGVyc2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gT1VUREVOVCBvdXRkZW50IGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gSU5ERU5UIGluZGVudCBidXR0b25cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb21tYW5kTWFwOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU3R5bGUgYnV0dG9uIHJlbGF0ZWQgdG8gZWRpdCBhcmVhXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBmdWxsU2NyZWVuIGZ1bGxTY3JlZW4gYnV0dG9uIGVsZW1lbnRcclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IHNob3dCbG9ja3Mgc2hvd0Jsb2NrcyBidXR0b24gZWxlbWVudFxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gY29kZVZpZXcgY29kZVZpZXcgYnV0dG9uIGVsZW1lbnRcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zdHlsZUNvbW1hbmRNYXA6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBNYXAgb2YgZGVmYXVsdCBjb21tYW5kXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfZGVmYXVsdENvbW1hbmQ6IHtcclxuICAgICAgICAgICAgYm9sZDogb3B0aW9ucy50ZXh0VGFncy5ib2xkLFxyXG4gICAgICAgICAgICB1bmRlcmxpbmU6IG9wdGlvbnMudGV4dFRhZ3MudW5kZXJsaW5lLFxyXG4gICAgICAgICAgICBpdGFsaWM6IG9wdGlvbnMudGV4dFRhZ3MuaXRhbGljLFxyXG4gICAgICAgICAgICBzdHJpa2U6IG9wdGlvbnMudGV4dFRhZ3Muc3RyaWtlLFxyXG4gICAgICAgICAgICBzdWJzY3JpcHQ6ICdTVUInLFxyXG4gICAgICAgICAgICBzdXBlcnNjcmlwdDogJ1NVUCdcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVmFyaWFibGVzIHVzZWQgaW50ZXJuYWxseSBpbiBlZGl0b3Igb3BlcmF0aW9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0NvZGVWaWV3IFN0YXRlIG9mIGNvZGUgdmlld1xyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNGdWxsU2NyZWVuIFN0YXRlIG9mIGZ1bGwgc2NyZWVuXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gSW5uZXJIZWlnaHQgaW4gZWRpdG9yIHdoZW4gaW4gZnVsbCBzY3JlZW5cclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcmVzaXplQ2xpZW50WSBSZW1lbWJlciB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZWRpdG9yIGJlZm9yZSByZXNpemluZyB0aGUgZWRpdG9yIChVc2VkIHdoZW4gY2FsY3VsYXRpbmcgZHVyaW5nIHJlc2l6ZSBvcGVyYXRpb24pXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRhYlNpemUgSW5kZW50IHNpemUgb2YgdGFiICg0KVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjb2RlSW5kZW50IEluZGVudCBzaXplIG9mIENvZGUgdmlldyBtb2RlICg0KVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5SZXNpemluZ1NpemUgTWluaW11bSBzaXplIG9mIGVkaXRpbmcgYXJlYSB3aGVuIHJlc2l6ZWQge051bWJlcn0gKC5zZS13cmFwcGVyLWlubmVyIHttaW4taGVpZ2h0OiA2NXB4O30gfHwgNjUpXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtBcnJheX0gY3VycmVudE5vZGVzICBBbiBhcnJheSBvZiB0aGUgY3VycmVudCBjdXJzb3IncyBub2RlIHN0cnVjdHVyZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3ZhcmlhYmxlOiB7XHJcbiAgICAgICAgICAgIGlzQ29kZVZpZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICAgICAgICBpbm5lckhlaWdodF9mdWxsU2NyZWVuOiAwLFxyXG4gICAgICAgICAgICByZXNpemVDbGllbnRZOiAwLFxyXG4gICAgICAgICAgICB0YWJTaXplOiA0LFxyXG4gICAgICAgICAgICBjb2RlSW5kZW50OiA0LFxyXG4gICAgICAgICAgICBtaW5SZXNpemluZ1NpemU6IHV0aWwuZ2V0TnVtYmVyKChjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnN0eWxlLm1pbkhlaWdodCB8fCAnNjUnKSwgMCksXHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlczogW10sXHJcbiAgICAgICAgICAgIGN1cnJlbnROb2Rlc01hcDogW10sXHJcbiAgICAgICAgICAgIF9yYW5nZTogbnVsbCxcclxuICAgICAgICAgICAgX3NlbGVjdGlvbk5vZGU6IG51bGwsXHJcbiAgICAgICAgICAgIF9vcmlnaW5Dc3NUZXh0OiBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5jc3NUZXh0LFxyXG4gICAgICAgICAgICBfYm9keU92ZXJmbG93OiAnJyxcclxuICAgICAgICAgICAgX2VkaXRvckFyZWFPcmlnaW5Dc3NUZXh0OiAnJyxcclxuICAgICAgICAgICAgX3d5c2l3eWdPcmlnaW5Dc3NUZXh0OiAnJyxcclxuICAgICAgICAgICAgX2NvZGVPcmlnaW5Dc3NUZXh0OiAnJyxcclxuICAgICAgICAgICAgX2Z1bGxTY3JlZW5BdHRyczoge3N0aWNreTogZmFsc2UsIGJhbGxvb246IGZhbHNlLCBpbmxpbmU6IGZhbHNlfSxcclxuICAgICAgICAgICAgX2xpbmVCcmVha0NvbXA6IG51bGwsXHJcbiAgICAgICAgICAgIF9saW5lQnJlYWtEaXI6ICcnXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIElmIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkLCBhZGQgdGhlIHBsdWdpbiBhbmQgY2FsbCB0aGUgJ2FkZCcgZnVuY3Rpb24uXHJcbiAgICAgICAgICogSWYgdGhlIHBsdWdpbiBpcyBhZGRlZCBjYWxsIGNhbGxCYWNrIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdG8gY2FsbFxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxCYWNrRnVuY3Rpb24gRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbW9kdWxlIGNhbGxcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8bnVsbH0gX3RhcmdldCBQbHVnaW4gdGFyZ2V0IGJ1dHRvbiAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIGEgYnV0dG9uIGxpc3Qgd2hlbiBjcmVhdGluZyB0aGUgZWRpdG9yKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBjYWxsQmFja0Z1bmN0aW9uLCBfdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIF90YXJnZXQgPSBfdGFyZ2V0IHx8IHBsdWdpbkNhbGxCdXR0b25zW3BsdWdpbk5hbWVdO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNvcmUuY2FsbFBsdWdpbi5mYWlsXSBUaGUgY2FsbGVkIHBsdWdpbiBkb2VzIG5vdCBleGlzdCBvciBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdC4gKHBsdWdpbk5hbWU6XCInICsgcGx1Z2luTmFtZSArICdcIiknKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pbml0UGx1Z2luc1twbHVnaW5OYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdLmFkZCh0aGlzLCBfdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBsdWdpbnNbcGx1Z2luTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl90YXJnZXRQbHVnaW5zW3BsdWdpbk5hbWVdID09PSAnb2JqZWN0JyAmJiAhIV90YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1lbnVUYXJnZXQocGx1Z2luTmFtZSwgX3RhcmdldCwgdGhpcy5fdGFyZ2V0UGx1Z2luc1twbHVnaW5OYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uYWN0aXZlICYmICF0aGlzLmNvbW1hbmRNYXBbcGx1Z2luTmFtZV0gJiYgISFfdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRNYXBbcGx1Z2luTmFtZV0gPSBfdGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxCYWNrRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIGNhbGxCYWNrRnVuY3Rpb24oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSWYgdGhlIG1vZHVsZSBpcyBub3QgYWRkZWQsIGFkZCB0aGUgbW9kdWxlIGFuZCBjYWxsIHRoZSAnYWRkJyBmdW5jdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZHVsZUFycmF5IG1vZHVsZSBvYmplY3QncyBBcnJheSBbZGlhbG9nLCByZXNpemluZ11cclxuICAgICAgICAgKi9cclxuICAgICAgICBhZGRNb2R1bGU6IGZ1bmN0aW9uIChtb2R1bGVBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbW9kdWxlQXJyYXkubGVuZ3RoLCBtb2R1bGVOYW1lOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBtb2R1bGVBcnJheVtpXS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBsdWdpbnNbbW9kdWxlTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNbbW9kdWxlTmFtZV0gPSBtb2R1bGVBcnJheVtpXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0UGx1Z2luc1ttb2R1bGVOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBsdWdpbnNbbW9kdWxlTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdLmFkZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdLmFkZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZm9yIG1hbmFnaW5nIHN1Ym1lbnUgZWxlbWVudC5cclxuICAgICAgICAgKiBZb3UgbXVzdCBhZGQgdGhlIFwic3VibWVudVwiIGVsZW1lbnQgdXNpbmcgdGhlIHRoaXMgbWV0aG9kIGF0IGN1c3RvbSBwbHVnaW4uXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBsdWdpbk5hbWUgUGx1Z2luIG5hbWVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8bnVsbH0gdGFyZ2V0IFRhcmdldCBidXR0b25cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lbnUgU3VibWVudSBlbGVtZW50XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW5pdE1lbnVUYXJnZXQ6IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCB0YXJnZXQsIG1lbnUpIHtcclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldFBsdWdpbnNbcGx1Z2luTmFtZV0gPSBtZW51O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9tZW51VHJheS5hcHBlbmRDaGlsZChtZW51KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldFBsdWdpbnNbcGx1Z2luTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVudVRyYXlbdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyldID0gbWVudTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbmFibGVkIHN1Ym1lbnVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgU3VibWVudSdzIGJ1dHRvbiBlbGVtZW50IHRvIGNhbGxcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51T246IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9iaW5kZWRTdWJtZW51T2ZmKSB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYpIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1lbnVOYW1lID0gdGhpcy5fc3VibWVudU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLnN1Ym1lbnUgPSB0aGlzLl9tZW51VHJheVtzdWJtZW51TmFtZV07XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE1lbnVQb3NpdGlvbihlbGVtZW50LCBtZW51KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRlZFN1Ym1lbnVPZmYgPSB0aGlzLnN1Ym1lbnVPZmYuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5hZGREb2NFdmVudCgnbW91c2Vkb3duJywgdGhpcy5fYmluZGVkU3VibWVudU9mZiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24pIHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24uY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fYW50aUJsdXIgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIHN1Ym1lbnVcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51T2ZmOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRG9jRXZlbnQoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRlZFN1Ym1lbnVPZmYpO1xyXG4gICAgICAgICAgICB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1lbnUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1Ym1lbnVOYW1lID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1lbnVBY3RpdmVCdXR0b24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90SGlkZVRvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fYW50aUJsdXIgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlZCBjb250YWluZXJcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgQ29udGFpbmVyJ3MgYnV0dG9uIGVsZW1lbnQgdG8gY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRhaW5lck9uOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmluZGVkQ29udGFpbmVyT2ZmKSB0aGlzLl9iaW5kZWRDb250YWluZXJPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSB0aGlzLl9jb250YWluZXJOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICBjb25zdCBtZW51ID0gdGhpcy5jb250YWluZXIgPSB0aGlzLl9tZW51VHJheVtjb250YWluZXJOYW1lXTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJBY3RpdmVCdXR0b24gPSBlbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRNZW51UG9zaXRpb24oZWxlbWVudCwgbWVudSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kZWRDb250YWluZXJPZmYgPSB0aGlzLmNvbnRhaW5lck9mZi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZERvY0V2ZW50KCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRDb250YWluZXJPZmYsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnNbY29udGFpbmVyTmFtZV0ub24pIHRoaXMucGx1Z2luc1tjb250YWluZXJOYW1lXS5vbi5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9hbnRpQmx1ciA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgY29udGFpbmVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udGFpbmVyT2ZmOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRG9jRXZlbnQoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRlZENvbnRhaW5lck9mZik7XHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRlZENvbnRhaW5lck9mZiA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lck5hbWUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHRoaXMuY29udGFpbmVyQWN0aXZlQnV0dG9uLCAnb24nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyQWN0aXZlQnV0dG9uID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdEhpZGVUb29sYmFyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FudGlCbHVyID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNldCB0aGUgbWVudSBwb3NpdGlvbi4gKHN1Ym1lbnUsIGNvbnRhaW5lcilcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGVsZW1lbnQgQnV0dG9uIGVsZW1lbnRcclxuICAgICAgICAgKiBAcGFyYW0geyp9IG1lbnUgTWVudSBlbGVtZW50XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0TWVudVBvc2l0aW9uOiBmdW5jdGlvbiAoZWxlbWVudCwgbWVudSkge1xyXG4gICAgICAgICAgICBtZW51LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgbWVudS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgbWVudS5zdHlsZS5oZWlnaHQgPSAnJztcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LCAnb24nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSB0aGlzLmNvbnRleHQuZWxlbWVudC50b29sYmFyO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyVyA9IHRvb2xiYXIub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXJPZmZzZXQgPSBldmVudC5fZ2V0RWRpdG9yT2Zmc2V0cyhjb250ZXh0LmVsZW1lbnQudG9vbGJhcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnVXID0gbWVudS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgbCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0ICsgMztcclxuXHJcbiAgICAgICAgICAgIC8vIHJ0bFxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ydGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJ0bFcgPSBtZW51VyA+IGVsZW1lbnRXID8gbWVudVcgLSBlbGVtZW50VyA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBydGxMID0gcnRsVyA+IDAgPyAwIDogZWxlbWVudFcgLSBtZW51VztcclxuICAgICAgICAgICAgICAgIG1lbnUuc3R5bGUubGVmdCA9IChsIC0gcnRsVyArIHJ0bEwpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGlmICh0b29sYmFyT2Zmc2V0LmxlZnQgPiBldmVudC5fZ2V0RWRpdG9yT2Zmc2V0cyhtZW51KS5sZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5zdHlsZS5sZWZ0ID0gJzBweCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyTGVmdCA9IHRvb2xiYXJXIDw9IG1lbnVXID8gMCA6IHRvb2xiYXJXIC0gKGwgKyBtZW51Vyk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3ZlckxlZnQgPCAwKSBtZW51LnN0eWxlLmxlZnQgPSAobCArIG92ZXJMZWZ0KSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIG1lbnUuc3R5bGUubGVmdCA9IGwgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgZWxlbWVudCB0b3BcclxuICAgICAgICAgICAgbGV0IHQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0RWwgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICB3aGlsZSAob2Zmc2V0RWwgJiYgb2Zmc2V0RWwgIT09IHRvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgIHQgKz0gb2Zmc2V0RWwub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0RWwgPSBvZmZzZXRFbC5vZmZzZXRQYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ0ID0gdDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQmFsbG9vbikge1xyXG4gICAgICAgICAgICAgICAgdCArPSB0b29sYmFyLm9mZnNldFRvcCArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdCAtPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2V0IG1lbnUgcG9zaXRpb25cclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhclRvcCA9IHRvb2xiYXJPZmZzZXQudG9wO1xyXG4gICAgICAgICAgICBsZXQgbWVudUhlaWdodCA9IG1lbnUub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZWwgPSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYTtcclxuICAgICAgICAgICAgbGV0IHNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlICghIWVsKSB7XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxUb3AgKz0gZWwuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtZW51SGVpZ2h0X2JvdHRvbSA9IF93LmlubmVySGVpZ2h0IC0gKHRvb2xiYXJUb3AgLSBzY3JvbGxUb3AgKyBidCArIGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpO1xyXG4gICAgICAgICAgICBpZiAobWVudUhlaWdodF9ib3R0b20gPCBtZW51SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWVudVRvcCA9IC0xICogKG1lbnVIZWlnaHQgLSBidCArIDMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zVG9wID0gdG9vbGJhclRvcCAtIHNjcm9sbFRvcCArIG1lbnVUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW51SGVpZ2h0X3RvcCA9IG1lbnVIZWlnaHQgKyAoaW5zVG9wIDwgMCA/IGluc1RvcCA6IDApO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAobWVudUhlaWdodF90b3AgPiBtZW51SGVpZ2h0X2JvdHRvbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUuc3R5bGUuaGVpZ2h0ID0gbWVudUhlaWdodF90b3AgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVUb3AgPSAtMSAqIChtZW51SGVpZ2h0X3RvcCAtIGJ0ICsgMyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUuc3R5bGUuaGVpZ2h0ID0gbWVudUhlaWdodF9ib3R0b20gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVUb3AgPSBidCArIGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbWVudS5zdHlsZS50b3AgPSBtZW51VG9wICsgJ3B4JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1lbnUuc3R5bGUudG9wID0gKGJ0ICsgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtZW51LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBjb250cm9sbGVyIGF0IGVkaXRvciBhcmVhIChjb250cm9sbGVyIGVsZW1lbnRzLCBmdW5jdGlvbiwgXCJjb250cm9sbGVyIHRhcmdldCBlbGVtZW50KEBSZXF1aXJlZClcIiwgXCJjb250cm9sbGVyIG5hbWUoQFJlcXVpcmVkKVwiLCBldGMuLilcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50cyBjb250cm9sbGVyIGVsZW1lbnRzLCBmdW5jdGlvbnMuLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2JpbmRDb250cm9sbGVyc09mZikgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5ID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgYXJnOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmcgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFyZykgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbnRyb2xsZXJOYW1lID0gYXJnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcnJheS5wdXNoKGFyZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzQ2xhc3MoYXJnLCAnc2UtY29udHJvbGxlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29udHJvbGxlclRhcmdldCA9IGFyZztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGaWxlQ29tcG9uZW50SW5mbyA9IHRoaXMuZ2V0RmlsZUNvbXBvbmVudChhcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZy5zdHlsZSkgYXJnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQXJyYXkucHVzaChhcmcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYgPSB0aGlzLmNvbnRyb2xsZXJzT2ZmLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRG9jRXZlbnQoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZERvY0V2ZW50KCdrZXlkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2FudGlCbHVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLnNob3dDb250cm9sbGVyID09PSAnZnVuY3Rpb24nKSBmdW5jdGlvbnMuc2hvd0NvbnRyb2xsZXIodGhpcy5jdXJyZW50Q29udHJvbGxlck5hbWUsIHRoaXMuY29udHJvbGxlckFycmF5LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSBjb250cm9sbGVyIGF0IGVkaXRvciBhcmVhIChsaW5rIGJ1dHRvbiwgaW1hZ2UgcmVzaXplIGJ1dHRvbi4uKVxyXG4gICAgICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudHxNb3VzZUV2ZW50fG51bGx9IGUgRXZlbnQgb2JqZWN0IHdoZW4gY2FsbGVkIGZyb20gbW91c2Vkb3duIGFuZCBrZXlkb3duIGV2ZW50cyByZWdpc3RlcmVkIGluIFwiY29yZS5jb250cm9sbGVyc09uXCJcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250cm9sbGVyc09mZjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGluZUJyZWFrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gdGhpcy5jb250cm9sbGVyQXJyYXkubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgJiYgbGVuID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0uY29udGFpbnMgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0uY29udGFpbnMoZS50YXJnZXQpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlTWFuYWdlci5wbHVnaW5SZWdFeHAudGVzdCh0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSkgJiYgZSAmJiBlLnR5cGUgPT09ICdrZXlkb3duJyAmJiBlLmtleUNvZGUgIT09IDI3KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5saW5lQnJlYWtlcl90LnN0eWxlLmRpc3BsYXkgPSBjb250ZXh0LmVsZW1lbnQubGluZUJyZWFrZXJfYi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fbGluZUJyZWFrQ29tcCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb250cm9sbGVyVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RmlsZUNvbXBvbmVudEluZm8gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVmZmVjdE5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb250cm9sbGVyc09mZikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVEb2NFdmVudCgnbW91c2Vkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVEb2NFdmVudCgna2V5ZG93bicsIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZik7XHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0gPT09ICdmdW5jdGlvbicpIHRoaXMuY29udHJvbGxlckFycmF5W2ldKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRyb2xsZXJBcnJheVtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FudGlCbHVyID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNwZWNpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250cm9sbGVyLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY29udHJvbGxlciBDb250cm9sbGVyIGVsZW1lbnQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSByZWZlckVsIEVsZW1lbnQgdGhhdCBpcyB0aGUgYmFzaXMgb2YgdGhlIGNvbnRyb2xsZXIncyBwb3NpdGlvbi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcG9zaXRpb24gVHlwZSBvZiBwb3NpdGlvbiAoXCJ0b3BcIiB8IFwiYm90dG9tXCIpXHJcbiAgICAgICAgICogV2hlbiB1c2luZyB0aGUgXCJ0b3BcIiBwb3NpdGlvbiwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbiBhcnJvdyBvbiB0aGUgY29udHJvbGxlci5cclxuICAgICAgICAgKiBXaGVuIHVzaW5nIHRoZSBcImJvdHRvbVwiIHBvc2l0aW9uIHRoZXJlIHNob3VsZCBiZSBhbiBhcnJvdyBvbiB0aGUgY29udHJvbGxlci5cclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYWRkT2Zmc2V0IFRoZXNlIGFyZSB0aGUgbGVmdCBhbmQgdG9wIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgc3BlY2lhbGx5LiBcclxuICAgICAgICAgKiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkLiAtIHtsZWZ0OiAwLCB0b3A6IDB9XHJcbiAgICAgICAgICogUGxlYXNlIGVudGVyIHRoZSB2YWx1ZSBiYXNlZCBvbiBsdHIgbW9kZS5cclxuICAgICAgICAgKiBDYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgaW4gcnRsIG1vZGUuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0Q29udHJvbGxlclBvc2l0aW9uOiBmdW5jdGlvbiAoY29udHJvbGxlciwgcmVmZXJFbCwgcG9zaXRpb24sIGFkZE9mZnNldCkge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ydGwpIGFkZE9mZnNldC5sZWZ0ICo9IC0xO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdXRpbC5nZXRPZmZzZXQocmVmZXJFbCwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBjb250cm9sbGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAgICAgLy8gSGVpZ2h0IHZhbHVlIG9mIHRoZSBhcnJvdyBlbGVtZW50IGlzIDExcHhcclxuICAgICAgICAgICAgY29uc3QgdG9wTWFyZ2luID0gcG9zaXRpb24gPT09ICd0b3AnID8gLShjb250cm9sbGVyLm9mZnNldEhlaWdodCArIDIpIDogKHJlZmVyRWwub2Zmc2V0SGVpZ2h0ICsgMTIpO1xyXG4gICAgICAgICAgICBjb250cm9sbGVyLnN0eWxlLnRvcCA9IChvZmZzZXQudG9wICsgdG9wTWFyZ2luICsgYWRkT2Zmc2V0LnRvcCkgKyAncHgnO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbCA9IG9mZnNldC5sZWZ0IC0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZS5zY3JvbGxMZWZ0ICsgYWRkT2Zmc2V0LmxlZnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJXID0gY29udHJvbGxlci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVmZXJFbFcgPSByZWZlckVsLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgYWxsb3cgPSB1dGlsLmhhc0NsYXNzKGNvbnRyb2xsZXIuZmlyc3RFbGVtZW50Q2hpbGQsICdzZS1hcnJvdycpID8gY29udHJvbGxlci5maXJzdEVsZW1lbnRDaGlsZCA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBydGwgKFdpZHRoIHZhbHVlIG9mIHRoZSBhcnJvdyBlbGVtZW50IGlzIDIycHgpXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJ0bCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcnRsVyA9IChjb250cm9sbGVyVyA+IHJlZmVyRWxXKSA/IGNvbnRyb2xsZXJXIC0gcmVmZXJFbFcgOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcnRsTCA9IHJ0bFcgPiAwID8gMCA6IHJlZmVyRWxXIC0gY29udHJvbGxlclc7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnN0eWxlLmxlZnQgPSAobCAtIHJ0bFcgKyBydGxMKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChydGxXID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvdykgYWxsb3cuc3R5bGUubGVmdCA9ICgoY29udHJvbGxlclcgLSAxNCA8IDEwICsgcnRsVykgPyAoY29udHJvbGxlclcgLSAxNCkgOiAoMTAgKyBydGxXKSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyU2l6ZSA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUub2Zmc2V0TGVmdCAtIGNvbnRyb2xsZXIub2Zmc2V0TGVmdDtcclxuICAgICAgICAgICAgICAgIGlmIChvdmVyU2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLnN0eWxlLmxlZnQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3cpIGFsbG93LnN0eWxlLmxlZnQgPSBvdmVyU2l6ZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnN0eWxlLmxlZnQgPSBsICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyU2l6ZSA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUub2Zmc2V0V2lkdGggLSAoY29udHJvbGxlci5vZmZzZXRMZWZ0ICsgY29udHJvbGxlclcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG92ZXJTaXplIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3R5bGUubGVmdCA9IChjb250cm9sbGVyLm9mZnNldExlZnQgKyBvdmVyU2l6ZSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvdykgYWxsb3cuc3R5bGUubGVmdCA9ICgyMCAtIG92ZXJTaXplKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvdykgYWxsb3cuc3R5bGUubGVmdCA9ICcyMHB4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udHJvbGxlci5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGphdmFzY3JpcHQgZXhlY0NvbW1hbmRcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufHVuZGVmaW5lZH0gc2hvd0RlZmF1bHRVSSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8dW5kZWZpbmVkfSB2YWx1ZSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZXhlY0NvbW1hbmQ6IGZ1bmN0aW9uIChjb21tYW5kLCBzaG93RGVmYXVsdFVJLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl93ZC5leGVjQ29tbWFuZChjb21tYW5kLCBzaG93RGVmYXVsdFVJLCAoY29tbWFuZCA9PT0gJ2Zvcm1hdEJsb2NrJyA/ICc8JyArIHZhbHVlICsgJz4nIDogdmFsdWUpKTtcclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cnVlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRm9jdXMgdG8gd3lzaXd5ZyBhcmVhIHVzaW5nIFwibmF0aXZlIGZvY3VzIGZ1bmN0aW9uXCJcclxuICAgICAgICAgKi9cclxuICAgICAgICBuYXRpdmVGb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCAnZmlnY2FwdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvbi5mb2N1cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRm9jdXMgdG8gd3lzaXd5ZyBhcmVhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pZnJhbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRm9jdXMoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuZW5kQ29udGFpbmVyICYmIHV0aWwuaXNXeXNpd3lnRGl2KHJhbmdlLnN0YXJ0Q29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQob3B0aW9ucy5kZWZhdWx0VGFnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JSJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5hcHBlbmRDaGlsZChicik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFwcGVuZENoaWxkKGZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoYnIsIDAsIGJyLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCwgcmFuZ2UuZW5kQ29udGFpbmVyLCByYW5nZS5lbmRPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGV2ZW50Ll9hcHBseVRhZ0VmZmVjdHMoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQmFsbG9vbikgZXZlbnQuX3RvZ2dsZVRvb2xiYXJCYWxsb29uKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIElmIFwiZm9jdXNFbFwiIGlzIGEgY29tcG9uZW50LCB0aGVuIHRoYXQgY29tcG9uZW50IGlzIHNlbGVjdGVkOyBpZiBpdCBpcyBhIGZvcm1hdCBlbGVtZW50LCB0aGUgbGFzdCB0ZXh0IGlzIHNlbGVjdGVkXHJcbiAgICAgICAgICogSWYgXCJmb2N1c0VkZ2VcIiBpcyBudWxsLCB0aGVuIHNlbGVjdGVkIGxhc3QgZWxlbWVudFxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBmb2N1c0VsIEZvY3VzIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICBmb2N1c0VkZ2U6IGZ1bmN0aW9uIChmb2N1c0VsKSB7XHJcbiAgICAgICAgICAgIGlmICghZm9jdXNFbCkgZm9jdXNFbCA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmxhc3RFbGVtZW50Q2hpbGQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWxlQ29tcG9uZW50SW5mbyA9IHRoaXMuZ2V0RmlsZUNvbXBvbmVudChmb2N1c0VsKTtcclxuICAgICAgICAgICAgaWYgKGZpbGVDb21wb25lbnRJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChmaWxlQ29tcG9uZW50SW5mby50YXJnZXQsIGZpbGVDb21wb25lbnRJbmZvLnBsdWdpbk5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzRWwpIHtcclxuICAgICAgICAgICAgICAgIGZvY3VzRWwgPSB1dGlsLmdldENoaWxkRWxlbWVudChmb2N1c0VsLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCB8fCBjdXJyZW50Lm5vZGVUeXBlID09PSAzOyB9LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZm9jdXNFbCkgdGhpcy5uYXRpdmVGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLnNldFJhbmdlKGZvY3VzRWwsIGZvY3VzRWwudGV4dENvbnRlbnQubGVuZ3RoLCBmb2N1c0VsLCBmb2N1c0VsLnRleHRDb250ZW50Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRm9jdXNvdXQgdG8gd3lzaXd5ZyBhcmVhICguYmx1cigpKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJsdXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLmJsdXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmJsdXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY3VycmVudCBlZGl0b3IncyByYW5nZSBvYmplY3QgYW5kIHJldHVybi5cclxuICAgICAgICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0Q29uIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgVGhlIHN0YXJ0T2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gZW5kQ29uIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJhbmdlIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRSYW5nZTogZnVuY3Rpb24gKHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYpIHtcclxuICAgICAgICAgICAgaWYgKCFzdGFydENvbiB8fCAhZW5kQ29uKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChzdGFydE9mZiA+IHN0YXJ0Q29uLnRleHRDb250ZW50Lmxlbmd0aCkgc3RhcnRPZmYgPSBzdGFydENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChlbmRPZmYgPiBlbmRDb24udGV4dENvbnRlbnQubGVuZ3RoKSBlbmRPZmYgPSBlbmRDb24udGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoc3RhcnRDb24pKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydENvbiA9IHN0YXJ0Q29uLmNoaWxkTm9kZXNbc3RhcnRPZmZdIHx8IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmYgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChlbmRDb24pKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRDb24gPSBlbmRDb24uY2hpbGROb2Rlc1tlbmRPZmZdIHx8IGVuZENvbjtcclxuICAgICAgICAgICAgICAgIGVuZE9mZiA9IHN0YXJ0T2ZmID4gMSA/IHN0YXJ0T2ZmIDogMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl93ZC5jcmVhdGVSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0Q29uLCBzdGFydE9mZik7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoZW5kQ29uLCBlbmRPZmYpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbU1VORURJVE9SLmNvcmUuZm9jdXMuZXJyb3JdICcgKyBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pZnJhbWUpIHRoaXMubmF0aXZlRm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByYW5nZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIHJhbmdlIG9iamVjdCBhbmQgYnV0dG9uIGVmZmVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlbW92ZVJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9zZWxlY3Rpb25Ob2RlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRNYXAgPSB0aGlzLmNvbW1hbmRNYXA7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBsdWdpbnMgPSB0aGlzLmFjdGl2ZVBsdWdpbnM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjb21tYW5kTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzT3duKGNvbW1hbmRNYXAsIGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVBsdWdpbnMuaW5kZXhPZihrZXkpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBwbHVnaW5zW2tleV0uYWN0aXZlLmNhbGwodGhpcywgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmRNYXAuT1VUREVOVCAmJiAvXk9VVERFTlQkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcC5PVVRERU5ULnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZE1hcC5JTkRFTlQgJiYgL15JTkRFTlQkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcC5JTkRFTlQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbW1hbmRNYXBba2V5XSwgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IGVkaXRvcidzIHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0UmFuZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl92YXJpYWJsZS5fcmFuZ2UgfHwgdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQgPT09IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCB8fCAhY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY29udGFpbnMoc2VsZWN0aW9uLmZvY3VzTm9kZSkpIHJldHVybiByYW5nZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsIGVjID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwgc28gPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LCBlbyA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVWYWx1ZSA9IHV0aWwuY29tcGFyZUVsZW1lbnRzKHNjLCBlYyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodERpciA9IGNvbXBhcmVWYWx1ZS5hbmNlc3RvciAmJiAoY29tcGFyZVZhbHVlLnJlc3VsdCA9PT0gMCA/IHNvIDw9IGVvIDogY29tcGFyZVZhbHVlLnJlc3VsdCA+IDEgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0UmFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHREaXIgPyBzYyA6IGVjLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0RGlyID8gc28gOiBlbyxcclxuICAgICAgICAgICAgICAgICAgICByaWdodERpciA/IGVjIDogc2MsXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHREaXIgPyBlbyA6IHNvXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIElmIHRoZSBcInJhbmdlXCIgb2JqZWN0IGlzIGEgbm9uLWVkaXRhYmxlIGFyZWEsIGFkZCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdG9yIGFuZCB1cGRhdGUgdGhlIFwicmFuZ2VcIiBvYmplY3QuXHJcbiAgICAgICAgICogUmV0dXJucyBhIG5ldyBcInJhbmdlXCIgb3IgYXJndW1lbnQgXCJyYW5nZVwiLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByYW5nZSBjb3JlLmdldFJhbmdlKClcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8bnVsbH0gY29udGFpbmVyIElmIHRoZXJlIGlzIFwiY29udGFpbmVyXCIgYXJndW1lbnQsIGl0IGNyZWF0ZXMgYSBsaW5lIGluIGZyb250IG9mIHRoZSBjb250YWluZXIuXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gcmFuZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRSYW5nZV9hZGRMaW5lOiBmdW5jdGlvbiAocmFuZ2UsIGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uVm9pZChyYW5nZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHd5c2l3eWcgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5ZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gdXRpbC5jcmVhdGVFbGVtZW50KG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBvcC5pbm5lckhUTUwgPSAnPGJyPic7XHJcbiAgICAgICAgICAgICAgICB3eXNpd3lnLmluc2VydEJlZm9yZShvcCwgY29udGFpbmVyICYmIGNvbnRhaW5lciAhPT0gd3lzaXd5ZyA/IGNvbnRhaW5lci5uZXh0RWxlbWVudFNpYmxpbmcgOiB3eXNpd3lnLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uob3AuZmlyc3RFbGVtZW50Q2hpbGQsIDAsIG9wLmZpcnN0RWxlbWVudENoaWxkLCAxKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5fdmFyaWFibGUuX3JhbmdlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByYW5nZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHdpbmRvdyBzZWxlY3Rpb24gb2JlamN0XHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRvd1Jvb3QgJiYgdGhpcy5fc2hhZG93Um9vdC5nZXRTZWxlY3Rpb24gPyB0aGlzLl9zaGFkb3dSb290LmdldFNlbGVjdGlvbigpIDogdGhpcy5fd3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IHNlbGVjdCBub2RlXHJcbiAgICAgICAgICogQHJldHVybnMge05vZGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0aW9uTm9kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZsKgKHV0aWwuaXNXeXNpd3lnRGl2KHRoaXMuX3ZhcmlhYmxlLl9zZWxlY3Rpb25Ob2RlKSnCoHRoaXMuX2VkaXRvclJhbmdlKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk5vZGUgPSB1dGlsLmdldENoaWxkRWxlbWVudChjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCB8fCBjdXJyZW50Lm5vZGVUeXBlID09PSAzOyB9LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbk5vZGUpwqB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb25Ob2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25Ob2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZS5fc2VsZWN0aW9uTm9kZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2F2aW5nIHRoZSByYW5nZSBvYmplY3QgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvZiBlZGl0b3JcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9lZGl0b3JSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Ob2RlID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuX2NyZWF0ZURlZmF1bHRSYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fcmFuZ2UgPSByYW5nZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb24uZXh0ZW50Tm9kZSB8fCBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb25Ob2RlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gdGhlIHJhbmdlIG9iamVjdCBvZiBlZGl0b3IncyBmaXJzdCBjaGlsZCBub2RlXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9jcmVhdGVEZWZhdWx0UmFuZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3lzaXd5ZyA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnO1xyXG4gICAgICAgICAgICB3eXNpd3lnLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fd2QuY3JlYXRlUmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmb2N1c0VsID0gd3lzaXd5Zy5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgaWYgKCFmb2N1c0VsKSB7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0VsID0gdXRpbC5jcmVhdGVFbGVtZW50KG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBmb2N1c0VsLmlubmVySFRNTCA9ICc8YnI+JztcclxuICAgICAgICAgICAgICAgIHd5c2l3eWcuYXBwZW5kQ2hpbGQoZm9jdXNFbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGZvY3VzRWwsIDApO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoZm9jdXNFbCwgMCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyB2YWxpZCBcInNlbGVjdGlvblwiLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByYW5nZSBjb3JlLmdldFJhbmdlKClcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSByYW5nZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3NlbGVjdGlvblZvaWQ6IGZ1bmN0aW9uIChyYW5nZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb21tID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgICAgIHJldHVybiAodXRpbC5pc1d5c2l3eWdEaXYocmFuZ2Uuc3RhcnRDb250YWluZXIpICYmIHV0aWwuaXNXeXNpd3lnRGl2KHJhbmdlLmVuZENvbnRhaW5lcikpIHx8IC9GSUdVUkUvaS50ZXN0KGNvbW0ubm9kZU5hbWUpIHx8IHRoaXMuX2ZpbGVNYW5hZ2VyLnJlZ0V4cC50ZXN0KGNvbW0ubm9kZU5hbWUpIHx8IHV0aWwuaXNNZWRpYUNvbXBvbmVudChjb21tKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVzZXQgcmFuZ2Ugb2JqZWN0IHRvIHRleHQgbm9kZSBzZWxlY3RlZCBzdGF0dXMuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm8gdmFsaWQgc2VsZWN0aW9uLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3Jlc2V0UmFuZ2VUb1RleHROb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uVm9pZChyYW5nZSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRPZmYgPSByYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgbGV0IGVuZENvbiA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgbGV0IGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgbGV0IHRlbXBDb24sIHRlbXBPZmZzZXQsIHRlbXBDaGlsZDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChzdGFydENvbikpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Q29uID0gc3RhcnRDb24uY2hpbGROb2Rlc1tzdGFydE9mZl0gfHwgc3RhcnRDb24ubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmYgPSBzdGFydENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNGb3JtYXRFbGVtZW50KGVuZENvbikpIHtcclxuICAgICAgICAgICAgICAgIGVuZENvbiA9IGVuZENvbi5jaGlsZE5vZGVzW2VuZE9mZl0gfHwgZW5kQ29uLmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGVuZE9mZiA9IGVuZENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihzdGFydENvbikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkIDogc3RhcnRDb247XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSBzdGFydE9mZjtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQnJlYWsodGVtcENvbikgfHwgKHRlbXBDb24ubm9kZVR5cGUgPT09IDEgJiYgdGVtcENvbi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5QnJlYWsgPSB1dGlsLmlzQnJlYWsodGVtcENvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9ubHlCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wQ29uICYmICF1dGlsLmlzQnJlYWsodGVtcENvbikgJiYgdGVtcENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uID0gdGVtcENvbi5jaGlsZE5vZGVzW3RlbXBPZmZzZXRdIHx8IHRlbXBDb24ubmV4dEVsZW1lbnRTaWJsaW5nIHx8IHRlbXBDb24ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3JtYXQgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQodGVtcENvbiwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZm9ybWF0LCBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5nZXRQYXJlbnRFbGVtZW50KHRlbXBDb24sIHV0aWwuaXNDZWxsKSA/ICdESVYnIDogb3B0aW9ucy5kZWZhdWx0VGFnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmb3JtYXQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuYXBwZW5kQ2hpbGQodGVtcENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzQnJlYWsodGVtcENvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRleHQgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZW1wdHlUZXh0LCB0ZW1wQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uID0gZW1wdHlUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmx5QnJlYWspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uID09PSBlbmRDb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbiA9IHRlbXBDb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRPZmYgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgc3RhcnRDb24gPSB0ZW1wQ29uO1xyXG4gICAgICAgICAgICBzdGFydE9mZiA9IHRlbXBPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgdGVtcENvbiA9IHV0aWwuaXNXeXNpd3lnRGl2KGVuZENvbikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5sYXN0Q2hpbGQgOiBlbmRDb247XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSBlbmRPZmY7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKHRlbXBDb24pIHx8ICh0ZW1wQ29uLm5vZGVUeXBlID09PSAxICYmIHRlbXBDb24uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb25seUJyZWFrID0gdXRpbC5pc0JyZWFrKHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvbmx5QnJlYWspIHtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGVtcENvbiAmJiAhdXRpbC5pc0JyZWFrKHRlbXBDb24pICYmIHRlbXBDb24ubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENoaWxkID0gdGVtcENvbi5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcENoaWxkLmxlbmd0aCA9PT0gMCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSB0ZW1wQ2hpbGRbdGVtcE9mZnNldCA+IDAgPyB0ZW1wT2Zmc2V0IC0gMSA6IHRlbXBPZmZzZXRdIHx8ICEvRklHVVJFL2kudGVzdCh0ZW1wQ2hpbGRbMF0ubm9kZU5hbWUpID8gdGVtcENoaWxkWzBdIDogKHRlbXBDb24ucHJldmlvdXNFbGVtZW50U2libGluZyB8fCB0ZW1wQ29uLnByZXZpb3VzU2libGluZyB8fCBzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPZmZzZXQgPSB0ZW1wT2Zmc2V0ID4gMCA/IHRlbXBDb24udGV4dENvbnRlbnQubGVuZ3RoIDogdGVtcE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybWF0ID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHRlbXBDb24sIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT09IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGZvcm1hdCwgbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gdXRpbC5jcmVhdGVFbGVtZW50KHV0aWwuaXNDZWxsKGZvcm1hdCkgPyAnRElWJyA6IG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZm9ybWF0LCB0ZW1wQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmFwcGVuZENoaWxkKHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKHRlbXBDb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUZXh0ID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVtcHR5VGV4dCwgdGVtcENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbiA9IGVtcHR5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob25seUJyZWFrICYmICF0ZW1wQ29uLnByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZW5kQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgZW5kQ29uID0gdGVtcENvbjtcclxuICAgICAgICAgICAgZW5kT2ZmID0gdGVtcE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldCBSYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIFwiZm9ybWF0RWxlbWVudFwiKHV0aWwuaXNGb3JtYXRFbGVtZW50KSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiAoUmVwbGFjZXMgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBmdW5jdGlvbi11dGlsLmlzRm9ybWF0RWxlbWVudChjdXJyZW50KSlcclxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50czogZnVuY3Rpb24gKHZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9yZXNldFJhbmdlVG9UZXh0Tm9kZSgpKSByZXR1cm4gW107XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShjaGlsZHJlblswXSwgMCwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0sIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbiA/IHZhbGlkYXRpb24oY3VycmVudCkgOiB1dGlsLmlzRm9ybWF0RWxlbWVudChjdXJyZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikgJiYgIXV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgbGluZU5vZGVzLnVuc2hpZnQodXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbW1vbkNvbiwgbnVsbCkpO1xyXG4gICAgICAgICAgICBpZiAoc3RhcnRDb24gPT09IGVuZENvbiB8fCBsaW5lTm9kZXMubGVuZ3RoID09PSAxKSByZXR1cm4gbGluZU5vZGVzO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0TGluZSA9IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChzdGFydENvbiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGxldCBlbmRMaW5lID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KGVuZENvbiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGxldCBzdGFydElkeCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBlbmRJZHggPSBudWxsO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3Qgb25seVRhYmxlID0gZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmlzVGFibGUoY3VycmVudCkgPyAvXlRBQkxFJC9pLnRlc3QoY3VycmVudC5ub2RlTmFtZSkgOiB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0UmFuZ2VFbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KHN0YXJ0TGluZSwgb25seVRhYmxlKTtcclxuICAgICAgICAgICAgbGV0IGVuZFJhbmdlRWwgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChlbmRMaW5lLCBvbmx5VGFibGUpO1xyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1RhYmxlKHN0YXJ0UmFuZ2VFbCkgJiYgdXRpbC5pc0xpc3RDZWxsKHN0YXJ0UmFuZ2VFbC5wYXJlbnROb2RlKSkgc3RhcnRSYW5nZUVsID0gc3RhcnRSYW5nZUVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzVGFibGUoZW5kUmFuZ2VFbCkgJiYgdXRpbC5pc0xpc3RDZWxsKGVuZFJhbmdlRWwucGFyZW50Tm9kZSkpIGVuZFJhbmdlRWwgPSBlbmRSYW5nZUVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBzYW1lUmFuZ2UgPSBzdGFydFJhbmdlRWwgPT09IGVuZFJhbmdlRWw7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lTm9kZXMubGVuZ3RoLCBsaW5lOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lTm9kZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0TGluZSA9PT0gbGluZSB8fCAoIXNhbWVSYW5nZSAmJiBsaW5lID09PSBzdGFydFJhbmdlRWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJZHggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmRMaW5lID09PSBsaW5lIHx8ICghc2FtZVJhbmdlICYmIGxpbmUgPT09IGVuZFJhbmdlRWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBudWxsKSBzdGFydElkeCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChlbmRJZHggPT09IG51bGwpIGVuZElkeCA9IGxpbmVOb2Rlcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGxpbmVOb2Rlcy5zbGljZShzdGFydElkeCwgZW5kSWR4ICsgMSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBmb3JtYXQgZWxlbWVudHMgYW5kIGNvbXBvbmVudHMgZnJvbSB0aGUgc2VsZWN0ZWQgYXJlYS4gKFAsIERJViwgSFsxLTZdLCBPTCwgVUwsIFRBQkxFLi4pXHJcbiAgICAgICAgICogSWYgc29tZSBvZiB0aGUgY29tcG9uZW50IGFyZSBpbmNsdWRlZCBpbiB0aGUgc2VsZWN0aW9uLCBnZXQgdGhlIGVudGlyZSB0aGF0IGNvbXBvbmVudC5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlbW92ZUR1cGxpY2F0ZSBJZiB0cnVlLCBpZiB0aGVyZSBpcyBhIHBhcmVudCBhbmQgY2hpbGQgdGFnIGFtb25nIHRoZSBzZWxlY3RlZCBlbGVtZW50cywgdGhlIGNoaWxkIHRhZyBpcyBleGNsdWRlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50c0FuZENvbXBvbmVudHM6IGZ1bmN0aW9uIChyZW1vdmVEdXBsaWNhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gdGhpcy5nZXRSYW5nZSgpLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBteUNvbXBvbmVudCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChjb21tb25Db24sIHV0aWwuaXNDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZExpbmVzID0gdXRpbC5pc1RhYmxlKGNvbW1vbkNvbikgPyBcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50cyhudWxsKSA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmdldFBhcmVudEVsZW1lbnQoY3VycmVudCwgdGhpcy5pc0NvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmlzRm9ybWF0RWxlbWVudChjdXJyZW50KSAmJiAoIWNvbXBvbmVudCB8fCBjb21wb25lbnQgPT09IG15Q29tcG9uZW50KSkgfHwgKHRoaXMuaXNDb21wb25lbnQoY3VycmVudCkgJiYgIXRoaXMuZ2V0Rm9ybWF0RWxlbWVudChjdXJyZW50KSk7XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodXRpbCkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHJlbW92ZUR1cGxpY2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkTGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZExpbmVzW2pdLmNvbnRhaW5zKHNlbGVjdGVkTGluZXNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExpbmVzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTsgbGVuLS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTGluZXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERldGVybWluZSBpZiB0aGlzIG9mZnNldCBpcyB0aGUgZWRnZSBvZmZzZXQgb2YgY29udGFpbmVyXHJcbiAgICAgICAgICogQHBhcmFtIHtOb2RlfSBjb250YWluZXIgVGhlIG5vZGUgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuIChyYW5nZS5zdGFydENvbnRhaW5lci4uKVxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC4gKGNvcmUuZ2V0UmFuZ2UoKS5zdGFydE9mZnNldC4uLilcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3x1bmRlZmluZWR9IGRpciBTZWxlY3QgY2hlY2sgcG9pbnQgLSBCb3RoIGVkZ2UsIEZyb250IGVkZ2Ugb3IgRW5kIGVkZ2UuIChcImZyb250XCI6IEZyb250IGVkZ2UsIFwiZW5kXCI6IEVuZCBlZGdlLCB1bmRlZmluZWQ6IEJvdGggZWRnZSlcclxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICBpc0VkZ2VQb2ludDogZnVuY3Rpb24gKGNvbnRhaW5lciwgb2Zmc2V0LCBkaXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChkaXIgIT09ICdlbmQnICYmIG9mZnNldCA9PT0gMCkgfHwgKCghZGlyIHx8IGRpciAhPT0gJ2Zyb250JykgJiYgIWNvbnRhaW5lci5ub2RlVmFsdWUgJiYgb2Zmc2V0ID09PSAxKSB8fCAoKCFkaXIgfHwgZGlyID09PSAnZW5kJykgJiYgISFjb250YWluZXIubm9kZVZhbHVlICYmIG9mZnNldCA9PT0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiB0aGUgY29udGFpbmVyIGFuZCBvZmZzZXQgdmFsdWVzIGFyZSB0aGUgZWRnZXMgb2YgdGhlIGZvcm1hdCB0YWdcclxuICAgICAgICAgKiBAcGFyYW0ge05vZGV9IGNvbnRhaW5lciBUaGUgbm9kZSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC4gKHJhbmdlLnN0YXJ0Q29udGFpbmVyLi4pXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LiAoY29yZS5nZXRSYW5nZSgpLnN0YXJ0T2Zmc2V0Li4uKVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXIgU2VsZWN0IGNoZWNrIHBvaW50IC0gXCJmcm9udFwiOiBGcm9udCBlZGdlLCBcImVuZFwiOiBFbmQgZWRnZSwgdW5kZWZpbmVkOiBCb3RoIGVkZ2UuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaXNFZGdlRm9ybWF0OiBmdW5jdGlvbiAobm9kZSwgb2Zmc2V0LCBkaXIpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRWRnZVBvaW50KG5vZGUsIG9mZnNldCwgZGlyKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGRpciA9IGRpciA9PT0gJ2Zyb250JyA/ICdwcmV2aW91c1NpYmxpbmcnIDogJ25leHRTaWJsaW5nJztcclxuICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgIXV0aWwuaXNGb3JtYXRFbGVtZW50KG5vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0Rpdihub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlW2Rpcl0gfHwgKHV0aWwuaXNCcmVhayhub2RlW2Rpcl0pICYmICFub2RlW2Rpcl1bZGlyXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0xvYWRpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFwcGVuZCBmb3JtYXQgZWxlbWVudCB0byBzaWJsaW5nIG5vZGUgb2YgYXJndW1lbnQgZWxlbWVudC5cclxuICAgICAgICAgKiBJZiB0aGUgXCJmb3JtYXROb2RlTmFtZVwiIGFyZ3VtZW50IHZhbHVlIGlzIHByZXNlbnQsIHRoZSB0YWcgb2YgdGhhdCBhcmd1bWVudCB2YWx1ZSBpcyBpbnNlcnRlZCxcclxuICAgICAgICAgKiBJZiBub3QsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IHRhZyBpcyBpbnNlcnRlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgSW5zZXJ0IGFzIHNpYmxpbmdzIG9mIHRoYXQgZWxlbWVudFxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR8bnVsbH0gZm9ybWF0Tm9kZSBOb2RlIG5hbWUgb3Igbm9kZSBvYmVqY3QgdG8gYmUgaW5zZXJ0ZWRcclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRGb3JtYXRUYWc6IGZ1bmN0aW9uIChlbGVtZW50LCBmb3JtYXROb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGb3JtYXRFbCA9IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudCh0aGlzLmdldFNlbGVjdGlvbk5vZGUoKSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9Gb3JtYXROYW1lID0gZm9ybWF0Tm9kZSA/ICh0eXBlb2YgZm9ybWF0Tm9kZSA9PT0gJ3N0cmluZycgPyBmb3JtYXROb2RlIDogZm9ybWF0Tm9kZS5ub2RlTmFtZSkgOiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudEZvcm1hdEVsKSAmJiAhdXRpbC5pc0ZyZWVGb3JtYXRFbGVtZW50KGN1cnJlbnRGb3JtYXRFbCkpID8gY3VycmVudEZvcm1hdEVsLm5vZGVOYW1lIDogb3B0aW9ucy5kZWZhdWx0VGFnO1xyXG4gICAgICAgICAgICBjb25zdCBvRm9ybWF0ID0gdXRpbC5jcmVhdGVFbGVtZW50KG9Gb3JtYXROYW1lKTtcclxuICAgICAgICAgICAgb0Zvcm1hdC5pbm5lckhUTUwgPSAnPGJyPic7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGZvcm1hdE5vZGUgJiYgdHlwZW9mIGZvcm1hdE5vZGUgIT09ICdzdHJpbmcnKSB8fCAoIWZvcm1hdE5vZGUgJiYgdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudEZvcm1hdEVsKSkpIHtcclxuICAgICAgICAgICAgICAgIHV0aWwuY29weVRhZ0F0dHJpYnV0ZXMob0Zvcm1hdCwgZm9ybWF0Tm9kZSB8fCBjdXJyZW50Rm9ybWF0RWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0NlbGwoZWxlbWVudCkpIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKG9Gb3JtYXQsIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgZWxzZSBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG9Gb3JtYXQsIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvRm9ybWF0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgbWV0aG9kIHRvIGluc2VydCBhIGVsZW1lbnQgYW5kIHJldHVybi4gKHVzZWQgZWxlbWVudHMgOiB0YWJsZSwgaHIsIGltYWdlLCB2aWRlbylcclxuICAgICAgICAgKiBJZiBcImVsZW1lbnRcIiBpcyBcIkhSXCIsIGluc2VydCBhbmQgcmV0dXJuIHRoZSBuZXcgbGluZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0byBiZSBpbnNlcnRlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbm90SGlzdG9yeVB1c2ggV2hlbiB0cnVlLCBpdCBkb2VzIG5vdCB1cGRhdGUgdGhlIGhpc3Rvcnkgc3RhY2sgYW5kIHRoZSBzZWxlY3Rpb24gb2JqZWN0IGFuZCByZXR1cm4gRWRnZU5vZGVzICh1dGlsLmdldEVkZ2VDaGlsZE5vZGVzKVxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY2hlY2tDaGFyQ291bnQgSWYgdHJ1ZSwgaWYgXCJvcHRpb25zLm1heENoYXJDb3VudFwiIGlzIGV4Y2VlZGVkIHdoZW4gXCJlbGVtZW50XCIgaXMgYWRkZWQsIG51bGwgaXMgcmV0dXJuZWQgd2l0aG91dCBhZGRpdGlvbi5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5vdFNlbGVjdCBJZiB0cnVlLCBEbyBub3QgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGluc2VydGVkIGNvbXBvbmVudC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnRDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBub3RIaXN0b3J5UHVzaCwgY2hlY2tDaGFyQ291bnQsIG5vdFNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tDaGFyQ291bnQgJiYgIXRoaXMuY2hlY2tDaGFyQ291bnQoZWxlbWVudCwgbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByID0gdGhpcy5yZW1vdmVOb2RlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UmFuZ2VfYWRkTGluZSh0aGlzLmdldFJhbmdlKCksIHIuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgbGV0IG9Ob2RlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbk5vZGUgPSB0aGlzLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgbGV0IGZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHNlbGVjdGlvbk5vZGUsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNMaXN0Q2VsbChmb3JtYXRFbCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Tm9kZShlbGVtZW50LCBzZWxlY3Rpb25Ob2RlID09PSBmb3JtYXRFbCA/IG51bGwgOiByLmNvbnRhaW5lci5uZXh0U2libGluZywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm5leHRTaWJsaW5nKSBlbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodXRpbC5jcmVhdGVFbGVtZW50KCdCUicpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFJhbmdlKCkuY29sbGFwc2VkICYmIChyLmNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMyB8fCB1dGlsLmlzQnJlYWsoci5jb250YWluZXIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHRoRm9ybWF0ID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHIuY29udGFpbmVyLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gdGhpcy5pc1JhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50KTsgfS5iaW5kKHV0aWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBvTm9kZSA9IHV0aWwuc3BsaXRFbGVtZW50KHIuY29udGFpbmVyLCByLm9mZnNldCwgIWRlcHRoRm9ybWF0ID8gMCA6IHV0aWwuZ2V0RWxlbWVudERlcHRoKGRlcHRoRm9ybWF0KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTm9kZSkgZm9ybWF0RWwgPSBvTm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydE5vZGUoZWxlbWVudCwgZm9ybWF0RWwsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRFbCAmJiB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShmb3JtYXRFbCkpIHV0aWwucmVtb3ZlSXRlbShmb3JtYXRFbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoZWxlbWVudCwgMCwgZWxlbWVudCwgMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW5vdFNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbXBvbmVudEluZm8gPSB0aGlzLmdldEZpbGVDb21wb25lbnQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZUNvbXBvbmVudEluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChmaWxlQ29tcG9uZW50SW5mby50YXJnZXQsIGZpbGVDb21wb25lbnRJbmZvLnBsdWdpbk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Ob2RlID0gdXRpbC5nZXRFZGdlQ2hpbGROb2RlcyhvTm9kZSwgbnVsbCkuc2MgfHwgb05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShvTm9kZSwgMCwgb05vZGUsIDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgIGlmICghbm90SGlzdG9yeVB1c2gpIHRoaXMuaGlzdG9yeS5wdXNoKDEpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9Ob2RlIHx8IGVsZW1lbnQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGZpbGUgY29tcG9uZW50IGFuZCB0aGF0IHBsdWdpbiBuYW1lXHJcbiAgICAgICAgICogcmV0dXJuOiB7dGFyZ2V0LCBjb21wb25lbnQsIHBsdWdpbk5hbWV9IHwgbnVsbFxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudCAoZmlndXJlIHRhZywgY29tcG9uZW50IGRpdiwgZmlsZSB0YWcpXHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdHxudWxsfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldEZpbGVDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZmlsZU1hbmFnZXIucXVlcnlTdHJpbmcgfHwgIWVsZW1lbnQpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRhcmdldCwgcGx1Z2luTmFtZTtcclxuICAgICAgICAgICAgaWYgKC9eRklHVVJFJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgfHwgL3NlLWNvbXBvbmVudC8udGVzdChlbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IGVsZW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9maWxlTWFuYWdlci5xdWVyeVN0cmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZWxlbWVudC5ub2RlTmFtZSAmJiB0aGlzLl9maWxlTWFuYWdlci5yZWdFeHAudGVzdChlbGVtZW50Lm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gZWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luTmFtZSA9IHRoaXMuX2ZpbGVNYW5hZ2VyLnBsdWdpbk1hcFt0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07XHJcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQsIHV0aWwuaXNDb21wb25lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5OYW1lOiBwbHVnaW5OYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBjb21wb25lbnQoaW1hZ2UsIHZpZGVvKSBpcyBzZWxlY3RlZCBhbmQgdGhlIHJlc2l6aW5nIG1vZHVsZSBpcyBjYWxsZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGFnIChpbWcsIGlmcmFtZSwgdmlkZW8pXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBsdWdpbk5hbWUgUGx1Z2luIG5hbWUgKGltYWdlLCB2aWRlbylcclxuICAgICAgICAgKi9cclxuICAgICAgICBzZWxlY3RDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBwbHVnaW5OYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzVW5lZGl0YWJsZUNvbXBvbmVudCh1dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgdXRpbC5pc0NvbXBvbmVudCkpIHx8IHV0aWwuaXNVbmVkaXRhYmxlQ29tcG9uZW50KGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNGb2N1cykgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghcGx1Z2luKSByZXR1cm47XHJcbiAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4uc2VsZWN0ID09PSAnZnVuY3Rpb24nKSB0aGlzLmNhbGxQbHVnaW4ocGx1Z2luTmFtZSwgcGx1Z2luLnNlbGVjdC5iaW5kKHRoaXMsIGVsZW1lbnQpLCBudWxsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbXBvbmVudExpbmVCcmVha2VyKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgbGluZSBicmVha2VyIG9mIGNvbXBvbmVudFxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRhZyAoaW1nLCBpZnJhbWUsIHZpZGVvKVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3NldENvbXBvbmVudExpbmVCcmVha2VyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBsaW5lIGJyZWFrZXJcclxuICAgICAgICAgICAgdGhpcy5fbGluZUJyZWFrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHV0aWwuaXNDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCB0X3N0eWxlID0gY29udGV4dC5lbGVtZW50LmxpbmVCcmVha2VyX3Quc3R5bGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGJfc3R5bGUgPSBjb250ZXh0LmVsZW1lbnQubGluZUJyZWFrZXJfYi5zdHlsZTtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLnJlc2l6ZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snID8gdGhpcy5jb250ZXh0LnJlc2l6aW5nLnJlc2l6ZUNvbnRhaW5lciA6IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc0xpc3QgPSB1dGlsLmlzTGlzdENlbGwoY29udGFpbmVyLnBhcmVudE5vZGUpO1xyXG4gICAgICAgICAgICBsZXQgY29tcG9uZW50VG9wLCB3U2Nyb2xsLCB3O1xyXG4gICAgICAgICAgICAvLyB0b3BcclxuICAgICAgICAgICAgaWYgKGlzTGlzdCA/ICFjb250YWluZXIucHJldmlvdXNTaWJsaW5nIDogIXV0aWwuaXNGb3JtYXRFbGVtZW50KGNvbnRhaW5lci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX2xpbmVCcmVha0NvbXAgPSBjb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB3U2Nyb2xsID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VG9wID0gdXRpbC5nZXRPZmZzZXQoZWxlbWVudCwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZSkudG9wICsgd1Njcm9sbDtcclxuICAgICAgICAgICAgICAgIHcgPSAodGFyZ2V0Lm9mZnNldFdpZHRoIC8gMikgLyAyO1xyXG5cclxuICAgICAgICAgICAgICAgIHRfc3R5bGUudG9wID0gKGNvbXBvbmVudFRvcCAtIHdTY3JvbGwgLSAxMikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdF9zdHlsZS5sZWZ0ID0gKHV0aWwuZ2V0T2Zmc2V0KHRhcmdldCkubGVmdCArIHcpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRfc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0X3N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYm90dG9tXHJcbiAgICAgICAgICAgIGlmIChpc0xpc3QgPyAhY29udGFpbmVyLm5leHRTaWJsaW5nIDogIXV0aWwuaXNGb3JtYXRFbGVtZW50KGNvbnRhaW5lci5uZXh0RWxlbWVudFNpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudFRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9saW5lQnJlYWtDb21wID0gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHdTY3JvbGwgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9wID0gdXRpbC5nZXRPZmZzZXQoZWxlbWVudCwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZSkudG9wICsgd1Njcm9sbDtcclxuICAgICAgICAgICAgICAgICAgICB3ID0gKHRhcmdldC5vZmZzZXRXaWR0aCAvIDIpIC8gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBiX3N0eWxlLnRvcCA9IChjb21wb25lbnRUb3AgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0IC0gd1Njcm9sbCAtIDEyKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBiX3N0eWxlLmxlZnQgPSAodXRpbC5nZXRPZmZzZXQodGFyZ2V0KS5sZWZ0ICsgdGFyZ2V0Lm9mZnNldFdpZHRoIC0gdyAtIDI0KSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBiX3N0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYl9zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSBzZWxlY3RlZCBub2RlIGFuZCBpbnNlcnQgYXJndW1lbnQgdmFsdWUgbm9kZSBhbmQgcmV0dXJuLlxyXG4gICAgICAgICAqIElmIHRoZSBcImFmdGVyTm9kZVwiIGV4aXN0cywgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIFwiYWZ0ZXJOb2RlXCJcclxuICAgICAgICAgKiBJbnNlcnRpbmcgYSB0ZXh0IG5vZGUgbWVyZ2VzIHdpdGggYm90aCB0ZXh0IG5vZGVzIG9uIGJvdGggc2lkZXMgYW5kIHJldHVybnMgYSBuZXcgXCJ7IGNvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCB9XCIuXHJcbiAgICAgICAgICogQHBhcmFtIHtOb2RlfSBvTm9kZSBFbGVtZW50IHRvIGJlIGluc2VydGVkXHJcbiAgICAgICAgICogQHBhcmFtIHtOb2RlfG51bGx9IGFmdGVyTm9kZSBJZiB0aGUgbm9kZSBleGlzdHMsIGl0IGlzIGluc2VydGVkIGFmdGVyIHRoZSBub2RlXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGVja0NoYXJDb3VudCBJZiB0cnVlLCBpZiBcIm9wdGlvbnMubWF4Q2hhckNvdW50XCIgaXMgZXhjZWVkZWQgd2hlbiBcImVsZW1lbnRcIiBpcyBhZGRlZCwgbnVsbCBpcyByZXR1cm5lZCB3aXRob3V0IGFkZGl0aW9uLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R8Tm9kZXxudWxsfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluc2VydE5vZGU6IGZ1bmN0aW9uIChvTm9kZSwgYWZ0ZXJOb2RlLCBjaGVja0NoYXJDb3VudCkge1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tDaGFyQ291bnQgJiYgIXRoaXMuY2hlY2tDaGFyQ291bnQob05vZGUsIG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZnJlZUZvcm1hdCA9IHV0aWwuZ2V0RnJlZUZvcm1hdEVsZW1lbnQodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCksIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zdCBpc0Zvcm1hdHMgPSAoIWZyZWVGb3JtYXQgJiYgKHV0aWwuaXNGb3JtYXRFbGVtZW50KG9Ob2RlKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KG9Ob2RlKSkpIHx8IHV0aWwuaXNDb21wb25lbnQob05vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhZnRlck5vZGUgJiYgaXNGb3JtYXRzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydE9mZnNldCAhPT0gcmFuZ2UuZW5kT2Zmc2V0IHx8IHJhbmdlLnN0YXJ0Q29udGFpbmVyICE9PSByYW5nZS5lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5yZW1vdmVOb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuY29udGFpbmVyLm5vZGVUeXBlID09PSAzIHx8IHV0aWwuaXNCcmVhayhyLmNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwdGhGb3JtYXQgPSB1dGlsLmdldFBhcmVudEVsZW1lbnQoci5jb250YWluZXIsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiB0aGlzLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGN1cnJlbnQpIHx8IHRoaXMuaXNMaXN0Q2VsbChjdXJyZW50KTsgfS5iaW5kKHV0aWwpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gdXRpbC5zcGxpdEVsZW1lbnQoci5jb250YWluZXIsIHIub2Zmc2V0LCAhZGVwdGhGb3JtYXQgPyAwIDogdXRpbC5nZXRFbGVtZW50RGVwdGgoZGVwdGhGb3JtYXQpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUpIGFmdGVyTm9kZSA9IGFmdGVyTm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9ICghYWZ0ZXJOb2RlICYmICFpc0Zvcm1hdHMpID8gdGhpcy5nZXRSYW5nZV9hZGRMaW5lKHRoaXMuZ2V0UmFuZ2UoKSwgbnVsbCkgOiB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmRPZmYgPSByYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdFJhbmdlID0gcmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IGNvbW1vbkNvbiAmJiB1dGlsLmlzRm9ybWF0RWxlbWVudChjb21tb25Db24pO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IGZvcm1hdFJhbmdlID8gY29tbW9uQ29uLmNoaWxkTm9kZXNbc3RhcnRPZmZdIDogcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IGZvcm1hdFJhbmdlID8gY29tbW9uQ29uLmNoaWxkTm9kZXNbZW5kT2ZmXSA6IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUsIG9yaWdpbkFmdGVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghYWZ0ZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRDb24ubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gc3RhcnRDb24ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogTm8gU2VsZWN0IHJhbmdlIG5vZGUgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbW9uQ29uLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tb25Db24udGV4dENvbnRlbnQubGVuZ3RoID4gZW5kT2ZmKSBhZnRlck5vZGUgPSBjb21tb25Db24uc3BsaXRUZXh0KGVuZE9mZik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYWZ0ZXJOb2RlID0gY29tbW9uQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0JyZWFrKHBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYyA9IHBhcmVudE5vZGUuY2hpbGROb2Rlc1tzdGFydE9mZl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c05vZGUgPSAoYyAmJiBjLm5vZGVUeXBlID09PSAzICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKGMpICYmIHV0aWwuaXNCcmVhayhjLm5leHRTaWJsaW5nKSkgPyBjLm5leHRTaWJsaW5nIDogYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c05vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvY3VzTm9kZS5uZXh0U2libGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZvY3VzTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gKHV0aWwuaXNCcmVhayhmb2N1c05vZGUpICYmICF1dGlsLmlzQnJlYWsob05vZGUpKSA/IGZvY3VzTm9kZSA6IGZvY3VzTm9kZS5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSBwYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qKiBTZWxlY3QgcmFuZ2Ugbm9kZXMgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVDb250YWluZXIgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWRnZVBvaW50KGVuZENvbiwgZW5kT2ZmKSkgYWZ0ZXJOb2RlID0gZW5kQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFmdGVyTm9kZSA9IGVuZENvbi5zcGxpdFRleHQoZW5kT2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VkZ2VQb2ludChzdGFydENvbiwgc3RhcnRPZmYpKSByZW1vdmVOb2RlID0gc3RhcnRDb24uc3BsaXRUZXh0KHN0YXJ0T2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwICYmIGlzRm9ybWF0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbm5lckhUTUwgPSAnPGJyPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRUYWcgPSB0aGlzLnJlbW92ZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcmVtb3ZlZFRhZy5jb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXIgPSByZW1vdmVkVGFnLnByZXZDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwICYmIGlzRm9ybWF0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNGb3JtYXRFbGVtZW50KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxicj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzwnICsgb3B0aW9ucy5kZWZhdWx0VGFnICsgJz48YnI+PC8nICsgb3B0aW9ucy5kZWZhdWx0VGFnICsgJz4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRm9ybWF0cyAmJiBwcmV2Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcHJldkNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMyA/IHByZXZDb250YWluZXIucGFyZW50Tm9kZSA6IHByZXZDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5jb250YWlucyhjb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChhZnRlck5vZGUucGFyZW50Tm9kZSAhPT0gcGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSBhZnRlck5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gaXNGb3JtYXRzID8gY29tbW9uQ29uIDogY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gaXNGb3JtYXRzID8gZW5kQ29uIDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFmdGVyTm9kZSAmJiAhdXRpbC5pc0Zvcm1hdEVsZW1lbnQoYWZ0ZXJOb2RlKSAmJiBhZnRlck5vZGUucGFyZW50Tm9kZSAhPT0gY29tbW9uQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSBhZnRlck5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBoYXMgYWZ0ZXJOb2RlXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IGFmdGVyTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gYWZ0ZXJOb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luQWZ0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAtLS0gaW5zZXJ0IG5vZGUgLS0tXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQob05vZGUpIHx8IHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQob05vZGUpIHx8ICghdXRpbC5pc0xpc3RDZWxsKHBhcmVudE5vZGUpICYmIHV0aWwuaXNDb21wb25lbnQob05vZGUpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFBhcmVudCA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNMaXN0KGFmdGVyTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IGFmdGVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHV0aWwuaXNMaXN0Q2VsbChhZnRlck5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBhZnRlck5vZGUucHJldmlvdXNFbGVtZW50U2libGluZyB8fCBhZnRlck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb3JpZ2luQWZ0ZXIgJiYgIWFmdGVyTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5yZW1vdmVOb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHIuY29udGFpbmVyLm5vZGVUeXBlID09PSAzID8gKHV0aWwuaXNMaXN0Q2VsbCh1dGlsLmdldEZvcm1hdEVsZW1lbnQoci5jb250YWluZXIsIG51bGwpKSA/IHIuY29udGFpbmVyIDogKHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChyLmNvbnRhaW5lciwgbnVsbCkgfHwgci5jb250YWluZXIucGFyZW50Tm9kZSkpIDogci5jb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlQ29uID0gdXRpbC5pc1d5c2l3eWdEaXYoY29udGFpbmVyKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSByYW5nZUNvbiA/IGNvbnRhaW5lciA6IGNvbnRhaW5lci5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSByYW5nZUNvbiA/IG51bGwgOiBjb250YWluZXIubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwICYmIHBhcmVudE5vZGUgIT09IG9sZFBhcmVudCkgdXRpbC5yZW1vdmVJdGVtKG9sZFBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRm9ybWF0cyAmJiAhZnJlZUZvcm1hdCAmJiAhdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChwYXJlbnROb2RlKSAmJiAhdXRpbC5pc0xpc3RDZWxsKHBhcmVudE5vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0RpdihwYXJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IHBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShvTm9kZSwgcGFyZW50Tm9kZSA9PT0gYWZ0ZXJOb2RlID8gcGFyZW50Tm9kZS5sYXN0Q2hpbGQgOiBhZnRlck5vZGUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG9Ob2RlKTtcclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIGlmIChmcmVlRm9ybWF0ICYmICh1dGlsLmlzRm9ybWF0RWxlbWVudChvTm9kZSkgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChvTm9kZSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb05vZGUgPSB0aGlzLl9zZXRJbnRvRnJlZUZvcm1hdChvTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzQ29tcG9uZW50KG9Ob2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTm9kZS5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IG9Ob2RlLnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IG9Ob2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1RleHQgPSAoIXByZXZpb3VzIHx8ICBwcmV2aW91cy5ub2RlVHlwZSA9PT0gMSB8fCB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShwcmV2aW91cykpID8gJycgOiBwcmV2aW91cy50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSAoIW5leHQgfHwgbmV4dC5ub2RlVHlwZSA9PT0gMSB8fCB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShuZXh0KSkgPyAnJyA6IG5leHQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyAmJiBwcmV2aW91c1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb05vZGUudGV4dENvbnRlbnQgPSBwcmV2aW91c1RleHQgKyBvTm9kZS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShwcmV2aW91cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTm9kZS50ZXh0Q29udGVudCArPSBuZXh0VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IG9Ob2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHByZXZpb3VzVGV4dC5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IG9Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCAtIG5leHRUZXh0Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShvTm9kZSwgbmV3UmFuZ2Uuc3RhcnRPZmZzZXQsIG9Ob2RlLCBuZXdSYW5nZS5lbmRPZmZzZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdSYW5nZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF1dGlsLmlzQnJlYWsob05vZGUpICYmIHV0aWwuaXNGb3JtYXRFbGVtZW50KHBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6ZXJvV2lkdGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9Ob2RlLnByZXZpb3VzU2libGluZyB8fCB1dGlsLmlzQnJlYWsob05vZGUucHJldmlvdXNTaWJsaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemVyb1dpZHRoID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Ob2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHplcm9XaWR0aCwgb05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9Ob2RlLm5leHRTaWJsaW5nIHx8IHV0aWwuaXNCcmVhayhvTm9kZS5uZXh0U2libGluZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9XaWR0aCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh6ZXJvV2lkdGgsIG9Ob2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLl9pc0lnbm9yZU5vZGVDaGFuZ2Uob05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTm9kZSA9IG9Ob2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uob05vZGUsIG9mZnNldCwgb05vZGUsIG9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NldEludG9GcmVlRm9ybWF0OiBmdW5jdGlvbiAob05vZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG9Ob2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGxldCBvTm9kZUNoaWxkcmVuLCBsYXN0T05vZGU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB3aGlsZSAodXRpbC5pc0Zvcm1hdEVsZW1lbnQob05vZGUpIHx8IHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQob05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBvTm9kZUNoaWxkcmVuID0gb05vZGUuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGxhc3RPTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHdoaWxlIChvTm9kZUNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdE9Ob2RlID0gb05vZGVDaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQobGFzdE9Ob2RlKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGxhc3RPTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0SW50b0ZyZWVGb3JtYXQobGFzdE9Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvTm9kZS5wYXJlbnROb2RlKSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb05vZGVDaGlsZHJlbiA9IG9Ob2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShsYXN0T05vZGUsIG9Ob2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG9Ob2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB1dGlsLnJlbW92ZUl0ZW0ob05vZGUpO1xyXG4gICAgICAgICAgICAgICAgb05vZGUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JSJyk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShvTm9kZSwgbGFzdE9Ob2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9Ob2RlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBub2RlcyBhbmQgcmVzZXQgc2VsZWN0aW9uIHJhbmdlXHJcbiAgICAgICAgICogUmV0dXJucyB7Y29udGFpbmVyOiBcInRoZSBsYXN0IGVsZW1lbnQgYWZ0ZXIgZGVsZXRpb25cIiwgb2Zmc2V0OiBcIm9mZnNldFwiLCBwcmV2Q29udGFpbmVyOiBcInByZXZpb3VzRWxlbWVudFNpYmxpbmcgT2YgdGhlIGRlbGV0ZWQgYXJlYVwifVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVtb3ZlTm9kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldFJhbmdlVG9UZXh0Tm9kZSgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXIsIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBsZXQgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmRPZmYgPSByYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMyAmJiByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5wYXJlbnROb2RlID09PSBzdGFydENvbi5wYXJlbnROb2RlKSA/IHN0YXJ0Q29uLnBhcmVudE5vZGUgOiByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgICAgIGxldCBiZWZvcmVOb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IGFmdGVyTm9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gdXRpbC5nZXRMaXN0Q2hpbGROb2Rlcyhjb21tb25Db24sIG51bGwpO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzdGFydENvbik7XHJcbiAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBlbmRDb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJiBzdGFydEluZGV4ID4gLTEgJiYgZW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXggKyAxLCBzdGFydE5vZGUgPSBzdGFydENvbjsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXSA9PT0gc3RhcnROb2RlLnBhcmVudE5vZGUgJiYgY2hpbGROb2Rlc1tpXS5maXJzdENoaWxkID09PSBzdGFydE5vZGUgJiYgc3RhcnRPZmYgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZEluZGV4IC0gMSwgZW5kTm9kZSA9IGVuZENvbjsgaSA+IHN0YXJ0SW5kZXg7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldID09PSBlbmROb2RlLnBhcmVudE5vZGUgJiYgY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLS1lbmRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGNvbW1vbkNvbikgfHwgdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSB8fCB1dGlsLmlzQnJlYWsoY29tbW9uQ29uKSB8fCB1dGlsLmlzTWVkaWEoY29tbW9uQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb21tb25Db24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1vbkNvbi5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb21tb25Db24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGVuZE9mZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzLnB1c2goY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydENvbiA9IGVuZENvbiA9IGNvbW1vbkNvbjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb24gPSBlbmRDb24gPSBjaGlsZE5vZGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzQnJlYWsoc3RhcnRDb24pIHx8IHV0aWwub25seVplcm9XaWR0aFNwYWNlKHN0YXJ0Q29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiB1dGlsLmlzTWVkaWEoY29tbW9uQ29uKSA/IGNvbW1vbkNvbiA6IHN0YXJ0Q29uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBlbmRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZSAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KGl0ZW0sIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKHV0aWwuaXNMaXN0Q2VsbChmb3JtYXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IHV0aWwuZ2V0QXJyYXlJdGVtKGZvcm1hdC5jaGlsZHJlbiwgdXRpbC5pc0xpc3QsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGxpc3QuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuaW5zZXJ0QmVmb3JlKGNoaWxkcmVuWzBdLCBsaXN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKGNoaWxkLCBudWxsLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjaGlsZE5vZGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCB8fCAoaXRlbS5ub2RlVHlwZSA9PT0gMyAmJiBpdGVtLmRhdGEgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmUoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHN0YXJ0Q29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29uLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbi5zdWJzdHJpbmdEYXRhKDAsIHN0YXJ0T2ZmKSArIGVuZENvbi5zdWJzdHJpbmdEYXRhKGVuZE9mZiwgKGVuZENvbi5sZW5ndGggLSBlbmRPZmYpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzdGFydE9mZjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29uLnN1YnN0cmluZ0RhdGEoMCwgc3RhcnRPZmYpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZU5vZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbi5kYXRhID0gYmVmb3JlTm9kZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShlbmRDb24uc3Vic3RyaW5nRGF0YShlbmRPZmYsIChlbmRDb24ubGVuZ3RoIC0gZW5kT2ZmKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyTm9kZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbi5kYXRhID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKGVuZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW1vdmUoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuZENvbiAmJiBlbmRDb24ucGFyZW50Tm9kZSA/IGVuZENvbiA6IHN0YXJ0Q29uICYmIHN0YXJ0Q29uLnBhcmVudE5vZGUgPyBzdGFydENvbiA6IChyYW5nZS5lbmRDb250YWluZXIgfHwgcmFuZ2Uuc3RhcnRDb250YWluZXIpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCF1dGlsLmlzV3lzaXd5Z0Rpdihjb250YWluZXIpICYmIGNvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmMgPSB1dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKGNvbnRhaW5lciwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudChjdXJyZW50KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjdXJyZW50LnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA9PT0gMCB8fCAvXihcXG58XFx1MjAwQikrJC8udGVzdCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh1dGlsKSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChyYykgY29udGFpbmVyID0gcmMuc2MgfHwgcmMuZWMgfHwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKGNvbnRhaW5lciwgb2Zmc2V0LCBjb250YWluZXIsIG9mZnNldCk7XHJcbiAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCxcclxuICAgICAgICAgICAgICAgIHByZXZDb250YWluZXI6IHN0YXJ0Q29uICYmIHN0YXJ0Q29uLnBhcmVudE5vZGUgPyBzdGFydENvbiA6IG51bGxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQXBwZW5kZWQgYWxsIHNlbGVjdGVkIGZvcm1hdCBFbGVtZW50IHRvIHRoZSBhcmd1bWVudCBlbGVtZW50IGFuZCBpbnNlcnRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJhbmdlRWxlbWVudCBFbGVtZW50IG9mIHdyYXAgdGhlIGFyZ3VtZW50cyAoQkxPQ0tRVU9URS4uLilcclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBseVJhbmdlRm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKHJhbmdlRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldFJhbmdlX2FkZExpbmUodGhpcy5nZXRSYW5nZSgpLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VMaW5lcyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50c0FuZENvbXBvbmVudHMoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmdlTGluZXMgfHwgcmFuZ2VMaW5lcy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGxpbmVzTG9vcDpcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlTGluZXMubGVuZ3RoLCBsaW5lLCBuZXN0ZWQsIGZFbCwgbEVsLCBmLCBsOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSByYW5nZUxpbmVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzTGlzdENlbGwobGluZSkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIG5lc3RlZCA9IGxpbmUubGFzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWQgJiYgdXRpbC5pc0xpc3RDZWxsKGxpbmUubmV4dEVsZW1lbnRTaWJsaW5nKSAmJiByYW5nZUxpbmVzLmluZGV4T2YobGluZS5uZXh0RWxlbWVudFNpYmxpbmcpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsRWwgPSBuZXN0ZWQubGFzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VMaW5lcy5pbmRleE9mKGxFbCkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGlzdCA9IGxFbC5sYXN0RWxlbWVudENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNMaXN0KGxpc3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlTGluZXMuaW5kZXhPZihsaXN0Lmxhc3RFbGVtZW50Q2hpbGQpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEVsID0gbGlzdC5sYXN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGxpbmVzTG9vcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZFbCA9IG5lc3RlZC5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHJhbmdlTGluZXMuaW5kZXhPZihmRWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gcmFuZ2VMaW5lcy5pbmRleE9mKGxFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlTGluZXMuc3BsaWNlKGYsIChsIC0gZikgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmFuZ2VMaW5lcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxhc3QgID0gcmFuZ2VMaW5lc1tyYW5nZUxpbmVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICBsZXQgc3RhbmRUYWcsIGJlZm9yZVRhZywgcEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChsYXN0KSB8fCB1dGlsLmlzRm9ybWF0RWxlbWVudChsYXN0KSkge1xyXG4gICAgICAgICAgICAgICAgc3RhbmRUYWcgPSBsYXN0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RhbmRUYWcgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChsYXN0LCBudWxsKSB8fCB1dGlsLmdldEZvcm1hdEVsZW1lbnQobGFzdCwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQ2VsbChzdGFuZFRhZykpIHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVRhZyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBwRWxlbWVudCA9IHN0YW5kVGFnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlVGFnID0gc3RhbmRUYWcubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICBwRWxlbWVudCA9IHN0YW5kVGFnLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnREZXB0aCA9IHV0aWwuZ2V0RWxlbWVudERlcHRoKHN0YW5kVGFnKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RQYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lQXJyID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZUl0ZW1zID0gZnVuY3Rpb24gKHBhcmVudCwgb3JpZ2luLCBiZWZvcmUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjYyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9PSBvcmlnaW4gJiYgIXV0aWwuaXNUYWJsZShvcmlnaW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbiAmJiB1dGlsLmdldEVsZW1lbnREZXB0aChwYXJlbnQpID09PSB1dGlsLmdldEVsZW1lbnREZXB0aChvcmlnaW4pKSByZXR1cm4gYmVmb3JlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjID0gdXRpbC5yZW1vdmVJdGVtQWxsUGFyZW50cyhvcmlnaW4sIG51bGwsIHBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNjID8gY2MuZWMgOiBiZWZvcmU7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmFuZ2VMaW5lcy5sZW5ndGgsIGxpbmUsIG9yaWdpblBhcmVudCwgZGVwdGgsIGJlZm9yZSwgbmV4dExpbmUsIG5leHRMaXN0LCBuZXN0ZWQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGluZSA9IHJhbmdlTGluZXNbaV07XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5QYXJlbnQgPSBsaW5lLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9yaWdpblBhcmVudCB8fCByYW5nZUVsZW1lbnQuY29udGFpbnMob3JpZ2luUGFyZW50KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVwdGggPSB1dGlsLmdldEVsZW1lbnREZXB0aChsaW5lKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0xpc3Qob3JpZ2luUGFyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0UGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFBhcmVudCA9IG5leHRMaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaXN0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQgPSBvcmlnaW5QYXJlbnQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZUFyci5wdXNoKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRMaW5lID0gcmFuZ2VMaW5lc1tpICsgMV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBsZW4gLSAxIHx8IChuZXh0TGluZSAmJiBuZXh0TGluZS5wYXJlbnROb2RlICE9PSBvcmlnaW5QYXJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lc3RlZCBsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZSAmJiBsaW5lLmNvbnRhaW5zKG5leHRMaW5lLnBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGlzdCA9IG5leHRMaW5lLnBhcmVudE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBvcmlnaW5QYXJlbnQucGFyZW50Tm9kZSwgcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHV0aWwuaXNMaXN0KGxpc3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gdXRpbC5jcmVhdGVFbGVtZW50KGxpc3Qubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChsaXN0UGFyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQgPSBwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMuZGV0YWNoUmFuZ2VGb3JtYXRFbGVtZW50KG9yaWdpblBhcmVudCwgbGluZUFyciwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RGVwdGggPj0gZGVwdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERlcHRoID0gZGVwdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudCA9IGVkZ2UuY2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVUYWcgPSByZW1vdmVJdGVtcyhwRWxlbWVudCwgb3JpZ2luUGFyZW50LCBlZGdlLmVjKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmVUYWcpIHBFbGVtZW50ID0gYmVmb3JlVGFnLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEVsZW1lbnQgPT09IGVkZ2UuY2MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVRhZyA9IGVkZ2UuZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudCAhPT0gZWRnZS5jYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gcmVtb3ZlSXRlbXMocEVsZW1lbnQsIGVkZ2UuY2MsIGJlZm9yZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICE9PSB1bmRlZmluZWQpIGJlZm9yZVRhZyA9IGJlZm9yZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYmVmb3JlVGFnID0gZWRnZS5jYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBlZGdlLnJlbW92ZUFycmF5Lmxlbmd0aDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFBhcmVudC5hcHBlbmRDaGlsZChlZGdlLnJlbW92ZUFycmF5W2NdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWQpIHJhbmdlRWxlbWVudC5hcHBlbmRDaGlsZChsaXN0UGFyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMaXN0KSBlZGdlLnJlbW92ZUFycmF5W2VkZ2UucmVtb3ZlQXJyYXkubGVuZ3RoIC0gMV0uYXBwZW5kQ2hpbGQobmV4dExpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0UGFyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RGVwdGggPj0gZGVwdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGVwdGggPSBkZXB0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEVsZW1lbnQgPSBvcmlnaW5QYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVRhZyA9IGxpbmUubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlRWxlbWVudC5hcHBlbmRDaGlsZChsaW5lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBFbGVtZW50ICE9PSBvcmlnaW5QYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gcmVtb3ZlSXRlbXMocEVsZW1lbnQsIG9yaWdpblBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgIT09IHVuZGVmaW5lZCkgYmVmb3JlVGFnID0gYmVmb3JlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lZmZlY3ROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgdXRpbC5tZXJnZVNhbWVUYWdzKHJhbmdlRWxlbWVudCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB1dGlsLm1lcmdlTmVzdGVkVGFncyhyYW5nZUVsZW1lbnQsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiB0aGlzLmlzTGlzdChjdXJyZW50KTsgfS5iaW5kKHV0aWwpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5lc3RlZCBsaXN0XHJcbiAgICAgICAgICAgIGlmIChiZWZvcmVUYWcgJiYgdXRpbC5nZXRFbGVtZW50RGVwdGgoYmVmb3JlVGFnKSA+IDAgJiYgKHV0aWwuaXNMaXN0KGJlZm9yZVRhZy5wYXJlbnROb2RlKSB8fCB1dGlsLmlzTGlzdChiZWZvcmVUYWcucGFyZW50Tm9kZS5wYXJlbnROb2RlKSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcHRoRm9ybWF0ID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGJlZm9yZVRhZywgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIHRoaXMuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY3VycmVudCkgJiYgIXRoaXMuaXNMaXN0KGN1cnJlbnQpOyB9LmJpbmQodXRpbCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRSYW5nZSA9IHV0aWwuc3BsaXRFbGVtZW50KGJlZm9yZVRhZywgbnVsbCwgIWRlcHRoRm9ybWF0ID8gMCA6IHV0aWwuZ2V0RWxlbWVudERlcHRoKGRlcHRoRm9ybWF0KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXRSYW5nZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYW5nZUVsZW1lbnQsIHNwbGl0UmFuZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBiYXNpY1xyXG4gICAgICAgICAgICAgICAgcEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJhbmdlRWxlbWVudCwgYmVmb3JlVGFnKTtcclxuICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW1zKHJhbmdlRWxlbWVudCwgYmVmb3JlVGFnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZWRnZSA9IHV0aWwuZ2V0RWRnZUNoaWxkTm9kZXMocmFuZ2VFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCByYW5nZUVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCk7XHJcbiAgICAgICAgICAgIGlmIChyYW5nZUxpbmVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoZWRnZS5zYywgMCwgZWRnZS5lYywgZWRnZS5lYy50ZXh0Q29udGVudC5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShlZGdlLmVjLCBlZGdlLmVjLnRleHRDb250ZW50Lmxlbmd0aCwgZWRnZS5lYywgZWRnZS5lYy50ZXh0Q29udGVudC5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIGVsZW1lbnRzIG9mIHRoZSBcInNlbGVjdGVkRm9ybWF0c1wiIGFycmF5IGFyZSBkZXRhY2hlZCBmcm9tIHRoZSBcInJhbmdlRWxlbWVudFwiIGVsZW1lbnQuIChcIkxJXCIgdGFncyBhcmUgY29udmVydGVkIHRvIFwiUFwiIHRhZ3MpXHJcbiAgICAgICAgICogV2hlbiBcInNlbGVjdGVkRm9ybWF0c1wiIGlzIG51bGwsIGFsbCBlbGVtZW50cyBhcmUgZGV0YWNoZWQgYW5kIHJldHVybiB7Y2M6IHBhcmVudE5vZGUsIHNjOiBuZXh0U2libGluZywgZWM6IHByZXZpb3VzU2libGluZywgcmVtb3ZlQXJyYXk6IFtBcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzXX0uXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSByYW5nZUVsZW1lbnQgUmFuZ2UgZm9ybWF0IGVsZW1lbnQgKFBSRSwgQkxPQ0tRVU9URSwgT0wsIFVMLi4uKVxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gc2VsZWN0ZWRGb3JtYXRzIEFycmF5IG9mIGZvcm1hdCBlbGVtZW50cyAoUCwgRElWLCBMSS4uLikgdG8gcmVtb3ZlLlxyXG4gICAgICAgICAqIElmIG51bGwsIEFwcGxpZXMgdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm4ge2NjOiBwYXJlbnROb2RlLCBzYzogbmV4dFNpYmxpbmcsIGVjOiBwcmV2aW91c1NpYmxpbmd9XHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fG51bGx9IG5ld1JhbmdlRWxlbWVudCBUaGUgbm9kZShyYW5nZUVsZW1lbnQpIHRvIHJlcGxhY2UgdGhlIGN1cnJlbnRseSB3cmFwcGVkIG5vZGUuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSByZW1vdmUgSWYgdHJ1ZSwgZGVsZXRlZCB3aXRob3V0IGRldGFjaGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbm90SGlzdG9yeVB1c2ggV2hlbiB0cnVlLCBpdCBkb2VzIG5vdCB1cGRhdGUgdGhlIGhpc3Rvcnkgc3RhY2sgYW5kIHRoZSBzZWxlY3Rpb24gb2JqZWN0IGFuZCByZXR1cm4gRWRnZU5vZGVzICh1dGlsLmdldEVkZ2VDaGlsZE5vZGVzKVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGV0YWNoUmFuZ2VGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAocmFuZ2VFbGVtZW50LCBzZWxlY3RlZEZvcm1hdHMsIG5ld1JhbmdlRWxlbWVudCwgcmVtb3ZlLCBub3RIaXN0b3J5UHVzaCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3Qgc28gPSByYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgZW8gPSByYW5nZS5lbmRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSB1dGlsLmdldExpc3RDaGlsZE5vZGVzKHJhbmdlRWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIGN1cnJlbnQucGFyZW50Tm9kZSA9PT0gcmFuZ2VFbGVtZW50OyB9KTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHJhbmdlRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBsZXQgZmlyc3ROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IGxhc3ROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHJhbmdlRWwgPSByYW5nZUVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZUFycmF5ID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0xpc3QgPSB1dGlsLmlzTGlzdChuZXdSYW5nZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICBsZXQgaW5zZXJ0ZWROZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHJlc2V0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBtb3ZlQ29tcGxldGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZE5vZGUgKHBhcmVudCwgaW5zTm9kZSwgc2libGluZywgb3JpZ2luTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwub25seVplcm9XaWR0aFNwYWNlKGluc05vZGUpKSBpbnNOb2RlLmlubmVySFRNTCA9IHV0aWwuemVyb1dpZHRoU3BhY2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGluc05vZGUubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGluc05vZGUsIHNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnNOb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnNDaGlsZHJlbiA9IChtb3ZlQ29tcGxldGUgPyBpbnNOb2RlIDogb3JpZ2luTm9kZSkuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGxldCBmb3JtYXQgPSBpbnNOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpbnNDaGlsZHJlblswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGMgPSBpbnNDaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5fbm90VGV4dE5vZGUoYykgJiYgIXV0aWwuaXNCcmVhayhjKSAmJiAhdXRpbC5pc0xpc3RDZWxsKGZvcm1hdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIGZpcnN0ID0gZm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShmb3JtYXQsIHNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gaW5zTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoYywgc2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIGZpcnN0ID0gYztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNMaXN0Q2VsbChwYXJlbnQpICYmIHV0aWwuaXNMaXN0Q2VsbChmb3JtYXQpICYmIHV0aWwuaXNMaXN0KHNpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShzaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmFwcGVuZENoaWxkKHNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZvcm1hdCwgcGFyZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5OZXh0ID0gb3JpZ2luTm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhY2hSYW5nZSA9IHV0aWwuZGV0YWNoTmVzdGVkTGlzdChvcmlnaW5Ob2RlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJhbmdlRWxlbWVudCAhPT0gZGV0YWNoUmFuZ2UpIHx8IChvcmlnaW5OZXh0ICE9PSBvcmlnaW5Ob2RlLm5leHRFbGVtZW50U2libGluZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmQ2hpbGRyZW4gPSBmb3JtYXQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZkNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbk5vZGUuYXBwZW5kQ2hpbGQoZkNoaWxkcmVuWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWxlbWVudCA9IGRldGFjaFJhbmdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZm9ybWF0LCBzaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIGZpcnN0ID0gZm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZGV0YWNoIGxvb3BcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aCwgaW5zTm9kZSwgbGluZUluZGV4LCBuZXh0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGluc05vZGUgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnNOb2RlLm5vZGVUeXBlID09PSAzICYmIHV0aWwuaXNMaXN0KHJhbmdlRWwpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbW92ZUNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlICYmIGkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkRm9ybWF0cyB8fCBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID09PSBsZW4gfHwgc2VsZWN0ZWRGb3JtYXRzWzBdID09PSBpbnNOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9kZSA9IHJhbmdlRWxlbWVudC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb2RlID0gcmFuZ2VFbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0cykgbGluZUluZGV4ID0gc2VsZWN0ZWRGb3JtYXRzLmluZGV4T2YoaW5zTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRGb3JtYXRzICYmIGxpbmVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlRWwpIHJhbmdlRWwgPSByYW5nZUVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZUVsLmFwcGVuZENoaWxkKGluc05vZGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRGb3JtYXRzKSBuZXh0ID0gc2VsZWN0ZWRGb3JtYXRzW2xpbmVJbmRleCArIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUVsICYmIHJhbmdlRWwuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHJhbmdlRWwsIHJhbmdlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdMaXN0ICYmIHV0aWwuaXNMaXN0Q2VsbChpbnNOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiB1dGlsLmdldEVsZW1lbnREZXB0aChpbnNOb2RlKSAhPT0gdXRpbC5nZXRFbGVtZW50RGVwdGgobmV4dCkgJiYgKHV0aWwuaXNMaXN0Q2VsbChwYXJlbnQpIHx8IHV0aWwuZ2V0QXJyYXlJdGVtKGluc05vZGUuY2hpbGRyZW4sIHV0aWwuaXNMaXN0LCBmYWxzZSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnNOZXh0ID0gaW5zTm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhY2hSYW5nZSA9IHV0aWwuZGV0YWNoTmVzdGVkTGlzdChpbnNOb2RlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJhbmdlRWxlbWVudCAhPT0gZGV0YWNoUmFuZ2UpIHx8IGluc05leHQgIT09IGluc05vZGUubmV4dEVsZW1lbnRTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VFbGVtZW50ID0gZGV0YWNoUmFuZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSBpbnNOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zTm9kZSA9IHV0aWwuY3JlYXRlRWxlbWVudChyZW1vdmUgPyBpbm5lci5ub2RlTmFtZSA6ICh1dGlsLmlzTGlzdChyYW5nZUVsZW1lbnQucGFyZW50Tm9kZSkgfHwgdXRpbC5pc0xpc3RDZWxsKHJhbmdlRWxlbWVudC5wYXJlbnROb2RlKSkgPyAnTEknIDogdXRpbC5pc0NlbGwocmFuZ2VFbGVtZW50LnBhcmVudE5vZGUpID8gJ0RJVicgOiBvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDZWxsID0gdXRpbC5pc0xpc3RDZWxsKGluc05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDaGlsZHJlbiA9IGlubmVyLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5uZXJDaGlsZHJlblswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdChpbm5lckNoaWxkcmVuWzBdKSAmJiAhaXNDZWxsKSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNOb2RlLmFwcGVuZENoaWxkKGlubmVyQ2hpbGRyZW5bMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb3B5Rm9ybWF0QXR0cmlidXRlcyhpbnNOb2RlLCBpbm5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zTm9kZSA9IGluc05vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZW1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdSYW5nZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc2VydGVkTmV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3UmFuZ2VFbGVtZW50LCByYW5nZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZE5ldyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc05vZGUgPSBhcHBlbmROb2RlKG5ld1JhbmdlRWxlbWVudCwgaW5zTm9kZSwgbnVsbCwgY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNOb2RlID0gYXBwZW5kTm9kZShwYXJlbnQsIGluc05vZGUsIHJhbmdlRWxlbWVudCwgY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IGluc05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vZGUgPSBpbnNOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlyc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9kZSA9IGxhc3ROb2RlID0gaW5zTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVBcnJheS5wdXNoKGluc05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldCA9IG1vdmVDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB1dGlsLmdldExpc3RDaGlsZE5vZGVzKHJhbmdlRWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIGN1cnJlbnQucGFyZW50Tm9kZSA9PT0gcmFuZ2VFbGVtZW50OyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWwgPSByYW5nZUVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHJhbmdlRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlUGFyZW50ID0gcmFuZ2VFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGxldCByYW5nZVJpZ2h0ID0gcmFuZ2VFbGVtZW50Lm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICBpZiAocmFuZ2VFbCAmJiByYW5nZUVsLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlUGFyZW50Lmluc2VydEJlZm9yZShyYW5nZUVsLCByYW5nZVJpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKG5ld1JhbmdlRWxlbWVudCkgZmlyc3ROb2RlID0gbmV3UmFuZ2VFbGVtZW50LnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0Tm9kZSkgZmlyc3ROb2RlID0gcmFuZ2VFbGVtZW50LnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgcmFuZ2VSaWdodCA9IHJhbmdlRWxlbWVudC5uZXh0U2libGluZztcclxuXHJcbiAgICAgICAgICAgIGlmIChyYW5nZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IHJhbmdlRWxlbWVudC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShyYW5nZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVFbXB0eU5vZGUocmFuZ2VFbGVtZW50LCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGVkZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICBlZGdlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNjOiByYW5nZVBhcmVudCxcclxuICAgICAgICAgICAgICAgICAgICBzYzogZmlyc3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVjOiByYW5nZVJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFycmF5OiByZW1vdmVBcnJheVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghZmlyc3ROb2RlKSBmaXJzdE5vZGUgPSBsYXN0Tm9kZTtcclxuICAgICAgICAgICAgICAgIGlmICghbGFzdE5vZGUpIGxhc3ROb2RlID0gZmlyc3ROb2RlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRFZGdlID0gdXRpbC5nZXRFZGdlQ2hpbGROb2RlcyhmaXJzdE5vZGUsIChsYXN0Tm9kZS5wYXJlbnROb2RlID8gZmlyc3ROb2RlIDogbGFzdE5vZGUpKTtcclxuICAgICAgICAgICAgICAgIGVkZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2M6IChjaGlsZEVkZ2Uuc2MgfHwgY2hpbGRFZGdlLmVjKS5wYXJlbnROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjOiBjaGlsZEVkZ2Uuc2MsXHJcbiAgICAgICAgICAgICAgICAgICAgZWM6IGNoaWxkRWRnZS5lY1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lZmZlY3ROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKG5vdEhpc3RvcnlQdXNoKSByZXR1cm4gZWRnZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghcmVtb3ZlICYmIGVkZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRGb3JtYXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShlZGdlLnNjLCAwLCBlZGdlLnNjLCAwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShlZGdlLnNjLCBzbywgZWRnZS5lYywgZW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gXCJzZWxlY3RlZEZvcm1hdHNcIiBhcnJheSBhcmUgZGV0YWNoZWQgZnJvbSB0aGUgbGlzdCBlbGVtZW50LlxyXG4gICAgICAgICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYXBwbGllZCB3aGVuIHRoZSBmaXJzdCBhbmQgbGFzdCBsaW5lcyBvZiBcInNlbGVjdGVkRm9ybWF0c1wiIGFyZSBcIkxJXCIgcmVzcGVjdGl2ZWx5LlxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkRm9ybWF0cyBBcnJheSBvZiBmb3JtYXQgZWxlbWVudHMgKExJLCBQLi4uKSB0byByZW1vdmUuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSByZW1vdmUgSWYgdHJ1ZSwgZGVsZXRlZCB3aXRob3V0IGRldGFjaGVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHtzYzogPExJPiwgZWM6IDxMST59LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRldGFjaExpc3Q6IGZ1bmN0aW9uIChzZWxlY3RlZEZvcm1hdHMsIHJlbW92ZSkge1xyXG4gICAgICAgICAgICBsZXQgcmFuZ2VBcnIgPSB7fTtcclxuICAgICAgICAgICAgbGV0IGxpc3RGaXJzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgbGlzdExhc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGZpcnN0ID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IGxhc3QgPSBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBwYXNzQ29tcG9uZW50ID0gZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuICF0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpOyB9LmJpbmQodXRpbCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VsZWN0ZWRGb3JtYXRzLmxlbmd0aCwgciwgbywgbGFzdEluZGV4LCBpc0xpc3Q7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gaSA9PT0gbGVuIC0gMTtcclxuICAgICAgICAgICAgICAgIG8gPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sIHBhc3NDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgaXNMaXN0ID0gdXRpbC5pc0xpc3Qobyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIgJiYgaXNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgciA9IG87XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIgPSB7cjogciwgZjogW3V0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpXX07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIGxpc3RGaXJzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIgJiYgaXNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09IG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMuZGV0YWNoUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlQXJyLmZbMF0ucGFyZW50Tm9kZSwgcmFuZ2VBcnIuZiwgbnVsbCwgcmVtb3ZlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHNlbGVjdGVkRm9ybWF0c1tpXS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGVkZ2Uuc2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Rmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4KSBsYXN0ID0gZWRnZS5lYztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIgPSB7cjogciwgZjogW3V0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpXX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4KSBsaXN0TGFzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQXJyLmYucHVzaCh1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzW2ldLCAnTEknKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXgpIGxpc3RMYXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCAmJiB1dGlsLmlzTGlzdChyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUFyci5mWzBdLnBhcmVudE5vZGUsIHJhbmdlQXJyLmYsIG51bGwsIHJlbW92ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RMYXN0IHx8IGxlbiA9PT0gMSkgbGFzdCA9IGVkZ2UuZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RGaXJzdCkgZmlyc3QgPSBlZGdlLnNjIHx8IGxhc3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzYzogZmlyc3QsXHJcbiAgICAgICAgICAgICAgICBlYzogbGFzdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSBub2RlcyBmcm9tIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogMS4gSWYgdGhlcmUgaXMgYSBub2RlIGluIHRoZSBcImFwcGVuZE5vZGVcIiBhcmd1bWVudCwgYSBub2RlIHdpdGggdGhlIHNhbWUgdGFncyBhbmQgYXR0cmlidXRlcyBhcyBcImFwcGVuZE5vZGVcIiBpcyBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHRleHQuXHJcbiAgICAgICAgICogMi4gSWYgaXQgaXMgaW4gdGhlIHNhbWUgdGFnLCBvbmx5IHRoZSB0YWcncyBhdHRyaWJ1dGVzIGFyZSBjaGFuZ2VkIHdpdGhvdXQgYWRkaW5nIGEgdGFnLlxyXG4gICAgICAgICAqIDMuIElmIHRoZSBcImFwcGVuZE5vZGVcIiBhcmd1bWVudCBpcyBudWxsLCB0aGUgbm9kZSBvZiB0aGUgc2VsZWN0aW9uIGlzIHVwZGF0ZSBvciByZW1vdmUgd2l0aG91dCBhZGRpbmcgYSBuZXcgbm9kZS5cclxuICAgICAgICAgKiA0LiBUaGUgc2FtZSBzdHlsZSBhcyB0aGUgc3R5bGUgYXR0cmlidXRlIG9mIHRoZSBcInN0eWxlQXJyYXlcIiBhcmd1bWVudCBpcyBkZWxldGVkLlxyXG4gICAgICAgICAqICAgIChTdHlsZXMgc2hvdWxkIGJlIHB1dCB3aXRoIGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGNzcy4gW1wiYmFja2dyb3VuZC1jb2xvclwiXSlcclxuICAgICAgICAgKiA1LiBUaGUgc2FtZSBjbGFzcyBuYW1lIGFzIHRoZSBjbGFzcyBhdHRyaWJ1dGUgb2YgdGhlIFwic3R5bGVBcnJheVwiIGFyZ3VtZW50IGlzIGRlbGV0ZWQuXHJcbiAgICAgICAgICogICAgKFRoZSBjbGFzcyBuYW1lIGlzIHByZWNlZGVkIGJ5IFwiLlwiIFtcIi5jbGFzc05hbWVcIl0pXHJcbiAgICAgICAgICogNi4gVXNlIGEgbGlzdCBvZiBzdHlsZXMgYW5kIGNsYXNzZXMgb2YgXCJhcHBlbmROb2RlXCIgaW4gXCJzdHlsZUFycmF5XCIgdG8gYXZvaWQgZHVwbGljYXRlIHByb3BlcnR5IHZhbHVlcy5cclxuICAgICAgICAgKiA3LiBJZiBhIG5vZGUgd2l0aCBhbGwgc3R5bGVzIGFuZCBjbGFzc2VzIHJlbW92ZWQgaGFzIHRoZSBzYW1lIHRhZyBuYW1lIGFzIFwiYXBwZW5kTm9kZVwiIG9yIFwicmVtb3ZlTm9kZUFycmF5XCIsIG9yIFwiYXBwZW5kTm9kZVwiIGlzIG51bGwsIHRoYXQgbm9kZSBpcyBkZWxldGVkLlxyXG4gICAgICAgICAqIDguIFJlZ2FyZGxlc3Mgb2YgdGhlIHN0eWxlIGFuZCBjbGFzcyBvZiB0aGUgbm9kZSwgdGhlIHRhZyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIFwicmVtb3ZlTm9kZUFycmF5XCIgYXJndW1lbnQgdmFsdWUgaXMgZGVsZXRlZC5cclxuICAgICAgICAgKiA5LiBJZiB0aGUgXCJzdHJpY3RSZW1vdmVcIiBhcmd1bWVudCBpcyB0cnVlLCBvbmx5IG5vZGVzIHdpdGggYWxsIHN0eWxlcyBhbmQgY2xhc3NlcyByZW1vdmVkIGZyb20gdGhlIG5vZGVzIG9mIFwicmVtb3ZlTm9kZUFycmF5XCIgYXJlIHJlbW92ZWQuXHJcbiAgICAgICAgICoxMC4gSXQgd29uJ3Qgd29yayBpZiB0aGUgcGFyZW50IG5vZGUgaGFzIHRoZSBzYW1lIGNsYXNzIGFuZCBzYW1lIHZhbHVlIHN0eWxlLlxyXG4gICAgICAgICAqICAgIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIGEgdmFsdWUgaW4gXCJyZW1vdmVOb2RlQXJyYXlcIiwgaXQgd29ya3MgYW5kIHRoZSB0ZXh0IG5vZGUgaXMgc2VwYXJhdGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbm9kZSB0byByZXBsYWNlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBhcHBlbmROb2RlIFRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uIElmIGl0IGlzIG51bGwsIG9ubHkgZGVsZXRlIHRoZSBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gc3R5bGVBcnJheSBUaGUgc3R5bGUgb3IgY2xhc3NOYW1lIGF0dHJpYnV0ZSBuYW1lIEFycmF5IHRvIGNoZWNrIChbJ2ZvbnQtc2l6ZSddLCBbJy5jbGFzc05hbWUnXSwgWydmb250LWZhbWlseScsICdjb2xvcicsICcuY2xhc3NOYW1lJ10uLi5dKVxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gcmVtb3ZlTm9kZUFycmF5IEFuIGFycmF5IG9mIG5vZGUgbmFtZXMgdG8gcmVtb3ZlIHR5cGVzIGZyb20sIHJlbW92ZSBhbGwgZm9ybWF0cyB3aGVuIFwiYXBwZW5kTm9kZVwiIGlzIG51bGwgYW5kIHRoZXJlIGlzIGFuIGVtcHR5IGFycmF5IG9yIG51bGwgdmFsdWUuIChbJ3NwYW4nXSwgWydzdHJvbmcnLCAnZW0nXSAuLi5dKVxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbnxudWxsfSBzdHJpY3RSZW1vdmUgSWYgdHJ1ZSwgb25seSBub2RlcyB3aXRoIGFsbCBzdHlsZXMgYW5kIGNsYXNzZXMgcmVtb3ZlZCBmcm9tIHRoZSBub2RlcyBvZiBcInJlbW92ZU5vZGVBcnJheVwiIGFyZSByZW1vdmVkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vZGVDaGFuZ2U6IGZ1bmN0aW9uIChhcHBlbmROb2RlLCBzdHlsZUFycmF5LCByZW1vdmVOb2RlQXJyYXksIHN0cmljdFJlbW92ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldFJhbmdlVG9UZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlX2FkZExpbmUodGhpcy5nZXRSYW5nZSgpLCBudWxsKTtcclxuICAgICAgICAgICAgc3R5bGVBcnJheSA9IHN0eWxlQXJyYXkgJiYgc3R5bGVBcnJheS5sZW5ndGggPiAwID8gc3R5bGVBcnJheSA6IGZhbHNlO1xyXG4gICAgICAgICAgICByZW1vdmVOb2RlQXJyYXkgPSByZW1vdmVOb2RlQXJyYXkgJiYgcmVtb3ZlTm9kZUFycmF5Lmxlbmd0aCA+IDAgPyByZW1vdmVOb2RlQXJyYXkgOiBmYWxzZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3ZlTm9kZSA9ICFhcHBlbmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBpc1JlbW92ZUZvcm1hdCA9IGlzUmVtb3ZlTm9kZSAmJiAhcmVtb3ZlTm9kZUFycmF5ICYmICFzdHlsZUFycmF5O1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0T2ZmID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxldCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGxldCBlbmRPZmYgPSByYW5nZS5lbmRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGlzUmVtb3ZlRm9ybWF0ICYmIHJhbmdlLmNvbGxhcHNlZCAmJiB1dGlsLmlzRm9ybWF0RWxlbWVudChzdGFydENvbi5wYXJlbnROb2RlKSAmJiB1dGlsLmlzRm9ybWF0RWxlbWVudChlbmRDb24ucGFyZW50Tm9kZSkpIHx8IChzdGFydENvbiA9PT0gZW5kQ29uICYmIHN0YXJ0Q29uLm5vZGVUeXBlID09PSAxICYmIHV0aWwuaXNOb25FZGl0YWJsZShzdGFydENvbikpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQgJiYgIWlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRDb24ubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhzdGFydENvbikgJiYgIXV0aWwuaXNDb21wb25lbnQoc3RhcnRDb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNOb2RlID0gc3RhcnRDb24uY2hpbGROb2Rlc1tzdGFydE9mZl07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c05vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2N1c05vZGUubmV4dFNpYmxpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmlzQnJlYWsoZm9jdXNOb2RlKSA/IGZvY3VzTm9kZSA6IGZvY3VzTm9kZS5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgemVyb1dpZHRoID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydENvbi5pbnNlcnRCZWZvcmUoemVyb1dpZHRoLCBhZnRlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoemVyb1dpZHRoLCAxLCB6ZXJvV2lkdGgsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZmID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNGb3JtYXRFbGVtZW50KHN0YXJ0Q29uKSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb24gPSBzdGFydENvbi5jaGlsZE5vZGVzW3N0YXJ0T2ZmXSB8fCBzdGFydENvbi5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmYgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChlbmRDb24pKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRDb24gPSBlbmRDb24uY2hpbGROb2Rlc1tlbmRPZmZdIHx8IGVuZENvbi5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICBlbmRPZmYgPSBlbmRDb24udGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgd1JlZ0V4cCA9IF93LlJlZ0V4cDtcclxuICAgICAgICAgICAgY29uc3QgbmV3Tm9kZU5hbWUgPSBhcHBlbmROb2RlLm5vZGVOYW1lO1xyXG5cclxuICAgICAgICAgICAgLyogY2hlY2tlZCBzYW1lIHN0eWxlIHByb3BlcnR5ICovXHJcbiAgICAgICAgICAgIGlmICghaXNSZW1vdmVGb3JtYXQgJiYgc3RhcnRDb24gPT09IGVuZENvbiAmJiAhcmVtb3ZlTm9kZUFycmF5ICYmIGFwcGVuZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzTm9kZSA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrQ250ID0gMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQXR0cnMgPSBbXTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tTdHlsZXMgPSBhcHBlbmROb2RlLnN0eWxlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoZWNrU3R5bGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tBdHRycy5wdXNoKGNoZWNrU3R5bGVzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBja2Vja0NsYXNzZXMgPSBhcHBlbmROb2RlLmNsYXNzTGlzdDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBja2Vja0NsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0F0dHJzLnB1c2goJy4nICsgY2tlY2tDbGFzc2VzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tBdHRycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUoIXV0aWwuaXNGb3JtYXRFbGVtZW50KHNOb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYoc05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tBdHRycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGNoZWNrQXR0cnNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NSZWcgPSAvXlxcLi8udGVzdChzKSA/IG5ldyB3UmVnRXhwKCdcXFxccyonICsgcy5yZXBsYWNlKC9eXFwuLywgJycpICsgJyhcXFxccyt8JCknLCAnaWcnKSA6IGZhbHNlO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVDaGVjayA9IGlzUmVtb3ZlTm9kZSA/ICEhc05vZGUuc3R5bGVbc10gOiAoISFzTm9kZS5zdHlsZVtzXSAmJiAhIWFwcGVuZE5vZGUuc3R5bGVbc10gJiYgc05vZGUuc3R5bGVbc10gPT09IGFwcGVuZE5vZGUuc3R5bGVbc10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzQ2hlY2sgPSBjbGFzc1JlZyA9PT0gZmFsc2UgPyBmYWxzZSA6IGlzUmVtb3ZlTm9kZSA/ICEhc05vZGUuY2xhc3NOYW1lLm1hdGNoKGNsYXNzUmVnKSA6ICEhc05vZGUuY2xhc3NOYW1lLm1hdGNoKGNsYXNzUmVnKSAmJiAhIWFwcGVuZE5vZGUuY2xhc3NOYW1lLm1hdGNoKGNsYXNzUmVnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDaGVjayB8fCBjbGFzc0NoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ250Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNOb2RlID0gc05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDbnQgPj0gY2hlY2tBdHRycy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0ge30sIGVuZCA9IHt9O1xyXG4gICAgICAgICAgICBsZXQgbmV3Tm9kZSwgc3R5bGVSZWdFeHAgPSAnJywgY2xhc3NSZWdFeHAgPSAnJywgcmVtb3ZlTm9kZVJlZ0V4cCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUFycmF5Lmxlbmd0aCwgczsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcyA9IHN0eWxlQXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KHMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzUmVnRXhwICs9IChjbGFzc1JlZ0V4cCA/ICd8JyA6ICdcXFxccyooPzonKSArIHMucmVwbGFjZSgvXlxcLi8sICcnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVJlZ0V4cCArPSAoc3R5bGVSZWdFeHAgPyAnfCcgOiAnKD86O3xefFxcXFxzKSg/OicpICsgcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlUmVnRXhwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVSZWdFeHAgKz0gJylcXFxccyo6W147XSpcXFxccyooPzo7fCQpJztcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZVJlZ0V4cCA9IG5ldyB3UmVnRXhwKHN0eWxlUmVnRXhwLCAnaWcnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NSZWdFeHApIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc1JlZ0V4cCArPSAnKSg/PVxcXFxzK3wkKSc7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NSZWdFeHAgPSBuZXcgd1JlZ0V4cChjbGFzc1JlZ0V4cCwgJ2lnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZW1vdmVOb2RlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZU5vZGVSZWdFeHAgPSAnXig/OicgKyByZW1vdmVOb2RlQXJyYXlbMF07XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlbW92ZU5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGVSZWdFeHAgKz0gJ3wnICsgcmVtb3ZlTm9kZUFycmF5W2ldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVtb3ZlTm9kZVJlZ0V4cCArPSAnKSQnO1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlTm9kZVJlZ0V4cCA9IG5ldyB3UmVnRXhwKHJlbW92ZU5vZGVSZWdFeHAsICdpJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiB2YWxpZGF0aW9uIGNoZWNrIGZ1bmN0aW9uKi9cclxuICAgICAgICAgICAgY29uc3Qgd0Jvb2xlYW4gPSBfdy5Cb29sZWFuO1xyXG4gICAgICAgICAgICBjb25zdCBfcmVtb3ZlQ2hlY2sgPSB7djogZmFsc2V9O1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gZnVuY3Rpb24gKGNoZWNrTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdk5vZGUgPSBjaGVja05vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhbGwgcGF0aFxyXG4gICAgICAgICAgICAgICAgaWYgKHZOb2RlLm5vZGVUeXBlID09PSAzIHx8IHV0aWwuaXNCcmVhayh2Tm9kZSkpIHJldHVybiB2Tm9kZTtcclxuICAgICAgICAgICAgICAgIC8vIGFsbCByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG5vZGUgY2hlY2tcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1JlbW92ZSA9ICghcmVtb3ZlTm9kZVJlZ0V4cCAmJiBpc1JlbW92ZU5vZGUpIHx8IChyZW1vdmVOb2RlUmVnRXhwICYmIHJlbW92ZU5vZGVSZWdFeHAudGVzdCh2Tm9kZS5ub2RlTmFtZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHRhZyByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmICh0YWdSZW1vdmUgJiYgIXN0cmljdFJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF9yZW1vdmVDaGVjay52ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdHlsZSByZWdleHBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpblN0eWxlID0gdk5vZGUuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlUmVnRXhwICYmIG9yaWdpblN0eWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IG9yaWdpblN0eWxlLnJlcGxhY2Uoc3R5bGVSZWdFeHAsICcnKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9PSBvcmlnaW5TdHlsZSkgX3JlbW92ZUNoZWNrLnYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNsYXNzIGNoZWNrXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5DbGFzc2VzID0gdk5vZGUuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzZXMgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmIChjbGFzc1JlZ0V4cCAmJiBvcmlnaW5DbGFzc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzID0gb3JpZ2luQ2xhc3Nlcy5yZXBsYWNlKGNsYXNzUmVnRXhwLCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzICE9PSBvcmlnaW5DbGFzc2VzKSBfcmVtb3ZlQ2hlY2sudiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9ubHlcclxuICAgICAgICAgICAgICAgIGlmIChpc1JlbW92ZU5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGNsYXNzUmVnRXhwIHx8ICFvcmlnaW5DbGFzc2VzKSAmJiAoc3R5bGVSZWdFeHAgfHwgIW9yaWdpblN0eWxlKSAmJiAhc3R5bGUgJiYgIWNsYXNzZXMgJiYgdGFnUmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZW1vdmVDaGVjay52ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlIHx8IGNsYXNzZXMgfHwgdk5vZGUubm9kZU5hbWUgIT09IG5ld05vZGVOYW1lIHx8ICh3Qm9vbGVhbihzdHlsZVJlZ0V4cCkgIT09IHdCb29sZWFuKG9yaWdpblN0eWxlKSkgfHwgKHdCb29sZWFuKGNsYXNzUmVnRXhwKSAhPT0gd0Jvb2xlYW4ob3JpZ2luQ2xhc3NlcykpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUmVnRXhwICYmIG9yaWdpblN0eWxlLmxlbmd0aCA+IDApIHZOb2RlLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZOb2RlLnN0eWxlLmNzc1RleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdk5vZGUucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzUmVnRXhwICYmIG9yaWdpbkNsYXNzZXMubGVuZ3RoID4gMCkgdk5vZGUuY2xhc3NOYW1lID0gY2xhc3Nlcy50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2Tm9kZS5jbGFzc05hbWUudHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZOb2RlLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdk5vZGUuc3R5bGUuY3NzVGV4dCAmJiAhdk5vZGUuY2xhc3NOYW1lICYmICh2Tm9kZS5ub2RlTmFtZSA9PT0gbmV3Tm9kZU5hbWUgfHwgdGFnUmVtb3ZlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVtb3ZlQ2hlY2sudiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZOb2RlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIF9yZW1vdmVDaGVjay52ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IGxpbmUgbm9kZXNcclxuICAgICAgICAgICAgY29uc3QgbGluZU5vZGVzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzKG51bGwpO1xyXG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgc3RhcnRPZmYgPSByYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBlbmRPZmYgPSByYW5nZS5lbmRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuZ2V0Rm9ybWF0RWxlbWVudChzdGFydENvbiwgbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Q29uID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQobGluZU5vZGVzWzBdLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5ub2RlVHlwZSA9PT0gMzsgfSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmYgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuZ2V0Rm9ybWF0RWxlbWVudChlbmRDb24sIG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRDb24gPSB1dGlsLmdldENoaWxkRWxlbWVudChsaW5lTm9kZXNbbGluZU5vZGVzLmxlbmd0aCAtIDFdLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5ub2RlVHlwZSA9PT0gMzsgfSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgZW5kT2ZmID0gZW5kQ29uLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IG9uZUxpbmUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoc3RhcnRDb24sIG51bGwpID09PSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoZW5kQ29uLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc3QgZW5kTGVuZ3RoID0gbGluZU5vZGVzLmxlbmd0aCAtIChvbmVMaW5lID8gMCA6IDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gbm9kZSBDaGFuZ2VzXHJcbiAgICAgICAgICAgIG5ld05vZGUgPSBhcHBlbmROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc1JlbW92ZUFuY2hvciA9IGlzUmVtb3ZlRm9ybWF0IHx8IChpc1JlbW92ZU5vZGUgJiYgKGZ1bmN0aW9uIChhcnIpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBuIDwgbGVuOyBuKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5faXNNYWludGFpbmVkTm9kZShhcnJbbl0pIHx8IHV0aWwuX2lzU2l6ZU5vZGUoYXJyW25dKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pKHJlbW92ZU5vZGVBcnJheSkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaXNTaXplTm9kZSA9IHV0aWwuX2lzU2l6ZU5vZGUobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IF9nZXRNYWludGFpbmVkTm9kZSA9IHRoaXMuX3V0aWxfZ2V0TWFpbnRhaW5lZE5vZGUuYmluZCh1dGlsLCBpc1JlbW92ZUFuY2hvciwgaXNTaXplTm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IF9pc01haW50YWluZWROb2RlID0gdGhpcy5fdXRpbF9pc01haW50YWluZWROb2RlLmJpbmQodXRpbCwgaXNSZW1vdmVBbmNob3IsIGlzU2l6ZU5vZGUpO1xyXG5cclxuICAgICAgICAgICAgLy8gb25lIGxpbmVcclxuICAgICAgICAgICAgaWYgKG9uZUxpbmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5fbm9kZUNoYW5nZV9vbmVMaW5lKGxpbmVOb2Rlc1swXSwgbmV3Tm9kZSwgdmFsaWRhdGlvbiwgc3RhcnRDb24sIHN0YXJ0T2ZmLCBlbmRDb24sIGVuZE9mZiwgaXNSZW1vdmVGb3JtYXQsIGlzUmVtb3ZlTm9kZSwgcmFuZ2UuY29sbGFwc2VkLCBfcmVtb3ZlQ2hlY2ssIF9nZXRNYWludGFpbmVkTm9kZSwgX2lzTWFpbnRhaW5lZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQuY29udGFpbmVyID0gbmV3UmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBzdGFydC5vZmZzZXQgPSBuZXdSYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVuZC5jb250YWluZXIgPSBuZXdSYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBlbmQub2Zmc2V0ID0gbmV3UmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0LmNvbnRhaW5lciA9PT0gZW5kLmNvbnRhaW5lciAmJiB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShzdGFydC5jb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQub2Zmc2V0ID0gZW5kLm9mZnNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb21tb25MaXN0U3R5bGUobmV3UmFuZ2UuYW5jZXN0b3IsIG51bGwpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBtdWx0aSBsaW5lIFxyXG4gICAgICAgICAgICAgICAgLy8gZW5kXHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBhcHBlbmROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5fbm9kZUNoYW5nZV9lbmRMaW5lKGxpbmVOb2Rlc1tlbmRMZW5ndGhdLCBuZXdOb2RlLCB2YWxpZGF0aW9uLCBlbmRDb24sIGVuZE9mZiwgaXNSZW1vdmVGb3JtYXQsIGlzUmVtb3ZlTm9kZSwgX3JlbW92ZUNoZWNrLCBfZ2V0TWFpbnRhaW5lZE5vZGUsIF9pc01haW50YWluZWROb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBtaWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBlbmRMZW5ndGggLSAxLCBuZXdSYW5nZTsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBhcHBlbmROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2UgPSB0aGlzLl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUobGluZU5vZGVzW2ldLCBuZXdOb2RlLCB2YWxpZGF0aW9uLCBpc1JlbW92ZUZvcm1hdCwgaXNSZW1vdmVOb2RlLCBfcmVtb3ZlQ2hlY2ssIGVuZC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdSYW5nZS5lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmFuY2VzdG9yID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kLmNvbnRhaW5lciA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29tbW9uTGlzdFN0eWxlKG5ld1JhbmdlLmFuY2VzdG9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydFxyXG4gICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbm9kZUNoYW5nZV9zdGFydExpbmUobGluZU5vZGVzWzBdLCBuZXdOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0LCBpc1JlbW92ZU5vZGUsIF9yZW1vdmVDaGVjaywgX2dldE1haW50YWluZWROb2RlLCBfaXNNYWludGFpbmVkTm9kZSwgZW5kLmNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0LmVuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZC5hbmNlc3RvciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kLmNvbnRhaW5lciA9IHN0YXJ0LmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuZC5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmQuYW5jZXN0b3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZC5jb250YWluZXIgPSBzdGFydC5jb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kLm9mZnNldCA9IHN0YXJ0LmNvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29tbW9uTGlzdFN0eWxlKHN0YXJ0LmFuY2VzdG9yLCBudWxsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbW1vbkxpc3RTdHlsZShlbmQuYW5jZXN0b3IgfHwgdXRpbC5nZXRGb3JtYXRFbGVtZW50KGVuZC5jb250YWluZXIpLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHJhbmdlXHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzdGFydC5jb250YWluZXIsIHN0YXJ0Lm9mZnNldCwgZW5kLmNvbnRhaW5lciwgZW5kLm9mZnNldCk7XHJcblxyXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSWYgY2VydGFpbiBzdHlsZXMgYXJlIGFwcGxpZWQgdG8gYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBsaXN0IGNlbGwsIHRoZSBzdHlsZSBvZiB0aGUgbGlzdCBjZWxsIGlzIGFsc28gY2hhbmdlZC4gKGJvbGQsIGNvbG9yLCBzaXplKVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWwgTGlzdCBjZWxsIGVsZW1lbnQuIDxsaT5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8bnVsbH0gY2hpbGQgVmFyaWFibGUgZm9yIHJlY3Vyc2l2ZSBjYWxsLiAoXCJudWxsXCIgb24gdGhlIGZpcnN0IGNhbGwpXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0Q29tbW9uTGlzdFN0eWxlOiBmdW5jdGlvbiAoZWwsIGNoaWxkKSB7XHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc0xpc3RDZWxsKGVsKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHV0aWwuZ2V0QXJyYXlJdGVtKChjaGlsZCB8fCBlbCkuY2hpbGROb2RlcywgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuICF1dGlsLmlzQnJlYWsoY3VycmVudCkgJiYgIXV0aWwub25seVplcm9XaWR0aFNwYWNlKGN1cnJlbnQudGV4dENvbnRlbnQudHJpbSgpKTsgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlblswXSAmJiBjaGlsZHJlbi5sZW5ndGggPT09IDEpe1xyXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgIGlmICghY2hpbGQgfHwgY2hpbGQubm9kZVR5cGUgIT09IDEpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFN0eWxlID0gY2hpbGQuc3R5bGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbFN0eWxlID0gZWwuc3R5bGU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYm9sZFxyXG4gICAgICAgICAgICAgICAgaWYgKC9TVFJPTkcvaS50ZXN0KGNoaWxkLm5vZGVOYW1lKSkgZWxTdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnOyAvLyBib2xkXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZFN0eWxlLmZvbnRXZWlnaHQpIGVsU3R5bGUuZm9udFdlaWdodCA9IGNoaWxkU3R5bGUuZm9udFdlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZFN0eWxlLmNvbG9yKSBlbFN0eWxlLmNvbG9yID0gY2hpbGRTdHlsZS5jb2xvcjsgLy8gY29sb3JcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZFN0eWxlLmZvbnRTaXplKSBlbFN0eWxlLmZvbnRTaXplID0gY2hpbGRTdHlsZS5mb250U2l6ZTsgLy8gc2l6ZVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbW1vbkxpc3RTdHlsZShlbCwgY2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFN0cmlwIHJlbW92ZSBub2RlXHJcbiAgICAgICAgICogQHBhcmFtIHtOb2RlfSByZW1vdmVOb2RlIFRoZSByZW1vdmUgbm9kZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3N0cmlwUmVtb3ZlTm9kZTogZnVuY3Rpb24gKHJlbW92ZU5vZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbW92ZU5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgaWYgKCFyZW1vdmVOb2RlIHx8IHJlbW92ZU5vZGUubm9kZVR5cGUgPT09IDMgfHwgIWVsZW1lbnQpIHJldHVybjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVtb3ZlTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5bMF0pIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkcmVuWzBdLCByZW1vdmVOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChyZW1vdmVOb2RlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIHRoZSBwYXJlbnQgbWFpbnRhaW5lZCB0YWcuIChiaW5kIGFuZCB1c2UgYSB1dGlsIG9iamVjdClcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtFbGVtZW50fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3V0aWxfZ2V0TWFpbnRhaW5lZE5vZGU6IGZ1bmN0aW9uIChfaXNSZW1vdmUsIF9pc1NpemVOb2RlLCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZWxlbWVudCB8fCBfaXNSZW1vdmUpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMuX2lzTWFpbnRhaW5lZE5vZGUuYmluZCh0aGlzKSkgfHwgKCFfaXNTaXplTm9kZSA/IHRoaXMuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCB0aGlzLl9pc1NpemVOb2RlLmJpbmQodGhpcykpIDogbnVsbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGVsZW1lbnQgaXMgYSB0YWcgdGhhdCBzaG91bGQgYmUgcGVyc2lzdGVkLiAoYmluZCBhbmQgdXNlIGEgdXRpbCBvYmplY3QpXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnRcclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF91dGlsX2lzTWFpbnRhaW5lZE5vZGU6IGZ1bmN0aW9uIChfaXNSZW1vdmUsIF9pc1NpemVOb2RlLCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZWxlbWVudCB8fCBfaXNSZW1vdmUgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLl9pc01haW50YWluZWROb2RlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMuX2lzTWFpbnRhaW5lZE5vZGUuYmluZCh0aGlzKSkgPyBhbmNob3IgOiAoYW5jaG9yIHx8ICghX2lzU2l6ZU5vZGUgPyB0aGlzLl9pc1NpemVOb2RlKGVsZW1lbnQpIDogZmFsc2UpKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgdGV4dCBub2RlcyBvZiBsaW5lIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWxpZGF0aW9uIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0Q29uIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgVGhlIHN0YXJ0T2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gZW5kQ29uIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgSXMgdGhlIHJlbW92ZSBhbGwgZm9ybWF0cyBjb21tYW5kP1xyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVOb2RlIFwibmV3SW5uZXJOb2RlXCIgaXMgcmVtb3ZlIG5vZGU/XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjb2xsYXBzZWQgcmFuZ2UuY29sbGFwc2VkXHJcbiAgICAgICAgICogQHJldHVybnMge3thbmNlc3RvcjogKiwgc3RhcnRDb250YWluZXI6ICosIHN0YXJ0T2Zmc2V0OiAqLCBlbmRDb250YWluZXI6ICosIGVuZE9mZnNldDogKn19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9vbmVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgaXNSZW1vdmVOb2RlLCBjb2xsYXBzZWQsIF9yZW1vdmVDaGVjaywgX2dldE1haW50YWluZWROb2RlLCBfaXNNYWludGFpbmVkTm9kZSkge1xyXG4gICAgICAgICAgICAvLyBub3QgYWRkIHRhZ1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50Q29uID0gc3RhcnRDb24ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFwYXJlbnRDb24ubmV4dFNpYmxpbmcgJiYgIXBhcmVudENvbi5wcmV2aW91c1NpYmxpbmcgJiYgIXV0aWwuaXNGb3JtYXRFbGVtZW50KHBhcmVudENvbi5wYXJlbnROb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYocGFyZW50Q29uLnBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Q29uLm5vZGVOYW1lID09PSBuZXdJbm5lck5vZGUubm9kZU5hbWUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uID0gcGFyZW50Q29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaXNSZW1vdmVOb2RlICYmIHBhcmVudENvbiA9PT0gZW5kQ29uLnBhcmVudE5vZGUgJiYgcGFyZW50Q29uLm5vZGVOYW1lID09PSBuZXdJbm5lck5vZGUubm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShzdGFydENvbi50ZXh0Q29udGVudC5zbGljZSgwLCBzdGFydE9mZikpICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKGVuZENvbi50ZXh0Q29udGVudC5zbGljZShlbmRPZmYpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Q29uLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhbWVUYWcgPSB0cnVlO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aCwgYywgcywgZSwgejsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeiA9ICF1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShjKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IHN0YXJ0Q29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBlbmRDb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghcyAmJiB6KSB8fCAocyAmJiBlICYmIHopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lVGFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzYW1lVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29weVRhZ0F0dHJpYnV0ZXMocGFyZW50Q29uLCBuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2ZmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyOiBlbmRDb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGVuZE9mZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRhZ1xyXG4gICAgICAgICAgICBfcmVtb3ZlQ2hlY2sudiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG5Ob2RlQXJyYXkgPSBbbmV3SW5uZXJOb2RlXTtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2FtZU5vZGUgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRDb250YWluZXIgPSBzdGFydENvbjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBlbmRDb250YWluZXIgPSBlbmRDb247XHJcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBlbmRPZmY7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGVuZFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlLCBjc3NUZXh0LCBhbmNob3JOb2RlO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd1JlZ0V4cCA9IF93LlJlZ0V4cDtcclxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tDc3MgKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWdFeHAgPSBuZXcgd1JlZ0V4cCgnKD86O3xefFxcXFxzKSg/OicgKyBjc3NUZXh0ICsgJ251bGwpXFxcXHMqOlteO10qXFxcXHMqKD86O3wkKScsICdpZycpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlZ0V4cCAmJiB2Tm9kZS5zdHlsZS5jc3NUZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHJlZ0V4cC50ZXN0KHZOb2RlLnN0eWxlLmNzc1RleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiAhc3R5bGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIGFuY2VzdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aCwgdk5vZGU7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IGFuY2VzdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9uZU5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydFBhc3MgJiYgY2hpbGQgPT09IHN0YXJ0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gcE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBfZ2V0TWFpbnRhaW5lZE5vZGUoY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IHN0YXJ0Q29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgc3RhcnRPZmZzZXQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBzdGFydENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKHN0YXJ0T2Zmc2V0LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NhbWVOb2RlID8gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuZE9mZnNldCA+PSBzdGFydE9mZnNldCA/IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0IDogc3RhcnRDb250YWluZXIuZGF0YS5sZW5ndGggLSBzdGFydE9mZnNldCkgOiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lci5kYXRhLmxlbmd0aCAtIHN0YXJ0T2Zmc2V0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gX2dldE1haW50YWluZWROb2RlKGFuY2VzdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEucGFyZW50Tm9kZSAhPT0gbGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG0ucGFyZW50Tm9kZSAhPT0gbGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHAgPSBtLnBhcmVudE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUobS5jaGlsZE5vZGVzWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKG0uY2hpbGROb2Rlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5hcHBlbmRDaGlsZChwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG0ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IGFuY2hvck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShwcmV2Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLmFwcGVuZENoaWxkKHByZXZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkFuY2hvck5vZGUgPSBfZ2V0TWFpbnRhaW5lZE5vZGUoYW5jZXN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFwcmV2QW5jaG9yTm9kZSkgYW5jaG9yTm9kZSA9IHByZXZBbmNob3JOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZSkgbGluZSA9IGFuY2hvck5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IGxpbmUgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdk5vZGUgPSBfaXNNYWludGFpbmVkTm9kZShuZXdOb2RlKSA/IG51bGwgOiB2YWxpZGF0aW9uKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZOb2RlICYmIG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZSAmJiAhX2dldE1haW50YWluZWROb2RlKGVuZENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2RlQXJyYXkucHVzaChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFzcyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSAhPT0gdGV4dE5vZGUpIG5ld05vZGUuYXBwZW5kQ2hpbGQoc3RhcnRDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2FtZU5vZGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRQYXNzICYmIGNoaWxkID09PSBlbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IF9nZXRNYWludGFpbmVkTm9kZShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoZW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBlbmRDb250YWluZXIuc3Vic3RyaW5nRGF0YShlbmRPZmZzZXQsIChlbmRDb250YWluZXIubGVuZ3RoIC0gZW5kT2Zmc2V0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoaXNTYW1lTm9kZSB8fCBlbmRDb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGVuZENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKDAsIGVuZE9mZnNldCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBhbmNob3JOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2lzTWFpbnRhaW5lZE5vZGUobmV3SW5uZXJOb2RlLnBhcmVudE5vZGUpICYmICFhbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTm9kZUFycmF5LnB1c2gobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShhZnRlck5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lzTWFpbnRhaW5lZE5vZGUobmV3Tm9kZSkpIGFuY2hvcnMucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBwQ3VycmVudC5jb25jYXQoYW5jaG9ycyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVOb2RlID0gYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBhZnRlck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLnRleHRDb250ZW50ID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JOb2RlICYmIGNsb25lTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJBbmNob3JOb2RlID0gX2dldE1haW50YWluZWROb2RlKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJBbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IGFmdGVyQW5jaG9yTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Tm9kZSA9IF9pc01haW50YWluZWROb2RlKG5ld05vZGUpID8gbnVsbCA6IHZhbGlkYXRpb24obmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2godk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlLmluc2VydEJlZm9yZShuZXdJbm5lck5vZGUsIGFuY2hvck5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChhbmNob3JOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2RlQXJyYXkucHVzaChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZE9mZnNldCA9IHRleHROb2RlLmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRQYXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNSZW1vdmVGb3JtYXQgJiYgY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHROb2RlLnRleHRDb250ZW50ID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUgIT09IHRleHROb2RlKSBuZXdOb2RlLmFwcGVuZENoaWxkKGVuZENvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQYXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuX2lzSWdub3JlTm9kZUNoYW5nZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjaGlsZC5jbG9uZU5vZGUodHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTm9kZUFycmF5LnB1c2gobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZS5wYXJlbnROb2RlICE9PSBudWxsICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG5ld0lubmVyTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdk5vZGUgPSBlbmRQYXNzID8gbmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpIDogdmFsaWRhdGlvbihuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpICYmIHZOb2RlICYmIGNoZWNrQ3NzKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc01haW50YWluZWROb2RlKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5jaG9yTm9kZSkgYW5jaG9ycy5wdXNoKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IHBDdXJyZW50LmNvbmNhdChhbmNob3JzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc01haW50YWluZWROb2RlKG5ld0lubmVyTm9kZS5wYXJlbnROb2RlKSAmJiAhX2lzTWFpbnRhaW5lZE5vZGUoY2hpbGROb2RlKSAmJiAhdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UobmV3SW5uZXJOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlID0gbmV3SW5uZXJOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5kUGFzcyAmJiAhYW5jaG9yTm9kZSAmJiBfaXNNYWludGFpbmVkTm9kZShjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFDaGlsZHJlbiA9IGNoaWxkTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYSA9IDAsIGFMZW4gPSBhQ2hpbGRyZW4ubGVuZ3RoOyBhIDwgYUxlbjsgYSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGFDaGlsZHJlblthXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTm9kZUFycmF5LnB1c2gobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbm5lck5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkgYW5jZXN0b3IgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBhbmNlc3RvciA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZE5vZGUgPT09IGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MpIGFuY2VzdG9yID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBhbmNlc3RvciA9IHBOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZFBhc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvck5vZGUgJiYgY2hpbGQubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZ2V0TWFpbnRhaW5lZE5vZGUoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JBbmNob3JOb2RlID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGFuY2VzdG9yLCBmdW5jdGlvbiAoY3VycmVudCkge3JldHVybiB0aGlzLl9pc01haW50YWluZWROb2RlKGN1cnJlbnQucGFyZW50Tm9kZSkgfHwgY3VycmVudC5wYXJlbnROb2RlID09PSBwTm9kZTt9LmJpbmQodXRpbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUuYXBwZW5kQ2hpbGQoYW5jZXN0b3JBbmNob3JOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBhbmNlc3RvckFuY2hvck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTm9kZUFycmF5LnB1c2gobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVOb2RlID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvci5hcHBlbmRDaGlsZChjbG9uZU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkgY292ZXJOb2RlID0gY2xvbmVOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KShlbGVtZW50LCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBub3QgcmVtb3ZlIHRhZ1xyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVOb2RlICYmICFpc1JlbW92ZUZvcm1hdCAmJiAhX3JlbW92ZUNoZWNrLnYpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3I6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29uLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydE9mZixcclxuICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXI6IGVuZENvbixcclxuICAgICAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGVuZE9mZlxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXNSZW1vdmVGb3JtYXQgPSBpc1JlbW92ZUZvcm1hdCAmJiBpc1JlbW92ZU5vZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gbk5vZGVBcnJheVtpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dE5vZGUsIHRleHROb2RlX3MsIHRleHROb2RlX2U7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLnJlcGxhY2VDaGlsZCh0ZXh0Tm9kZSwgcmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckNoaWxkcmVuID0gcmVtb3ZlTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZV9zID0gckNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAockNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZV9lID0gckNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKHRleHROb2RlX2UsIHJlbW92ZU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShyZW1vdmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyID0gZW5kQ29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHRleHROb2RlX3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXIgPSB0ZXh0Tm9kZV9lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3ZlTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdHJpcFJlbW92ZU5vZGUobk5vZGVBcnJheVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlRW1wdHlOb2RlKHBOb2RlLCBuZXdJbm5lck5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBzdGFydENvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQgPSBlbmRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBlbmRDb250YWluZXIgcmVzZXRcclxuICAgICAgICAgICAgY29uc3QgZW5kQ29uUmVzZXQgPSBpc1JlbW92ZUZvcm1hdCB8fCBlbmRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoID09PSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF1dGlsLmlzQnJlYWsoZW5kQ29udGFpbmVyKSAmJiBlbmRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZW5kQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIGVuZENvbnRhaW5lciA9IHN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVuZE9mZnNldCA9IGVuZENvblJlc2V0ID8gZW5kQ29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aCA6IGVuZE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vZGUgY2hhbmdlXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0YXJ0T2Zmc2V0ID0ge3M6IDAsIGU6IDB9O1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFBhdGggPSB1dGlsLmdldE5vZGVQYXRoKHN0YXJ0Q29udGFpbmVyLCBwTm9kZSwgbmV3U3RhcnRPZmZzZXQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbWVyZ2VFbmRDb24gPSAhZW5kQ29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChtZXJnZUVuZENvbikgZW5kQ29udGFpbmVyID0gc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuZE9mZnNldCA9IHtzOiAwLCBlOiAwfTtcclxuICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgoZW5kQ29udGFpbmVyICwgcE5vZGUsICghbWVyZ2VFbmRDb24gJiYgIWVuZENvblJlc2V0KSA/IG5ld0VuZE9mZnNldCA6IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgKz0gbmV3U3RhcnRPZmZzZXQucztcclxuICAgICAgICAgICAgZW5kT2Zmc2V0ID0gKGNvbGxhcHNlZCA/IHN0YXJ0T2Zmc2V0IDogbWVyZ2VFbmRDb24gPyBzdGFydENvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGggOiBlbmRDb25SZXNldCA/IGVuZE9mZnNldCArIG5ld1N0YXJ0T2Zmc2V0LnMgOiBlbmRPZmZzZXQgKyBuZXdFbmRPZmZzZXQucyk7XHJcblxyXG4gICAgICAgICAgICAvLyB0YWcgbWVyZ2VcclxuICAgICAgICAgICAgY29uc3QgbmV3T2Zmc2V0cyA9IHV0aWwubWVyZ2VTYW1lVGFncyhwTm9kZSwgW3N0YXJ0UGF0aCwgZW5kUGF0aF0sIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwTm9kZSwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHV0aWwuZ2V0Tm9kZUZyb21QYXRoKHN0YXJ0UGF0aCwgcE5vZGUpO1xyXG4gICAgICAgICAgICBlbmRDb250YWluZXIgPSB1dGlsLmdldE5vZGVGcm9tUGF0aChlbmRQYXRoLCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYW5jZXN0b3I6IHBOb2RlLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgbmV3T2Zmc2V0c1swXSxcclxuICAgICAgICAgICAgICAgIGVuZENvbnRhaW5lcjogZW5kQ29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBlbmRPZmZzZXQgKyBuZXdPZmZzZXRzWzFdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIGZpcnN0IGxpbmUgc2VsZWN0ZWQgdGV4dC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkYXRpb24gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHN0cmlwcGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRDb24gVGhlIHN0YXJ0Q29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydE9mZiBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCBJcyB0aGUgcmVtb3ZlIGFsbCBmb3JtYXRzIGNvbW1hbmQ/XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZU5vZGUgXCJuZXdJbm5lck5vZGVcIiBpcyByZW1vdmUgbm9kZT9cclxuICAgICAgICAgKiBAcmV0dXJucyB7bnVsbHxOb2RlfSBJZiBlbmQgY29udGFpbmVyIGlzIHJlbmV3ZWQsIHJldHVybmVkIHJlbmV3ZWQgbm9kZVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHsgYW5jZXN0b3IsIGNvbnRhaW5lciwgb2Zmc2V0LCBlbmRDb250YWluZXIgfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2Vfc3RhcnRMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0LCBpc1JlbW92ZU5vZGUsIF9yZW1vdmVDaGVjaywgX2dldE1haW50YWluZWROb2RlLCBfaXNNYWludGFpbmVkTm9kZSwgX2VuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAvLyBub3QgYWRkIHRhZ1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50Q29uID0gc3RhcnRDb24ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFwYXJlbnRDb24ubmV4dFNpYmxpbmcgJiYgIXBhcmVudENvbi5wcmV2aW91c1NpYmxpbmcgJiYgIXV0aWwuaXNGb3JtYXRFbGVtZW50KHBhcmVudENvbi5wYXJlbnROb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYocGFyZW50Q29uLnBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Q29uLm5vZGVOYW1lID09PSBuZXdJbm5lck5vZGUubm9kZU5hbWUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uID0gcGFyZW50Q29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaXNSZW1vdmVOb2RlICYmIHBhcmVudENvbi5ub2RlTmFtZSA9PT0gbmV3SW5uZXJOb2RlLm5vZGVOYW1lICYmICF1dGlsLmlzRm9ybWF0RWxlbWVudChwYXJlbnRDb24pICYmICFwYXJlbnRDb24ubmV4dFNpYmxpbmcgJiYgdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2Uoc3RhcnRDb24udGV4dENvbnRlbnQuc2xpY2UoMCwgc3RhcnRPZmYpKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNhbWVUYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IHMgPSBzdGFydENvbi5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UocykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVRhZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcyA9IHMucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzYW1lVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jb3B5VGFnQXR0cmlidXRlcyhwYXJlbnRDb24sIG5ld0lubmVyTm9kZSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBzdGFydENvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBzdGFydE9mZlxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0YWdcclxuICAgICAgICAgICAgX3JlbW92ZUNoZWNrLnYgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgZWwgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBuTm9kZUFycmF5ID0gW25ld0lubmVyTm9kZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHBOb2RlID0gZWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBwYXNzTm9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcEN1cnJlbnQsIG5ld05vZGUsIGFwcGVuZE5vZGUsIGFuY2hvck5vZGU7XHJcblxyXG4gICAgICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBhbmNlc3Rvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGgsIHZOb2RlLCBjbG9uZUNoaWxkOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IGFuY2VzdG9yO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc05vZGUgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5faXNJZ25vcmVOb2RlQ2hhbmdlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lQ2hpbGQgPSBjaGlsZC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTm9kZUFycmF5LnB1c2gobmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZW5kQ29udGFpbmVyICYmIGNoaWxkLmNvbnRhaW5zKF9lbmRDb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFBhdGggPSB1dGlsLmdldE5vZGVQYXRoKF9lbmRDb250YWluZXIsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VuZENvbnRhaW5lciA9IHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGVuZFBhdGgsIGNsb25lQ2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZS5wYXJlbnROb2RlICE9PSBudWxsICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG5ld0lubmVyTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdk5vZGUgPSB2YWxpZGF0aW9uKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgdk5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lzTWFpbnRhaW5lZE5vZGUobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNob3JOb2RlKSBhbmNob3JzLnB1c2godk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2godk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBwQ3VycmVudC5jb25jYXQoYW5jaG9ycyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1RvcE5vZGUgPSBwQ3VycmVudC5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXNNYWludGFpbmVkTm9kZShuZXdJbm5lck5vZGUucGFyZW50Tm9kZSkgJiYgIV9pc01haW50YWluZWROb2RlKGNoaWxkTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2RlQXJyYXkucHVzaChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvck5vZGUgJiYgX2lzTWFpbnRhaW5lZE5vZGUoY2hpbGROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlID0gbmV3SW5uZXJOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhQ2hpbGRyZW4gPSBjaGlsZE5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGEgPSAwLCBhTGVuID0gYUNoaWxkcmVuLmxlbmd0aDsgYSA8IGFMZW47IGErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChhQ2hpbGRyZW5bYV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSAhX2lzTWFpbnRhaW5lZE5vZGUobmV3Tm9kZSkgPyBuZXdOb2RlIDogbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUb3BOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZSAmJiBjaGlsZC5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9nZXRNYWludGFpbmVkTm9kZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3RvckFuY2hvck5vZGUgPSB1dGlsLmdldFBhcmVudEVsZW1lbnQoYW5jZXN0b3IsIGZ1bmN0aW9uIChjdXJyZW50KSB7cmV0dXJuIHRoaXMuX2lzTWFpbnRhaW5lZE5vZGUoY3VycmVudC5wYXJlbnROb2RlKSB8fCBjdXJyZW50LnBhcmVudE5vZGUgPT09IHBOb2RlO30uYmluZCh1dGlsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZS5hcHBlbmRDaGlsZChhbmNlc3RvckFuY2hvck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IGFuY2VzdG9yQW5jaG9yTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2RlQXJyYXkucHVzaChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGFydENvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc05vZGUgJiYgY2hpbGQgPT09IGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHBOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlID0gX2dldE1haW50YWluZWROb2RlKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgb2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShjb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGNvbnRhaW5lci5zdWJzdHJpbmdEYXRhKG9mZnNldCwgKGNvbnRhaW5lci5sZW5ndGggLSBvZmZzZXQpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IF9nZXRNYWludGFpbmVkTm9kZShhbmNlc3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnBhcmVudE5vZGUgIT09IGxpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtLnBhcmVudE5vZGUgIT09IGxpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBwID0gbS5wYXJlbnROb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKG0uY2hpbGROb2Rlc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChtLmNoaWxkTm9kZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uYXBwZW5kQ2hpbGQocCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBtLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBhbmNob3JOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UocHJldk5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvci5hcHBlbmRDaGlsZChwcmV2Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZBbmNob3JOb2RlID0gX2dldE1haW50YWluZWROb2RlKGFuY2VzdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcHJldkFuY2hvck5vZGUpIGFuY2hvck5vZGUgPSBwcmV2QW5jaG9yTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvck5vZGUpIGxpbmUgPSBhbmNob3JOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFuY2VzdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gbGluZSAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Tm9kZSA9IHZhbGlkYXRpb24obmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB2Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2godk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgYW5jZXN0b3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlICE9PSBhbmNlc3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayhjaGlsZCkpIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZC5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmRDaGlsZChuZXdJbm5lck5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NOb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdk5vZGUgPSAhcGFzc05vZGUgPyBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpIDogdmFsaWRhdGlvbihjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLmFwcGVuZENoaWxkKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSB2Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vdCByZW1vdmUgdGFnXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZU5vZGUgJiYgIWlzUmVtb3ZlRm9ybWF0ICYmICFfcmVtb3ZlQ2hlY2sudikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IHN0YXJ0Q29uLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogc3RhcnRPZmYsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyOiBfZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpc1JlbW92ZUZvcm1hdCA9IGlzUmVtb3ZlRm9ybWF0ICYmIGlzUmVtb3ZlTm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuTm9kZUFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW92ZU5vZGUgPSBuTm9kZUFycmF5W2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByQ2hpbGRyZW4gPSByZW1vdmVOb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByQ2hpbGRyZW5bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJDaGlsZHJlblswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUockNoaWxkcmVuWzBdLCByZW1vdmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHJlbW92ZU5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0cmlwUmVtb3ZlTm9kZShuTm9kZUFycmF5W2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBwTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSwgbmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UocE5vZGUudGV4dENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gcE5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG5vZGUgY2hhbmdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRzID0ge3M6IDAsIGU6IDB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgoY29udGFpbmVyLCBwTm9kZSwgb2Zmc2V0cyk7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gb2Zmc2V0cy5zO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHRhZyBtZXJnZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3T2Zmc2V0cyA9IHV0aWwubWVyZ2VTYW1lVGFncyhwTm9kZSwgW3BhdGhdLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHBOb2RlLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB1dGlsLmdldE5vZGVGcm9tUGF0aChwYXRoLCBwTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbmV3T2Zmc2V0c1swXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9yOiBwTm9kZSxcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBlbmRDb250YWluZXI6IF9lbmRDb250YWluZXJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbWlkIGxpbmVzIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWxpZGF0aW9uIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlRm9ybWF0IElzIHRoZSByZW1vdmUgYWxsIGZvcm1hdHMgY29tbWFuZD9cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlTm9kZSBcIm5ld0lubmVyTm9kZVwiIGlzIHJlbW92ZSBub2RlP1xyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gX2VuZENvbnRhaW5lciBPZmZzZXQgbm9kZSBvZiBsYXN0IGxpbmUgYWxyZWFkeSBtb2RpZmllZCAoZW5kLmNvbnRhaW5lcilcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IGFuY2VzdG9yLCBlbmRDb250YWluZXI6IFwiSWYgZW5kIGNvbnRhaW5lciBpcyByZW5ld2VkLCByZXR1cm5lZCByZW5ld2VkIG5vZGVcIiB9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9taWRkbGVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBpc1JlbW92ZUZvcm1hdCwgaXNSZW1vdmVOb2RlLCBfcmVtb3ZlQ2hlY2ssIF9lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgLy8gbm90IGFkZCB0YWdcclxuICAgICAgICAgICAgaWYgKCFpc1JlbW92ZU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGVuZCBjb250YWluZXIgcGF0aFxyXG4gICAgICAgICAgICAgICAgbGV0IGVuZFBhdGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9lbmRDb250YWluZXIgJiYgZWxlbWVudC5jb250YWlucyhfZW5kQ29udGFpbmVyKSkgZW5kUGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgoX2VuZENvbnRhaW5lciwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGVOYW1lID0gbmV3SW5uZXJOb2RlLm5vZGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q3NzVGV4dCA9IG5ld0lubmVyTm9kZS5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBuZXdJbm5lck5vZGUuY2xhc3NOYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHRlbXBOb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoaWxkOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMykgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lID09PSBuZXdOb2RlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdHlsZS5jc3NUZXh0ICs9IG5ld0Nzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY2hpbGQsIG5ld0NsYXNzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF1dGlsLmlzQnJlYWsoY2hpbGQpICYmIHV0aWwuX2lzSWdub3JlTm9kZUNoYW5nZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZC5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIGkgPT09IGxlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdGVtcE5vZGUuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yOiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXI6IGVuZFBhdGggPyB1dGlsLmdldE5vZGVGcm9tUGF0aChlbmRQYXRoLCBlbGVtZW50KSA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgdGFnXHJcbiAgICAgICAgICAgIF9yZW1vdmVDaGVjay52ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IHBOb2RlID0gZWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb25zdCBuTm9kZUFycmF5ID0gW25ld0lubmVyTm9kZV07XHJcbiAgICAgICAgICAgIGxldCBub25lQ2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIGFuY2VzdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aCwgdk5vZGUsIGNsb25lQ2hpbGQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IGFuY2VzdG9yO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNCcmVhayhjaGlsZCkgJiYgdXRpbC5faXNJZ25vcmVOb2RlQ2hhbmdlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5uZXJOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZUNoaWxkID0gY2hpbGQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjbG9uZUNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gbmV3SW5uZXJOb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2VuZENvbnRhaW5lciAmJiBjaGlsZC5jb250YWlucyhfZW5kQ29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgoX2VuZENvbnRhaW5lciwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VuZENvbnRhaW5lciA9IHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGVuZFBhdGgsIGNsb25lQ2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2Tm9kZSA9IHZhbGlkYXRpb24oY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVDaGFuZ2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLmFwcGVuZENoaWxkKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkgY292ZXJOb2RlID0gdk5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0JyZWFrKGNoaWxkKSkgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoZWxlbWVudCwgbmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vdCByZW1vdmUgdGFnXHJcbiAgICAgICAgICAgIGlmIChub25lQ2hhbmdlIHx8IChpc1JlbW92ZU5vZGUgJiYgIWlzUmVtb3ZlRm9ybWF0ICYmICFfcmVtb3ZlQ2hlY2sudikpIHJldHVybiB7IGFuY2VzdG9yOiBlbGVtZW50LCBlbmRDb250YWluZXI6IF9lbmRDb250YWluZXIgfTtcclxuXHJcbiAgICAgICAgICAgIHBOb2RlLmFwcGVuZENoaWxkKG5ld0lubmVyTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQgJiYgaXNSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Ob2RlQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlTm9kZSA9IG5Ob2RlQXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgckNoaWxkcmVuID0gcmVtb3ZlTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyQ2hpbGRyZW5bMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKHJDaGlsZHJlblswXSwgcmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShyZW1vdmVOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlbW92ZU5vZGUpIHtcclxuICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IG5ld0lubmVyTm9kZS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuTm9kZUFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RyaXBSZW1vdmVOb2RlKG5Ob2RlQXJyYXlbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSwgbmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgdXRpbC5tZXJnZVNhbWVUYWdzKHBOb2RlLCBudWxsLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vZGUgY2hhbmdlXHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4geyBhbmNlc3RvcjogcE5vZGUsIGVuZENvbnRhaW5lcjogX2VuZENvbnRhaW5lciB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiB3cmFwcyBsYXN0IGxpbmUgc2VsZWN0ZWQgdGV4dC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkYXRpb24gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHN0cmlwcGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gZW5kQ29uIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgSXMgdGhlIHJlbW92ZSBhbGwgZm9ybWF0cyBjb21tYW5kP1xyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVOb2RlIFwibmV3SW5uZXJOb2RlXCIgaXMgcmVtb3ZlIG5vZGU/XHJcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0geyBhbmNlc3RvciwgY29udGFpbmVyLCBvZmZzZXQgfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2VfZW5kTGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0LCBpc1JlbW92ZU5vZGUsIF9yZW1vdmVDaGVjaywgX2dldE1haW50YWluZWROb2RlLCBfaXNNYWludGFpbmVkTm9kZSkge1xyXG4gICAgICAgICAgICAvLyBub3QgYWRkIHRhZ1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50Q29uID0gZW5kQ29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIHdoaWxlICghcGFyZW50Q29uLm5leHRTaWJsaW5nICYmICFwYXJlbnRDb24ucHJldmlvdXNTaWJsaW5nICYmICF1dGlsLmlzRm9ybWF0RWxlbWVudChwYXJlbnRDb24ucGFyZW50Tm9kZSkgJiYgIXV0aWwuaXNXeXNpd3lnRGl2KHBhcmVudENvbi5wYXJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudENvbi5ub2RlTmFtZSA9PT0gbmV3SW5uZXJOb2RlLm5vZGVOYW1lKSBicmVhaztcclxuICAgICAgICAgICAgICAgIHBhcmVudENvbiA9IHBhcmVudENvbi5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlTm9kZSAmJiBwYXJlbnRDb24ubm9kZU5hbWUgPT09IG5ld0lubmVyTm9kZS5ub2RlTmFtZSAmJiAhdXRpbC5pc0Zvcm1hdEVsZW1lbnQocGFyZW50Q29uKSAmJiAhcGFyZW50Q29uLnByZXZpb3VzU2libGluZyAmJiB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShlbmRDb24udGV4dENvbnRlbnQuc2xpY2UoZW5kT2ZmKSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzYW1lVGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGxldCBlID0gZW5kQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwub25seVplcm9XaWR0aFNwYWNlKGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVUYWcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzYW1lVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jb3B5VGFnQXR0cmlidXRlcyhwYXJlbnRDb24sIG5ld0lubmVyTm9kZSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBlbmRDb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogZW5kT2ZmXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRhZ1xyXG4gICAgICAgICAgICBfcmVtb3ZlQ2hlY2sudiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG5Ob2RlQXJyYXkgPSBbbmV3SW5uZXJOb2RlXTtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gZW5kT2ZmO1xyXG4gICAgICAgICAgICBsZXQgcGFzc05vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlLCBhbmNob3JOb2RlO1xyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgYW5jZXN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjdXJyZW50LmNoaWxkTm9kZXM7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNoaWxkTm9kZXMubGVuZ3RoIC0gMSwgdk5vZGU7IDAgPD0gaTsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb3Zlck5vZGUgPSBhbmNlc3RvcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NOb2RlICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuX2lzSWdub3JlTm9kZUNoYW5nZShjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9uZUNoaWxkID0gY2hpbGQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjbG9uZUNoaWxkLCBhbmNlc3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0lubmVyTm9kZSwgY2xvbmVDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBuZXdJbm5lck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZOb2RlID0gdmFsaWRhdGlvbihuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Tm9kZSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc01haW50YWluZWROb2RlKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5jaG9yTm9kZSkgYW5jaG9ycy5wdXNoKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKHZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gcEN1cnJlbnQuY29uY2F0KGFuY2hvcnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNUb3BOb2RlID0gcEN1cnJlbnQubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lzTWFpbnRhaW5lZE5vZGUobmV3SW5uZXJOb2RlLnBhcmVudE5vZGUpICYmICFfaXNNYWludGFpbmVkTm9kZShjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShuZXdJbm5lck5vZGUsIHBOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5jaG9yTm9kZSAmJiBfaXNNYWludGFpbmVkTm9kZShjaGlsZE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFDaGlsZHJlbiA9IGNoaWxkTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYSA9IDAsIGFMZW4gPSBhQ2hpbGRyZW4ubGVuZ3RoOyBhIDwgYUxlbjsgYSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGFDaGlsZHJlblthXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIHBOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5uZXJOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIGFuY2VzdG9yID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYW5jZXN0b3IgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUb3BOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgbmV3SW5uZXJOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JOb2RlICYmIGNoaWxkLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2dldE1haW50YWluZWROb2RlKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yQW5jaG9yTm9kZSA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChhbmNlc3RvciwgZnVuY3Rpb24gKGN1cnJlbnQpIHtyZXR1cm4gdGhpcy5faXNNYWludGFpbmVkTm9kZShjdXJyZW50LnBhcmVudE5vZGUpIHx8IGN1cnJlbnQucGFyZW50Tm9kZSA9PT0gcE5vZGU7fS5iaW5kKHV0aWwpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlLmFwcGVuZENoaWxkKGFuY2VzdG9yQW5jaG9yTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlID0gYW5jZXN0b3JBbmNob3JOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0lubmVyTm9kZSwgcE5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlICYmIGNoaWxkID09PSBjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IF9nZXRNYWludGFpbmVkTm9kZShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YShvZmZzZXQsIChjb250YWluZXIubGVuZ3RoIC0gb2Zmc2V0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBvZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlID0gYW5jaG9yTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IF9nZXRNYWludGFpbmVkTm9kZShhbmNlc3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnBhcmVudE5vZGUgIT09IHBOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobS5wYXJlbnROb2RlICE9PSBwTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHAgPSBtLnBhcmVudE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUobS5jaGlsZE5vZGVzWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKG0uY2hpbGROb2Rlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5hcHBlbmRDaGlsZChwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG0ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLCBtLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlID0gYW5jaG9yTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9pc01haW50YWluZWROb2RlKG5ld0lubmVyTm9kZS5wYXJlbnROb2RlKSAmJiAhYW5jaG9yTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlID0gbmV3SW5uZXJOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk5vZGVBcnJheS5wdXNoKG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UoYWZ0ZXJOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IuaW5zZXJ0QmVmb3JlKGFmdGVyTm9kZSwgYW5jZXN0b3IuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBhbmNlc3RvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZOb2RlID0gX2lzTWFpbnRhaW5lZE5vZGUobmV3Tm9kZSkgPyBudWxsIDogdmFsaWRhdGlvbihuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Tm9kZSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaCh2Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBhbmNlc3RvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgIT09IGFuY2VzdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgbmV3SW5uZXJOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzQnJlYWsoY2hpbGQpKSBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZS5pbnNlcnRCZWZvcmUobmV3SW5uZXJOb2RlLCBhbmNob3JOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKGFuY2hvck5vZGUsIHBOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUobmV3SW5uZXJOb2RlLCBwTm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRleHROb2RlLmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzTm9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvci5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBhbmNlc3Rvci5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2Tm9kZSA9ICFwYXNzTm9kZSA/IGNoaWxkLmNsb25lTm9kZShmYWxzZSkgOiB2YWxpZGF0aW9uKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IuaW5zZXJ0QmVmb3JlKHZOb2RlLCBhbmNlc3Rvci5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSB2Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vdCByZW1vdmUgdGFnXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZU5vZGUgJiYgIWlzUmVtb3ZlRm9ybWF0ICYmICFfcmVtb3ZlQ2hlY2sudikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IGVuZENvbixcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGVuZE9mZlxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXNSZW1vdmVGb3JtYXQgPSBpc1JlbW92ZUZvcm1hdCAmJiBpc1JlbW92ZU5vZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gbk5vZGVBcnJheVtpXTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByQ2hpbGRyZW4gPSByZW1vdmVOb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAockNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gckNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIHJlbW92ZU5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0ocmVtb3ZlTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBuTm9kZUFycmF5Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRleHROb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUgPSBuZXdJbm5lck5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbk5vZGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0cmlwUmVtb3ZlTm9kZShuTm9kZUFycmF5W2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBwTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzUmVtb3ZlTm9kZSAmJiBuZXdJbm5lck5vZGUudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVFbXB0eU5vZGUocE5vZGUsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVFbXB0eU5vZGUocE5vZGUsIG5ld0lubmVyTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwub25seVplcm9XaWR0aFNwYWNlKHBOb2RlLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHBOb2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gY29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBub2RlIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHtzOiAwLCBlOiAwfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB1dGlsLmdldE5vZGVQYXRoKGNvbnRhaW5lciwgcE5vZGUsIG9mZnNldHMpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldHMucztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB0YWcgbWVyZ2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld09mZnNldHMgPSB1dGlsLm1lcmdlU2FtZVRhZ3MocE5vZGUsIFtwYXRoXSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwTm9kZSwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5nZXROb2RlRnJvbVBhdGgocGF0aCwgcE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5ld09mZnNldHNbMF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBhbmNlc3RvcjogcE5vZGUsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJ1biBwbHVnaW4gY2FsbHMgYW5kIGJhc2ljIGNvbW1hbmRzLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21tYW5kIENvbW1hbmQgc3RyaW5nXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGRpc3BsYXkgRGlzcGxheSB0eXBlIHN0cmluZyAoJ2NvbW1hbmQnLCAnc3VibWVudScsICdkaWFsb2cnLCAnY29udGFpbmVyJylcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgZWxlbWVudCBvZiBjb21tYW5kIGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFjdGlvbkNhbGw6IGZ1bmN0aW9uIChjb21tYW5kLCBkaXNwbGF5LCB0YXJnZXQpIHtcclxuICAgICAgICAgICAgLy8gY2FsbCBwbHVnaW5zXHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoL21vcmUvaS50ZXN0KGRpc3BsYXkpICYmIHRhcmdldCAhPT0gdGhpcy5fbW9yZUxheWVyQWN0aXZlQnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5xdWVyeVNlbGVjdG9yKCcuJyArIGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9yZUxheWVyQWN0aXZlQnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC5lbGVtZW50LnRvb2xiYXIucXVlcnlTZWxlY3RvcignLicgKyB0aGlzLl9tb3JlTGF5ZXJBY3RpdmVCdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKSkpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHRoaXMuX21vcmVMYXllckFjdGl2ZUJ1dHRvbiwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3JlTGF5ZXJBY3RpdmVCdXR0b24gPSB0YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuX3Nob3dUb29sYmFyQmFsbG9vbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5fc2hvd1Rvb2xiYXJJbmxpbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvc3VibWVudS8udGVzdChkaXNwbGF5KSAmJiAodGhpcy5fbWVudVRyYXlbY29tbWFuZF0gPT09IG51bGwgfHwgdGFyZ2V0ICE9PSB0aGlzLnN1Ym1lbnVBY3RpdmVCdXR0b24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsUGx1Z2luKGNvbW1hbmQsIHRoaXMuc3VibWVudU9uLmJpbmQodGhpcywgdGFyZ2V0KSwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9kaWFsb2cvLnRlc3QoZGlzcGxheSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxQbHVnaW4oY29tbWFuZCwgdGhpcy5wbHVnaW5zW2NvbW1hbmRdLm9wZW4uYmluZCh0aGlzKSwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9jb21tYW5kLy50ZXN0KGRpc3BsYXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsUGx1Z2luKGNvbW1hbmQsIHRoaXMucGx1Z2luc1tjb21tYW5kXS5hY3Rpb24uYmluZCh0aGlzKSwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoL2NvbnRhaW5lci8udGVzdChkaXNwbGF5KSAmJiAodGhpcy5fbWVudVRyYXlbY29tbWFuZF0gPT09IG51bGwgfHwgdGFyZ2V0ICE9PSB0aGlzLmNvbnRhaW5lckFjdGl2ZUJ1dHRvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxQbHVnaW4oY29tbWFuZCwgdGhpcy5jb250YWluZXJPbi5iaW5kKHRoaXMsIHRhcmdldCksIHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvZmlsZUJyb3dzZXIvLnRlc3QoZGlzcGxheSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxQbHVnaW4oY29tbWFuZCwgdGhpcy5wbHVnaW5zW2NvbW1hbmRdLm9wZW4uYmluZCh0aGlzLCBudWxsKSwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSAvLyBkZWZhdWx0IGNvbW1hbmRcclxuICAgICAgICAgICAgZWxzZSBpZiAoY29tbWFuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kSGFuZGxlcih0YXJnZXQsIGNvbW1hbmQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoL21vcmUvaS50ZXN0KGRpc3BsYXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnF1ZXJ5U2VsZWN0b3IoJy4nICsgdGhpcy5fbW9yZUxheWVyQWN0aXZlQnV0dG9uLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9tb3JlTGF5ZXJBY3RpdmVCdXR0b24sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vcmVMYXllckFjdGl2ZUJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuX3Nob3dUb29sYmFyQmFsbG9vbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9zdWJtZW51Ly50ZXN0KGRpc3BsYXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghL2NvbW1hbmQvLnRlc3QoZGlzcGxheSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXJPZmYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGNvbW1hbmQgb2YgY29tbWFuZCBidXR0b24oQWxsIEJ1dHRvbnMgZXhjZXB0IHN1Ym1lbnUgYW5kIGRpYWxvZylcclxuICAgICAgICAgKiAoc2VsZWN0QWxsLCBjb2RlVmlldywgZnVsbFNjcmVlbiwgaW5kZW50LCBvdXRkZW50LCB1bmRvLCByZWRvLCByZW1vdmVGb3JtYXQsIHByaW50LCBwcmV2aWV3LCBzaG93QmxvY2tzLCBzYXZlLCBib2xkLCB1bmRlcmxpbmUsIGl0YWxpYywgc3RyaWtlLCBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0LCBjb3B5LCBjdXQsIHBhc3RlKVxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSB0YXJnZXQgVGhlIGVsZW1lbnQgb2YgY29tbWFuZCBidXR0b25cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbWFuZCBQcm9wZXJ0eSBvZiBjb21tYW5kIGJ1dHRvbiAoZGF0YS12YWx1ZSlcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb21tYW5kSGFuZGxlcjogZnVuY3Rpb24gKHRhcmdldCwgY29tbWFuZCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvcHknOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnY3V0JzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncGFzdGUnOlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0QWxsJzpcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3eXNpd3lnID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWc7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQod3lzaXd5Zy5maXJzdENoaWxkLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCB8fCBjdXJyZW50Lm5vZGVUeXBlID09PSAzOyB9LCBmYWxzZSkgfHwgd3lzaXd5Zy5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQod3lzaXd5Zy5sYXN0Q2hpbGQsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwIHx8IGN1cnJlbnQubm9kZVR5cGUgPT09IDM7IH0sIHRydWUpIHx8IHd5c2l3eWcubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc01lZGlhKGZpcnN0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5nZXRGaWxlQ29tcG9uZW50KGZpcnN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JSJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuYXBwZW5kQ2hpbGQoYnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGluZm8gPyBpbmZvLmNvbXBvbmVudCA6IGZpcnN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmb3JtYXQsIGZpcnN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBicjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNNZWRpYShsYXN0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiciA9IHV0aWwuY3JlYXRlRWxlbWVudCgnQlInKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gdXRpbC5jcmVhdGVFbGVtZW50KG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5hcHBlbmRDaGlsZChicik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHd5c2l3eWcuYXBwZW5kQ2hpbGQoZm9ybWF0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGJyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGZpcnN0LCAwLCBsYXN0LCBsYXN0LnRleHRDb250ZW50Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlVmlldyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVDb2RlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZnVsbFNjcmVlbic6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVGdWxsU2NyZWVuKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdpbmRlbnQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnb3V0ZGVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQoY29tbWFuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRvJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkudW5kbygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncmVkbyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlZG8oKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZvcm1hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdwcmludCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncHJldmlldyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzaG93QmxvY2tzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZURpc3BsYXlCbG9ja3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3NhdmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jYWxsQmFja1NhdmUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsQmFja1NhdmUodGhpcy5nZXRDb250ZW50cyhmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZ1bmN0aW9ucy5zYXZlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5zYXZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuY29yZS5jb21tYW5kSGFuZGxlci5mYWlsXSBQbGVhc2UgcmVnaXN0ZXIgY2FsbCBiYWNrIGZ1bmN0aW9uIGluIGNyZWF0aW9uIG9wdGlvbi4gKGNhbGxCYWNrU2F2ZSA6IEZ1bmN0aW9uKScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudG9vbC5zYXZlKSBjb250ZXh0LnRvb2wuc2F2ZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDogLy8gJ1NUUk9ORycsICdVJywgJ0VNJywgJ0RFTCcsICdTVUInLCAnU1VQJy4uXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHRoaXMuX2RlZmF1bHRDb21tYW5kW2NvbW1hbmQudG9Mb3dlckNhc2UoKV0gfHwgY29tbWFuZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29tbWFuZE1hcFtjb21tYW5kXSkgdGhpcy5jb21tYW5kTWFwW2NvbW1hbmRdID0gdGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc01hcCA9IHRoaXMuX3ZhcmlhYmxlLmN1cnJlbnROb2Rlc01hcDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbWQgPSBub2Rlc01hcC5pbmRleE9mKGNvbW1hbmQpID4gLTEgPyBudWxsIDogdXRpbC5jcmVhdGVFbGVtZW50KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gY29tbWFuZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eU1VCJC9pLnRlc3QoY29tbWFuZCkgJiYgbm9kZXNNYXAuaW5kZXhPZignU1VQJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlID0gJ1NVUCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXlNVUCQvaS50ZXN0KGNvbW1hbmQpICYmIG5vZGVzTWFwLmluZGV4T2YoJ1NVQicpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZSA9ICdTVUInO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKGNtZCwgbnVsbCwgW3JlbW92ZU5vZGVdLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBmb3JtYXQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlbW92ZUZvcm1hdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgaW5kZW50YXRpb24gdG8gc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogU2V0dGVkIFwibWFyZ2luLWxlZnRcIiB0byBcIjI1cHhcIiBpbiB0aGUgdG9wIFwiUFwiIHRhZyBvZiB0aGUgcGFyYW1ldGVyIG5vZGUuXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgU2VwYXJhdG9yIChcImluZGVudFwiIG9yIFwib3V0ZGVudFwiKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluZGVudDogZnVuY3Rpb24gKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlTGluZXMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMobnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gJ2luZGVudCcgIT09IGNvbW1hbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbkRpciA9IG9wdGlvbnMucnRsID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcclxuICAgICAgICAgICAgbGV0IHNjID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGxldCBlYyA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgbGV0IHNvID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxldCBlbyA9IHJhbmdlLmVuZE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByYW5nZUxpbmVzLmxlbmd0aCwgZiwgbWFyZ2luOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGYgPSByYW5nZUxpbmVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0xpc3RDZWxsKGYpIHx8ICF0aGlzLnBsdWdpbnMubGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IC9cXGQrLy50ZXN0KGYuc3R5bGVbbWFyZ2luRGlyXSkgPyB1dGlsLmdldE51bWJlcihmLnN0eWxlW21hcmdpbkRpcl0sIDApIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luIC09IDI1O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiArPSAyNTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5zZXRTdHlsZShmLCBtYXJnaW5EaXIsIChtYXJnaW4gPD0gMCA/ICcnIDogbWFyZ2luICsgJ3B4JykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgfHwgZi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBsaXN0IGNlbGxzXHJcbiAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGlzdC5lZGl0SW5zaWRlTGlzdC5jYWxsKHRoaXMsIHNoaWZ0LCBjZWxscyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xyXG5cclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBvciByZW1vdmUgdGhlIGNsYXNzIG5hbWUgb2YgXCJib2R5XCIgc28gdGhhdCB0aGUgY29kZSBibG9jayBpcyB2aXNpYmxlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlRGlzcGxheUJsb2NrczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCB3eXNpd3lnID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWc7XHJcbiAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3Mod3lzaXd5ZywgJ3NlLXNob3ctYmxvY2snKTtcclxuICAgICAgICAgICAgaWYgKHV0aWwuaGFzQ2xhc3Mod3lzaXd5ZywgJ3NlLXNob3ctYmxvY2snKSkge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyh0aGlzLl9zdHlsZUNvbW1hbmRNYXAuc2hvd0Jsb2NrcywgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9zdHlsZUNvbW1hbmRNYXAuc2hvd0Jsb2NrcywgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlc1N0YXRlQ2hhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZXMgdG8gY29kZSB2aWV3IG9yIHd5c2l3eWcgdmlld1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUNvZGVWaWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQ29kZVZpZXcgPSB0aGlzLl92YXJpYWJsZS5pc0NvZGVWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIHV0aWwuc2V0RGlzYWJsZWRCdXR0b25zKCFpc0NvZGVWaWV3LCB0aGlzLmNvZGVWaWV3RGlzYWJsZWRCdXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0NvZGVWaWV3KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb2RlRGF0YVRvRWRpdG9yKCk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fY29kZU9yaWdpbkNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fY29kZU9yaWdpbkNzc1RleHQucmVwbGFjZSgvKFxccz9kaXNwbGF5KFxccyspPzooXFxzKyk/KVthLXpBLVpdKyg/PTspLywgJ2Rpc3BsYXk6IG5vbmUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dC5yZXBsYWNlKC8oXFxzP2Rpc3BsYXkoXFxzKyk/OihcXHMrKT8pW2EtekEtWl0rKD89OykvLCAnZGlzcGxheTogYmxvY2snKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyAmJiAhb3B0aW9ucy5jb2RlTWlycm9yRWRpdG9yKSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuaXNDb2RlVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdEhpZGVUb29sYmFyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9iYWxsb29ufGJhbGxvb24tYWx3YXlzL2kudGVzdChvcHRpb25zLm1vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0lubGluZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0JhbGxvb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3ModGhpcy5fc3R5bGVDb21tYW5kTWFwLmNvZGVWaWV3LCAnYWN0aXZlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RWRpdG9yRGF0YVRvQ29kZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9jb2RlT3JpZ2luQ3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl9jb2RlT3JpZ2luQ3NzVGV4dC5yZXBsYWNlKC8oXFxzP2Rpc3BsYXkoXFxzKyk/OihcXHMrKT8pW2EtekEtWl0rKD89OykvLCAnZGlzcGxheTogYmxvY2snKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl93eXNpd3lnT3JpZ2luQ3NzVGV4dC5yZXBsYWNlKC8oXFxzP2Rpc3BsYXkoXFxzKyk/OihcXHMrKT8pW2EtekEtWl0rKD89OykvLCAnZGlzcGxheTogbm9uZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nICYmICFvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IpIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnNjcm9sbEhlaWdodCA+IDAgPyAoY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ICsgJ3B4JykgOiAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb2RlTWlycm9yRWRpdG9yKSBvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5pc0NvZGVWaWV3ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdEhpZGVUb29sYmFyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0lubGluZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQmFsbG9vbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5fc2hvd1Rvb2xiYXJJbmxpbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyh0aGlzLl9zdHlsZUNvbW1hbmRNYXAuY29kZVZpZXcsICdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tQbGFjZWhvbGRlcigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbnMudG9nZ2xlQ29kZVZpZXcgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy50b2dnbGVDb2RlVmlldyh0aGlzLl92YXJpYWJsZS5pc0NvZGVWaWV3LCB0aGlzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ29udmVydCB0aGUgZGF0YSBvZiB0aGUgY29kZSB2aWV3IGFuZCBwdXQgaXQgaW4gdGhlIFdZU0lXWUcgYXJlYS5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9zZXRDb2RlRGF0YVRvRWRpdG9yOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvZGVfaHRtbCA9IHRoaXMuX2dldENvZGVWaWV3KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VEb2N1bWVudCA9IHRoaXMuX3BhcnNlci5wYXJzZUZyb21TdHJpbmcoY29kZV9odG1sLCAndGV4dC9odG1sJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkQ2hpbGRyZW4gPSBwYXJzZURvY3VtZW50LmhlYWQuY2hpbGRyZW47XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGhlYWRDaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXnNjcmlwdCQvaS50ZXN0KGhlYWRDaGlsZHJlbltpXS50YWdOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoaGVhZENoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS0tLCBsZW4tLTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2QuaGVhZC5pbm5lckhUTUwgPSBwYXJzZURvY3VtZW50LmhlYWQuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2QuYm9keS5pbm5lckhUTUwgPSB0aGlzLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihwYXJzZURvY3VtZW50LmJvZHkuaW5uZXJIVE1MKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IHBhcnNlRG9jdW1lbnQuYm9keS5hdHRyaWJ1dGVzO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2ldLm5hbWUgPT09ICdjb250ZW50ZWRpdGFibGUnKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl93ZC5ib2R5LnNldEF0dHJpYnV0ZShhdHRyc1tpXS5uYW1lLCBhdHRyc1tpXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzQ2xhc3ModGhpcy5fd2QuYm9keSwgJ3N1bi1lZGl0b3ItZWRpdGFibGUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlQ2xhc3NlcyA9IG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3Muc3BsaXQoJyAnKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVkaXRhYmxlQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKHRoaXMuX3dkLmJvZHksIG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCA9IGNvZGVfaHRtbC5sZW5ndGggPiAwID8gdGhpcy5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29kZV9odG1sKSA6ICc8JyArIG9wdGlvbnMuZGVmYXVsdFRhZyArICc+PGJyPjwvJyArIG9wdGlvbnMuZGVmYXVsdFRhZyArICc+JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0IHRoZSBkYXRhIG9mIHRoZSBXWVNJV1lHIGFyZWEgYW5kIHB1dCBpdCBpbiB0aGUgY29kZSB2aWV3IGFyZWEuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0RWRpdG9yRGF0YVRvQ29kZVZpZXc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgY29kZUNvbnRlbnRzID0gdGhpcy5jb252ZXJ0SFRNTEZvckNvZGVWaWV3KGNvbnRleHQuZWxlbWVudC53eXNpd3lnKTtcclxuICAgICAgICAgICAgbGV0IGNvZGVWYWx1ZSA9ICcnO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnVsbFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gdXRpbC5nZXRBdHRyaWJ1dGVzVG9TdHJpbmcodGhpcy5fd2QuYm9keSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBjb2RlVmFsdWUgPSAnPCFET0NUWVBFIGh0bWw+XFxuPGh0bWw+XFxuJyArIHRoaXMuX3dkLmhlYWQub3V0ZXJIVE1MLnJlcGxhY2UoLz4oPyFcXG4pL2csICc+XFxuJykgKyAnPGJvZHkgJyArIGF0dHJzICsgJz5cXG4nICsgY29kZUNvbnRlbnRzICsgJzwvYm9keT5cXG48L2h0bWw+JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvZGVWYWx1ZSA9IGNvZGVDb250ZW50cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NldENvZGVWaWV3KGNvZGVWYWx1ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZXMgdG8gZnVsbCBzY3JlZW4gb3IgZGVmYXVsdCBzY3JlZW5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgZnVsbCBzY3JlZW4gYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlRnVsbFNjcmVlbjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9wQXJlYSA9IGNvbnRleHQuZWxlbWVudC50b3BBcmVhO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvckFyZWEgPSBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYTtcclxuICAgICAgICAgICAgY29uc3Qgd3lzaXd5Z0ZyYW1lID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZTtcclxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGNvbnRleHQuZWxlbWVudC5jb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBfdmFyID0gdGhpcy5fdmFyaWFibGU7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghX3Zhci5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIF92YXIuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgX3Zhci5fZnVsbFNjcmVlbkF0dHJzLmlubGluZSA9IHRoaXMuX2lzSW5saW5lO1xyXG4gICAgICAgICAgICAgICAgX3Zhci5fZnVsbFNjcmVlbkF0dHJzLmJhbGxvb24gPSB0aGlzLl9pc0JhbGxvb247XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5saW5lIHx8IHRoaXMuX2lzQmFsbG9vbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5saW5lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNCYWxsb29uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMudG9vbGJhckNvbnRhaW5lcikgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmluc2VydEJlZm9yZSh0b29sYmFyLCBlZGl0b3JBcmVhKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b3BBcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIHRvcEFyZWEuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgdG9wQXJlYS5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgdG9wQXJlYS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRvcEFyZWEuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICB0b3BBcmVhLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRvcEFyZWEuc3R5bGUuekluZGV4ID0gJzIxNDc0ODM2NDcnO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgIT09ICgnbm9uZScgJiYgJycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3Zhci5fZnVsbFNjcmVlbkF0dHJzLnN0aWNreSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3ModG9vbGJhciwgJ3NlLXRvb2xiYXItc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgX3Zhci5fYm9keU92ZXJmbG93ID0gX2QuYm9keS5zdHlsZS5vdmVyZmxvdztcclxuICAgICAgICAgICAgICAgIF9kLmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuXHJcbiAgICAgICAgICAgICAgICBfdmFyLl9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dCA9IGVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIF92YXIuX3d5c2l3eWdPcmlnaW5Dc3NUZXh0ID0gd3lzaXd5Z0ZyYW1lLnN0eWxlLmNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBfdmFyLl9jb2RlT3JpZ2luQ3NzVGV4dCA9IGNvZGUuc3R5bGUuY3NzVGV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICBlZGl0b3JBcmVhLnN0eWxlLmNzc1RleHQgPSB0b29sYmFyLnN0eWxlLmNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgIHd5c2l3eWdGcmFtZS5zdHlsZS5jc3NUZXh0ID0gKHd5c2l3eWdGcmFtZS5zdHlsZS5jc3NUZXh0Lm1hdGNoKC9cXHM/ZGlzcGxheShcXHMrKT86KFxccyspP1thLXpBLVpdKzsvKSB8fCBbJyddKVswXTtcclxuICAgICAgICAgICAgICAgIGNvZGUuc3R5bGUuY3NzVGV4dCA9IChjb2RlLnN0eWxlLmNzc1RleHQubWF0Y2goL1xccz9kaXNwbGF5KFxccyspPzooXFxzKyk/W2EtekEtWl0rOy8pIHx8IFsnJ10pWzBdO1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS53aWR0aCA9IHd5c2l3eWdGcmFtZS5zdHlsZS5oZWlnaHQgPSBjb2RlLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHJcbiAgICAgICAgICAgICAgICBfdmFyLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gPSAoX3cuaW5uZXJIZWlnaHQgLSB0b29sYmFyLm9mZnNldEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IChfdmFyLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gLSBvcHRpb25zLmZ1bGxTY3JlZW5PZmZzZXQpICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZUVsZW1lbnQoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgaWNvbnMucmVkdWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pZnJhbWUgJiYgb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvckFyZWEuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faWZyYW1lQXV0b0hlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLm1hcmdpblRvcCA9IG9wdGlvbnMuZnVsbFNjcmVlbk9mZnNldCArICdweCc7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKHRoaXMuX3N0eWxlQ29tbWFuZE1hcC5mdWxsU2NyZWVuLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdmFyLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHd5c2l3eWdGcmFtZS5zdHlsZS5jc3NUZXh0ID0gX3Zhci5fd3lzaXd5Z09yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBjb2RlLnN0eWxlLmNzc1RleHQgPSBfdmFyLl9jb2RlT3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yQXJlYS5zdHlsZS5jc3NUZXh0ID0gX3Zhci5fZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICB0b3BBcmVhLnN0eWxlLmNzc1RleHQgPSBfdmFyLl9vcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgX2QuYm9keS5zdHlsZS5vdmVyZmxvdyA9IF92YXIuX2JvZHlPdmVyZmxvdztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISFvcHRpb25zLnRvb2xiYXJDb250YWluZXIpIG9wdGlvbnMudG9vbGJhckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b29sYmFyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGlja3lUb29sYmFyID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHRvb2xiYXIsICdzZS10b29sYmFyLXN0aWNreScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChfdmFyLl9mdWxsU2NyZWVuQXR0cnMuc3RpY2t5ICYmICFvcHRpb25zLnRvb2xiYXJDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdmFyLl9mdWxsU2NyZWVuQXR0cnMuc3RpY2t5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKHRvb2xiYXIsIFwic2UtdG9vbGJhci1zdGlja3lcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbmxpbmUgPSBfdmFyLl9mdWxsU2NyZWVuQXR0cnMuaW5saW5lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNCYWxsb29uID0gX3Zhci5fZnVsbFNjcmVlbkF0dHJzLmJhbGxvb247XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbmxpbmUpIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhb3B0aW9ucy50b29sYmFyQ29udGFpbmVyKSB1dGlsLnJlbW92ZUNsYXNzKHRvb2xiYXIsICdzZS10b29sYmFyLWJhbGxvb24nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlRWxlbWVudChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCBpY29ucy5leHBhbnNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9zdHlsZUNvbW1hbmRNYXAuZnVsbFNjcmVlbiwgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9ucy50b2dnbGVGdWxsU2NyZWVuID09PSAnZnVuY3Rpb24nKSBmdW5jdGlvbnMudG9nZ2xlRnVsbFNjcmVlbih0aGlzLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4sIHRoaXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBQcmludHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGVkaXRvci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBwcmludDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0lGUkFNRScpO1xyXG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgX2QuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJpbnREb2N1bWVudCA9IHV0aWwuZ2V0SWZyYW1lRG9jdW1lbnQoaWZyYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudHNIVE1MID0gdGhpcy5nZXRDb250ZW50cyh0cnVlKTtcclxuICAgICAgICAgICAgY29uc3Qgd0RvYyA9IHRoaXMuX3dkO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJ0cyA9IG9wdGlvbnMuZnVsbFBhZ2UgPyB1dGlsLmdldEF0dHJpYnV0ZXNUb1N0cmluZyh3RG9jLmJvZHksIFsnY29udGVudGVkaXRhYmxlJ10pIDogJ2NsYXNzPVwiJyArIG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3MgKyAnXCInO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW50RG9jdW1lbnQud3JpdGUoJycgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8IURPQ1RZUEUgaHRtbD48aHRtbD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGhlYWQ+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgd0RvYy5oZWFkLmlubmVySFRNTCArXHJcbiAgICAgICAgICAgICAgICAgICAgJzwvaGVhZD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJvZHkgJyArIGFycnRzICsgJz4nICsgY29udGVudHNIVE1MICsgJzwvYm9keT4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9odG1sPidcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rcyA9IF9kLmhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IF9kLmhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N0eWxlJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGlua0hUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5rcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmtIVE1MICs9IGxpbmtzW2ldLm91dGVySFRNTDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5rSFRNTCArPSBzdHlsZXNbaV0ub3V0ZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByaW50RG9jdW1lbnQud3JpdGUoJycgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8IURPQ1RZUEUgaHRtbD48aHRtbD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGhlYWQ+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgbGlua0hUTUwgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2hlYWQ+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxib2R5IGNsYXNzPVwiJyArIG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3MgKyAnXCI+JyArIGNvbnRlbnRzSFRNTCArICc8L2JvZHk+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzwvaHRtbD4nXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJRSBvciBFZGdlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNJRV9FZGdlIHx8ICEhX2QuZG9jdW1lbnRNb2RlIHx8ICEhX3cuU3R5bGVNZWRpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3ByaW50JywgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wcmludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucHJpbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNvcmUucHJpbnQuZmFpbF0gZXJyb3I6ICcgKyBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuY2xvc2VMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGlmcmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIHRoZSBwcmV2aWV3IHdpbmRvdy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBwcmV2aWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvcmUuc3VibWVudU9mZigpO1xyXG4gICAgICAgICAgICBjb3JlLmNvbnRhaW5lck9mZigpO1xyXG4gICAgICAgICAgICBjb3JlLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50c0hUTUwgPSBvcHRpb25zLnByZXZpZXdUZW1wbGF0ZSA/IG9wdGlvbnMucHJldmlld1RlbXBsYXRlLnJlcGxhY2UoL1xce1xce1xccypjb250ZW50c1xccypcXH1cXH0vaSwgdGhpcy5nZXRDb250ZW50cyh0cnVlKSkgOiB0aGlzLmdldENvbnRlbnRzKHRydWUpO1xyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3dPYmplY3QgPSBfdy5vcGVuKCcnLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgIHdpbmRvd09iamVjdC5taW1lVHlwZSA9ICd0ZXh0L2h0bWwnO1xyXG4gICAgICAgICAgICBjb25zdCB3ID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZS5vZmZzZXRXaWR0aCArICdweCAhaW1wb3J0YW50JztcclxuICAgICAgICAgICAgY29uc3Qgd0RvYyA9IHRoaXMuX3dkO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJ0cyA9IG9wdGlvbnMuZnVsbFBhZ2UgPyB1dGlsLmdldEF0dHJpYnV0ZXNUb1N0cmluZyh3RG9jLmJvZHksIFsnY29udGVudGVkaXRhYmxlJ10pIDogJ2NsYXNzPVwiJyArIG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3MgKyAnXCInO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvd09iamVjdC5kb2N1bWVudC53cml0ZSgnJyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzwhRE9DVFlQRSBodG1sPjxodG1sPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8aGVhZD4nICtcclxuICAgICAgICAgICAgICAgICAgICB3RG9jLmhlYWQuaW5uZXJIVE1MICtcclxuICAgICAgICAgICAgICAgICAgICAnPHN0eWxlPmJvZHkge292ZXJmbG93OmF1dG8gIWltcG9ydGFudDsgbWFyZ2luOiAxMHB4IGF1dG8gIWltcG9ydGFudDsgaGVpZ2h0OmF1dG8gIWltcG9ydGFudDt9PC9zdHlsZT4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9oZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8Ym9keSAnICsgYXJydHMgKyAnPicgKyBjb250ZW50c0hUTUwgKyAnPC9ib2R5PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2h0bWw+J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtzID0gX2QuaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGluaycpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gX2QuaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3R5bGUnKTtcclxuICAgICAgICAgICAgICAgIGxldCBsaW5rSFRNTCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpbmtzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlua0hUTUwgKz0gbGlua3NbaV0ub3V0ZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0eWxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmtIVE1MICs9IHN0eWxlc1tpXS5vdXRlckhUTUw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHdpbmRvd09iamVjdC5kb2N1bWVudC53cml0ZSgnJyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzwhRE9DVFlQRSBodG1sPjxodG1sPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8aGVhZD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzx0aXRsZT4nICsgbGFuZy50b29sYmFyLnByZXZpZXcgKyAnPC90aXRsZT4nICtcclxuICAgICAgICAgICAgICAgICAgICBsaW5rSFRNTCArXHJcbiAgICAgICAgICAgICAgICAgICAgJzwvaGVhZD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJvZHkgY2xhc3M9XCInICsgb3B0aW9ucy5fZWRpdGFibGVDbGFzcyArICdcIiBzdHlsZT1cIm1hcmdpbjoxMHB4IGF1dG8gIWltcG9ydGFudDsgaGVpZ2h0OmF1dG8gIWltcG9ydGFudDtcIj4nICsgY29udGVudHNIVE1MICsgJzwvYm9keT4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9odG1sPidcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgSFRNTCBzdHJpbmdcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3x1bmRlZmluZWR9IGh0bWwgSFRNTCBzdHJpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRDb250ZW50czogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVSYW5nZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgY29udmVydFZhbHVlID0gKGh0bWwgPT09IG51bGwgfHwgaHRtbCA9PT0gdW5kZWZpbmVkKSA/ICcnIDogdGhpcy5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoaHRtbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0Q29tcG9uZW50cygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92YXJpYWJsZS5pc0NvZGVWaWV3KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgPSBjb252ZXJ0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydEhUTUxGb3JDb2RlVmlldyhjb252ZXJ0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29kZVZpZXcodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBpZnJhbWUncyBoZWFkIHRhZyBhbmQgYm9keSB0YWcgd2hlbiB1c2luZyB0aGUgXCJpZnJhbWVcIiBvciBcImZ1bGxQYWdlXCIgb3B0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjdHggeyBoZWFkOiBIVE1MIHN0cmluZywgYm9keTogSFRNTCBzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0SWZyYW1lQ29udGVudHM6IGZ1bmN0aW9uIChjdHgpIHtcclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlmcmFtZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3R4LmhlYWQpIHRoaXMuX3dkLmhlYWQuaW5uZXJIVE1MID0gY3R4LmhlYWQucmVwbGFjZSgvPHNjcmlwdFtcXHNcXFNdKj5bXFxzXFxTXSo8XFwvc2NyaXB0Pi9naSwgJycpO1xyXG4gICAgICAgICAgICBpZiAoY3R4LmJvZHkpIHRoaXMuX3dkLmJvZHkuaW5uZXJIVE1MID0gdGhpcy5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY3R4LmJvZHkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGNvbnRlbnRzXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBvbmx5Q29udGVudHMgUmV0dXJuIG9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBib2R5IHdpdGhvdXQgaGVhZGVycyB3aGVuIHRoZSBcImZ1bGxQYWdlXCIgb3B0aW9uIGlzIHRydWVcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENvbnRlbnRzOiBmdW5jdGlvbiAob25seUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXJIVE1MID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgcmVuZGVySFRNTC5pbm5lckhUTUwgPSBjb250ZW50cztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZ2NhcHRpb25zID0gdXRpbC5nZXRMaXN0Q2hpbGRyZW4ocmVuZGVySFRNTCwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAvRklHQ0FQVElPTi9pLnRlc3QoY3VycmVudC5ub2RlTmFtZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpZ2NhcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmaWdjYXB0aW9uc1tpXS5yZW1vdmVBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSAmJiAhb25seUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IHV0aWwuZ2V0QXR0cmlidXRlc1RvU3RyaW5nKHRoaXMuX3dkLmJvZHksIFsnY29udGVudGVkaXRhYmxlJ10pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD48aHRtbD4nICsgdGhpcy5fd2QuaGVhZC5vdXRlckhUTUwgKyAnPGJvZHkgJyArIGF0dHJzICsgJz4nICsgcmVuZGVySFRNTC5pbm5lckhUTUwgKyAnPC9ib2R5PjwvaHRtbD4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlckhUTUwuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgSFRNTCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRhZyB0eXBlIGFuZCBjb25maWd1cmF0aW9uLlxyXG4gICAgICAgICAqIFVzZSBvbmx5IFwiY2xlYW5IVE1MXCJcclxuICAgICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZVxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVxdWlyZUZvcm1hdCBJZiB0cnVlLCB0ZXh0IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYSBmb3JtYXQgbm9kZSBpcyB3cmFwcGVkIHdpdGggdGhlIGZvcm1hdCB0YWcuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbWFrZUxpbmU6IGZ1bmN0aW9uIChub2RlLCByZXF1aXJlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUYWcgPSBvcHRpb25zLmRlZmF1bHRUYWc7XHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLl9kaXNhbGxvd2VkVGFncyhub2RlKSkgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlRm9ybWF0IHx8ICh1dGlsLmlzRm9ybWF0RWxlbWVudChub2RlKSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KG5vZGUpIHx8IHV0aWwuaXNDb21wb25lbnQobm9kZSkgfHwgdXRpbC5pc01lZGlhKG5vZGUpIHx8ICh1dGlsLmlzQW5jaG9yKG5vZGUpICYmIHV0aWwuaXNNZWRpYShub2RlLmZpcnN0RWxlbWVudENoaWxkKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUub3V0ZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzwnICsgZGVmYXVsdFRhZyArICc+JyArIG5vZGUub3V0ZXJIVE1MICsgJzwvJyArIGRlZmF1bHRUYWcgKyAnPic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gdGV4dFxyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlRm9ybWF0KSByZXR1cm4gbm9kZS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRBcnJheSA9IG5vZGUudGV4dENvbnRlbnQuc3BsaXQoL1xcbi9nKTtcclxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gJyc7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgdExlbiA9IHRleHRBcnJheS5sZW5ndGgsIHRleHQ7IGkgPCB0TGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dEFycmF5W2ldLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiAwKSBodG1sICs9ICc8JyArIGRlZmF1bHRUYWcgKyAnPicgKyB0ZXh0ICsgJzwvJyArIGRlZmF1bHRUYWcgKyAnPic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjb21tZW50c1xyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAmJiB0aGlzLl9hbGxvd0hUTUxDb21tZW50cykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICc8IS0tJyArIG5vZGUudGV4dENvbnRlbnQudHJpbSgpICsgJy0tPic7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhdHRyaWJ1dGUgdmFsdWVzIHN1Y2ggYXMgc3R5bGUgYW5kIGNvbnZlcnRzIHRhZ3MgdGhhdCBkbyBub3QgY29uZm9ybSB0byB0aGUgXCJodG1sNVwiIHN0YW5kYXJkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEhUTUwgc3RyaW5nXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfdGFnQ29udmVydG9yOiBmdW5jdGlvbiAodGV4dCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc2FsbG93ZWRUZXh0VGFnc1JlZ0V4cCkgcmV0dXJuIHRleHQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlYyA9IG9wdGlvbnMuX3RleHRUYWdzTWFwO1xyXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHRoaXMuX2Rpc2FsbG93ZWRUZXh0VGFnc1JlZ0V4cCwgZnVuY3Rpb24gKG0sIHQsIG4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgKHR5cGVvZiBlY1tuXSA9PT0gJ3N0cmluZycgPyBlY1tuXSA6IG4pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlIGRpc2FsbG93ZWQgdGFnc1xyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIEhUTUwgc3RyaW5nXHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9kZWxldGVEaXNhbGxvd2VkVGFnczogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGh0bWxcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJycpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPChzY3JpcHR8c3R5bGUpW1xcc1xcU10qPltcXHNcXFNdKjxcXC8oc2NyaXB0fHN0eWxlKT4vZ2ksICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxbYS16MC05XStcXDpbYS16MC05XStbXj5eXFwvXSo+W14+XSo8XFwvW2EtejAtOV0rXFw6W2EtejAtOV0rPi9naSwgJycpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSh0aGlzLmVkaXRvclRhZ3NXaGl0ZWxpc3RSZWdFeHAsICcnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY2xlYW4gSFRNTCBjb2RlIGZvciBlZGl0b3JcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCBIVE1MIHN0cmluZ1xyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cHxudWxsfSB3aGl0ZWxpc3QgUmVndWxhciBleHByZXNzaW9uIG9mIGFsbG93ZWQgdGFncy5cclxuICAgICAgICAgKiBSZWdFeHAgb2JqZWN0IGlzIGNyZWF0ZSBieSB1dGlsLmNyZWF0ZVRhZ3NXaGl0ZWxpc3QgbWV0aG9kLiAoY29yZS5wYXN0ZVRhZ3NXaGl0ZWxpc3RSZWdFeHApXHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbGVhbkhUTUw6IGZ1bmN0aW9uIChodG1sLCB3aGl0ZWxpc3QpIHtcclxuICAgICAgICAgICAgaHRtbCA9IHRoaXMuX2RlbGV0ZURpc2FsbG93ZWRUYWdzKGh0bWwpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKDxbYS16QS1aMC05XSspW14+XSooPz0+KS9nLCBmdW5jdGlvbiAobSwgdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXjxbYS16MC05XStcXDpbYS16MC05XSsvaS50ZXN0KG0pKSByZXR1cm4gbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBdHRyID0gdGhpcy5fYXR0cmlidXRlc1RhZ3NXaGl0ZWxpc3RbdC5tYXRjaCgvKD8hPClbYS16QS1aMC05XSsvKVswXS50b0xvd2VyQ2FzZSgpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodEF0dHIpIHYgPSBtLm1hdGNoKHRBdHRyKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHYgPSBtLm1hdGNoKHRoaXMuX2F0dHJpYnV0ZXNXaGl0ZWxpc3RSZWdFeHApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoLzxzcGFuL2kudGVzdCh0KSAmJiAoIXYgfHwgIS9zdHlsZT0vaS50ZXN0KHYudG9TdHJpbmcoKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHYzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCF2IHx8ICEvc3R5bGU9L2kudGVzdCh2LnRvU3RyaW5nKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gbS5tYXRjaCgvc3R5bGVcXHMqPVxccypcIlteXCJdKlwiLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB2ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnB1c2goc3ZbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoLzxhXFxiL2kudGVzdCh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdiA9IG0ubWF0Y2goL2lkXFxzKj1cXHMqXCJbXlwiXSpcIi8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3YpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdikgdiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5wdXNoKHN2WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXmNsYXNzPVwiKD8hKF9fc2VfX3xzZS18a2F0ZXgpKS8udGVzdCh2W2ldKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9ICcgJyArIHZbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRvbSA9IF9kLmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5fY29uc2lzdGVuY3lDaGVja09mSFRNTChkb20sIHRoaXMuX2h0bWxDaGVja1doaXRlbGlzdFJlZ0V4cCwgb3B0aW9ucy5hbGxvd1N0eWxlcyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTVU5FRElUT1IuY2xlYW5IVE1MLmNvbnNpc3RlbmN5Q2hlY2suZmFpbF0gJyArIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFuYWdlZFRhZ3NJbmZvICYmIHRoaXMubWFuYWdlZFRhZ3NJbmZvLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Q29tcExpc3QgPSBkb20ucXVlcnlTZWxlY3RvckFsbCh0aGlzLm1hbmFnZWRUYWdzSW5mby5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGV4dENvbXBMaXN0Lmxlbmd0aCwgaW5pdE1ldGhvZCwgY2xhc3NMaXN0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QgPSBbXS5zbGljZS5jYWxsKHRleHRDb21wTGlzdFtpXS5jbGFzc0xpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gY2xhc3NMaXN0Lmxlbmd0aDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0TWV0aG9kID0gdGhpcy5tYW5hZ2VkVGFnc0luZm8ubWFwW2NsYXNzTGlzdFtjXV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0TWV0aG9kKHRleHRDb21wTGlzdFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZG9tVHJlZSA9IGRvbS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICBsZXQgY2xlYW5IVE1MID0gJyc7XHJcbiAgICAgICAgICAgIGxldCByZXF1aXJlRm9ybWF0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZG9tVHJlZS5sZW5ndGgsIHQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdCA9IGRvbVRyZWVbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAodC5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc1RleHRTdHlsZUVsZW1lbnQodCkgJiYgIXV0aWwuaXNCcmVhayh0KSAmJiAhdXRpbC5fZGlzYWxsb3dlZFRhZ3ModCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlRm9ybWF0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGRvbVRyZWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNsZWFuSFRNTCArPSB0aGlzLl9tYWtlTGluZShkb21UcmVlW2ldLCByZXF1aXJlRm9ybWF0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2xlYW5IVE1MID0gdXRpbC5odG1sUmVtb3ZlV2hpdGVTcGFjZShjbGVhbkhUTUwpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFnQ29udmVydG9yKCFjbGVhbkhUTUwgPyBodG1sIDogIXdoaXRlbGlzdCA/IGNsZWFuSFRNTCA6IGNsZWFuSFRNTC5yZXBsYWNlKHR5cGVvZiB3aGl0ZWxpc3QgPT09ICdzdHJpbmcnID8gdXRpbC5jcmVhdGVUYWdzV2hpdGVsaXN0KHdoaXRlbGlzdCkgOiB3aGl0ZWxpc3QsICcnKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGNvbnRlbnRzIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGxhY2VkIGluIGFuIGVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBjb250ZW50c1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udmVydENvbnRlbnRzRm9yRWRpdG9yOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICAgICAgY29udGVudHMgPSB0aGlzLl9kZWxldGVEaXNhbGxvd2VkVGFncyhjb250ZW50cylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oPFthLXpBLVowLTldKylbXj5dKig/PT4pL2csIGZ1bmN0aW9uIChtLCB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9ePFthLXowLTldK1xcOlthLXowLTldKy9pLnRlc3QobSkpIHJldHVybiBtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdEF0dHIgPSB0aGlzLl9hdHRyaWJ1dGVzVGFnc1doaXRlbGlzdFt0Lm1hdGNoKC8oPyE8KVthLXpBLVowLTldKy8pWzBdLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0QXR0cikgdiA9IG0ubWF0Y2godEF0dHIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdiA9IG0ubWF0Y2godGhpcy5fYXR0cmlidXRlc1doaXRlbGlzdFJlZ0V4cCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvPHNwYW4vaS50ZXN0KHQpICYmICghdiB8fCAhL3N0eWxlPS9pLnRlc3Qodi50b1N0cmluZygpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBAdjNcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXYgfHwgIS9zdHlsZT0vaS50ZXN0KHYudG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3YgPSBtLm1hdGNoKC9zdHlsZVxccyo9XFxzKlwiW15cIl0qXCIvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHYgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYucHVzaChzdlswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvPGFcXGIvaS50ZXN0KHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gbS5tYXRjaCgvaWRcXHMqPVxccypcIlteXCJdKlwiLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSB2ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnB1c2goc3ZbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAnICcgKyB2W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkb20gPSBfZC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0aGlzLl9kZWxldGVEaXNhbGxvd2VkVGFncyhjb250ZW50cykpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHV0aWwuX2NvbnNpc3RlbmN5Q2hlY2tPZkhUTUwoZG9tLCB0aGlzLl9odG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAsIG9wdGlvbnMuYWxsb3dTdHlsZXMpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbU1VORURJVE9SLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvci5jb25zaXN0ZW5jeUNoZWNrLmZhaWxdICcgKyBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbmFnZWRUYWdzSW5mbyAmJiB0aGlzLm1hbmFnZWRUYWdzSW5mby5xdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbXBMaXN0ID0gZG9tLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5tYW5hZ2VkVGFnc0luZm8ucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRleHRDb21wTGlzdC5sZW5ndGgsIGluaXRNZXRob2QsIGNsYXNzTGlzdDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0ID0gW10uc2xpY2UuY2FsbCh0ZXh0Q29tcExpc3RbaV0uY2xhc3NMaXN0KTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNsYXNzTGlzdC5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE1ldGhvZCA9IHRoaXMubWFuYWdlZFRhZ3NJbmZvLm1hcFtjbGFzc0xpc3RbY11dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdE1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE1ldGhvZCh0ZXh0Q29tcExpc3RbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGRvbVRyZWUgPSBkb20uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgbGV0IGNsZWFuSFRNTCA9ICcnO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZG9tVHJlZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY2xlYW5IVE1MICs9IHRoaXMuX21ha2VMaW5lKGRvbVRyZWVbaV0sIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYW5IVE1MLmxlbmd0aCA9PT0gMCkgcmV0dXJuICc8JyArIG9wdGlvbnMuZGVmYXVsdFRhZyArICc+PGJyPjwvJyArIG9wdGlvbnMuZGVmYXVsdFRhZyArICc+JztcclxuXHJcbiAgICAgICAgICAgIGNsZWFuSFRNTCA9IHV0aWwuaHRtbFJlbW92ZVdoaXRlU3BhY2UoY2xlYW5IVE1MKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ0NvbnZlcnRvcihjbGVhbkhUTUwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB3eXNpd3lnIGFyZWEgZWxlbWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHBsYWNlZCBpbiBhbiBlZGl0b3Igb2YgY29kZSB2aWV3IG1vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBodG1sIFdZU0lXWUcgZWxlbWVudCAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcpIG9yIEhUTUwgc3RyaW5nLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29udmVydEhUTUxGb3JDb2RlVmlldzogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICAgICAgbGV0IHJldHVybkhUTUwgPSAnJztcclxuICAgICAgICAgICAgY29uc3Qgd1JlZ0V4cCA9IF93LlJlZ0V4cDtcclxuICAgICAgICAgICAgY29uc3QgYnJSZWcgPSBuZXcgd1JlZ0V4cCgnXihCTE9DS1FVT1RFfFBSRXxUQUJMRXxUSEVBRHxUQk9EWXxUUnxUSHxURHxPTHxVTHxJTUd8SUZSQU1FfFZJREVPfEFVRElPfEZJR1VSRXxGSUdDQVBUSU9OfEhSfEJSfENBTlZBU3xTRUxFQ1QpJCcsICdpJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybWF0RWxlbWVudCA9IHV0aWwuaXNGb3JtYXRFbGVtZW50LmJpbmQodXRpbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdEb2MgPSB0eXBlb2YgaHRtbCA9PT0gJ3N0cmluZycgPyBfZC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKSA6IGh0bWw7XHJcblxyXG4gICAgICAgICAgICBsZXQgaW5kZW50U2l6ZSA9IHRoaXMuX3ZhcmlhYmxlLmNvZGVJbmRlbnQgKiAxO1xyXG4gICAgICAgICAgICBpbmRlbnRTaXplID0gaW5kZW50U2l6ZSA+IDAgPyBuZXcgX3cuQXJyYXkoaW5kZW50U2l6ZSArIDEpLmpvaW4oJyAnKSA6ICcnO1xyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMgKGVsZW1lbnQsIGluZGVudCwgbGluZUJSKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSZWdUZXN0ID0gYnJSZWcudGVzdChlbGVtZW50Lm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJbmRlbnQgPSAoZWxlbWVudFJlZ1Rlc3QgPyBpbmRlbnQgOiAnJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aCwgbm9kZSwgYnIsIG5vZGVSZWdUZXN0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZVJlZ1Rlc3QgPSBiclJlZy50ZXN0KG5vZGUubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyID0gbm9kZVJlZ1Rlc3QgPyAnXFxuJyA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVCUiA9IGlzRm9ybWF0RWxlbWVudChub2RlKSAmJiAhZWxlbWVudFJlZ1Rlc3QgJiYgIS9eKFRIfFREKSQvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpID8gJ1xcbicgOiAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSFRNTCArPSAnXFxuPCEtLSAnICsgbm9kZS50ZXh0Q29udGVudC50cmltKCkgKyAnIC0tPicgKyBicjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkhUTUwgKz0gdXRpbC5fSFRNTENvbnZlcnRvcigoL15cXG4rJC8udGVzdChub2RlLmRhdGEpID8gJycgOiBub2RlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkhUTUwgKz0gKC9eSFIkL2kudGVzdChub2RlLm5vZGVOYW1lKSA/ICdcXG4nIDogJycpICsgZWxlbWVudEluZGVudCArIG5vZGUub3V0ZXJIVE1MICsgYnI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmlubmVySFRNTCA9IG5vZGUuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5IVE1MICs9IChsaW5lQlIgfHwgKGVsZW1lbnRSZWdUZXN0ID8gJycgOiBicikpICsgKGVsZW1lbnRJbmRlbnQgfHwgbm9kZVJlZ1Rlc3QgPyBpbmRlbnQgOiAnJykgKyBub2RlLm91dGVySFRNTC5tYXRjaCh3UmVnRXhwKCc8JyArIHRhZyArICdbXj5dKj4nLCAnaScpKVswXSArIGJyO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMobm9kZSwgaW5kZW50ICsgaW5kZW50U2l6ZSwgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybkhUTUwgKz0gKG5vZGVSZWdUZXN0ID8gaW5kZW50IDogJycpICsgJzwvJyArIHRhZyArICc+JyArIChsaW5lQlIgfHwgYnIgfHwgZWxlbWVudFJlZ1Rlc3QgPyAnXFxuJyA6ICcnIHx8IC9eKFRIfFREKSQvaS50ZXN0KG5vZGUubm9kZU5hbWUpID8gJ1xcbicgOiAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0od0RvYywgJycsICdcXG4nKSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuSFRNTC50cmltKCkgKyAnXFxuJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGFuIGV2ZW50IHRvIGRvY3VtZW50LlxyXG4gICAgICAgICAqIFdoZW4gY3JlYXRlZCBhcyBhbiBJZnJhbWUsIHRoZSBzYW1lIGV2ZW50IGlzIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgSWZyYW1lLlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEV2ZW50IHR5cGVcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBFdmVudCBsaXN0ZW5lclxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdXNlQ2FwdHVyZSBVc2UgZXZlbnQgY2FwdHVyZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFkZERvY0V2ZW50OiBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpIHtcclxuICAgICAgICAgICAgX2QuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGV2ZW50cyBmcm9tIGRvY3VtZW50LlxyXG7CoCAgICAgICAgKiBXaGVuIGNyZWF0ZWQgYXMgYW4gSWZyYW1lLCB0aGUgZXZlbnQgb2YgdGhlIGRvY3VtZW50IGluc2lkZSB0aGUgSWZyYW1lIGlzIGFsc28gcmVtb3ZlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBFdmVudCB0eXBlXHJcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgRXZlbnQgbGlzdGVuZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW1vdmVEb2NFdmVudDogZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIF9kLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pZnJhbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIGNvdW50ZWQgYW5kIGRpc3BsYXllZC5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRUZXh0IFRleHQgYWRkZWQuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfY2hhckNvdW50OiBmdW5jdGlvbiAoaW5wdXRUZXh0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heENoYXJDb3VudCA9IG9wdGlvbnMubWF4Q2hhckNvdW50O1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudFR5cGUgPSBvcHRpb25zLmNoYXJDb3VudGVyVHlwZTtcclxuICAgICAgICAgICAgbGV0IG5leHRDaGFyQ291bnQgPSAwO1xyXG4gICAgICAgICAgICBpZiAoISFpbnB1dFRleHQpIG5leHRDaGFyQ291bnQgPSB0aGlzLmdldENoYXJMZW5ndGgoaW5wdXRUZXh0LCBjb3VudFR5cGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2V0Q2hhckNvdW50KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobWF4Q2hhckNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG92ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZnVuY3Rpb25zLmdldENoYXJDb3VudChjb3VudFR5cGUpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDaGFyQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvdmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXJDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldCAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldFNlbGVjdGlvbk5vZGUoKS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VQb3NpdGlvbiA9IHJhbmdlLmVuZE9mZnNldCAtIChjb3VudCAtIG1heENoYXJDb3VudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCkudGV4dENvbnRlbnQgPSB0ZXh0LnNsaWNlKDAsIHNsaWNlUG9zaXRpb24gPCAwID8gMCA6IHNsaWNlUG9zaXRpb24pICsgdGV4dC5zbGljZShyYW5nZS5lbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShyYW5nZS5lbmRDb250YWluZXIsIGVuZE9mZiwgcmFuZ2UuZW5kQ29udGFpbmVyLCBlbmRPZmYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvdW50ICsgbmV4dENoYXJDb3VudCkgPiBtYXhDaGFyQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvdmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3Zlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxDb3VudGVyQmxpbmsoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXJDb3VudCA+IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFdoZW4gXCJlbGVtZW50XCIgaXMgYWRkZWQsIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiBcIm9wdGlvbnMubWF4Q2hhckNvdW50XCIsIGZhbHNlIGlzIHJldHVybmVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IGVsZW1lbnQgRWxlbWVudCBub2RlIG9yIFN0cmluZy5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xudWxsfSBjaGFyQ291bnRlclR5cGUgY2hhckNvdW50ZXJUeXBlLiBJZiBpdCBpcyBudWxsLCB0aGUgb3B0aW9ucy5jaGFyQ291bnRlclR5cGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjaGVja0NoYXJDb3VudDogZnVuY3Rpb24gKGVsZW1lbnQsIGNoYXJDb3VudGVyVHlwZSkge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYXhDaGFyQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50VHlwZSA9IGNoYXJDb3VudGVyVHlwZSB8fCBvcHRpb25zLmNoYXJDb3VudGVyVHlwZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuZ2V0Q2hhckxlbmd0aCgodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZWxlbWVudCA6IHRoaXMuX2NoYXJUeXBlSFRNTCA/IGVsZW1lbnQub3V0ZXJIVE1MIDogZWxlbWVudC50ZXh0Q29udGVudCksIGNvdW50VHlwZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiBsZW5ndGggKyBmdW5jdGlvbnMuZ2V0Q2hhckNvdW50KGNvdW50VHlwZSkgPiBvcHRpb25zLm1heENoYXJDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxDb3VudGVyQmxpbmsoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50LlxyXG4gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgb3B0aW9uLCB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyYWN0ZXIgaXMgdGFrZW4uIChjaGFyQ291bnRlclR5cGUpXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnQgQ29udGVudCB0byBjb3VudFxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFyQ291bnRlclR5cGUgb3B0aW9ucy5jaGFyQ291bnRlclR5cGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENoYXJMZW5ndGg6IGZ1bmN0aW9uIChjb250ZW50LCBjaGFyQ291bnRlclR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC9ieXRlLy50ZXN0KGNoYXJDb3VudGVyVHlwZSkgPyB1dGlsLmdldEJ5dGVMZW5ndGgoY29udGVudCkgOiBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBjaGFyIGNvdW50IHRvIGNoYXJDb3VudGVyIGVsZW1lbnQgdGV4dENvbnRlbnQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0Q2hhckNvdW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQuY2hhckNvdW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBjb250ZXh0LmVsZW1lbnQuY2hhckNvdW50ZXIudGV4dENvbnRlbnQgPSBmdW5jdGlvbnMuZ2V0Q2hhckNvdW50KG9wdGlvbnMuY2hhckNvdW50ZXJUeXBlKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIGNoYXJhY3RlciBjb3VudGVyIGJsaW5rcy5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9jYWxsQ291bnRlckJsaW5rOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJXcmFwcGVyID0gY29udGV4dC5lbGVtZW50LmNoYXJXcmFwcGVyO1xyXG4gICAgICAgICAgICBpZiAoY2hhcldyYXBwZXIgJiYgIXV0aWwuaGFzQ2xhc3MoY2hhcldyYXBwZXIsICdzZS1ibGluaycpKSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGNoYXJXcmFwcGVyLCAnc2UtYmxpbmsnKTtcclxuICAgICAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY2hhcldyYXBwZXIsICdzZS1ibGluaycpO1xyXG4gICAgICAgICAgICAgICAgfSwgNjAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgY29tcG9uZW50cyBzdWNoIGFzIGltYWdlIGFuZCB2aWRlbyBhbmQgbW9kaWZ5IHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfY2hlY2tDb21wb25lbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9maWxlSW5mb1BsdWdpbnNDaGVjay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsZUluZm9QbHVnaW5zQ2hlY2tbaV0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY29tcG9uZW50cy5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9yZXNldENvbXBvbmVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuX2ZpbGVJbmZvUGx1Z2luc1Jlc2V0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWxlSW5mb1BsdWdpbnNSZXNldFtpXSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNldCBtZXRob2QgaW4gdGhlIGNvZGUgdmlldyBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIEhUTUwgc3RyaW5nXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0Q29kZVZpZXc6IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb2RlTWlycm9yRWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IuZ2V0RG9jKCkuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgbWV0aG9kIGluIHRoZSBjb2RlIHZpZXcgYXJlYVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2dldENvZGVWaWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IgPyBvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IuZ2V0RG9jKCkuZ2V0VmFsdWUoKSA6IGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXogY29yZSB2YXJpYWJsZVxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVsb2FkIElzIHJlbG9vYWQ/XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IF9pbml0SFRNTCBpbml0aWFsIGh0bWwgc3RyaW5nXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaW5pdDogZnVuY3Rpb24gKHJlbG9hZCwgX2luaXRIVE1MKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdSZWdFeHAgPSBfdy5SZWdFeHA7XHJcbiAgICAgICAgICAgIHRoaXMuX3d3ID0gb3B0aW9ucy5pZnJhbWUgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLmNvbnRlbnRXaW5kb3cgOiBfdztcclxuICAgICAgICAgICAgdGhpcy5fd2QgPSBfZDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclR5cGVIVE1MID0gb3B0aW9ucy5jaGFyQ291bnRlclR5cGUgPT09ICdieXRlLWh0bWwnO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlmcmFtZSAmJiB0eXBlb2YgX3cuU2hhZG93Um9vdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zaGFkb3dSb290KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoYWRvd1Jvb3QgPSBjaGlsZC5zaGFkb3dSb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgX3cuU2hhZG93Um9vdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGFkb3dSb290ID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCBkaXNhbGxvdyB0ZXh0IG5vZGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGRpc2FsbG93VGV4dFRhZ3MgPSBfdy5PYmplY3Qua2V5cyhvcHRpb25zLl90ZXh0VGFnc01hcCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbG93VGV4dFRhZ3MgPSAhb3B0aW9ucy5hZGRUYWdzV2hpdGVsaXN0ID8gW10gOiBvcHRpb25zLmFkZFRhZ3NXaGl0ZWxpc3Quc3BsaXQoJ3wnKS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIC9ifGl8aW5zfHN8c3RyaWtlL2kudGVzdCh2KTsgfSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsb3dUZXh0VGFncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZGlzYWxsb3dUZXh0VGFncy5zcGxpY2UoZGlzYWxsb3dUZXh0VGFncy5pbmRleE9mKGFsbG93VGV4dFRhZ3NbaV0udG9Mb3dlckNhc2UoKSksIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FsbG93ZWRUZXh0VGFnc1JlZ0V4cCA9IGRpc2FsbG93VGV4dFRhZ3MubGVuZ3RoID09PSAwID8gbnVsbCA6IG5ldyB3UmVnRXhwKCcoPFxcXFwvPykoJyArIGRpc2FsbG93VGV4dFRhZ3Muam9pbignfCcpICsgJylcXFxcYlxcXFxzKig/OltePl48XSspP1xcXFxzKig/PT4pJywgJ2dpJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgd2hpdGVsaXN0XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRBdHRyID0gJ2NvbnRlbnRlZGl0YWJsZXxjb2xzcGFufHJvd3NwYW58dGFyZ2V0fGhyZWZ8c3JjfGNsYXNzfHR5cGV8Y29udHJvbHN8ZGF0YS1mb3JtYXR8ZGF0YS1zaXplfGRhdGEtZmlsZS1zaXplfGRhdGEtZmlsZS1uYW1lfGRhdGEtb3JpZ2lufGRhdGEtYWxpZ258ZGF0YS1pbWFnZS1saW5rfGRhdGEtcm90YXRlfGRhdGEtcHJvcG9ydGlvbnxkYXRhLXBlcmNlbnRhZ2V8b3JpZ2luLXNpemV8ZGF0YS1leHB8ZGF0YS1mb250LXNpemUnO1xyXG4gICAgICAgICAgICB0aGlzLl9hbGxvd0hUTUxDb21tZW50cyA9IG9wdGlvbnMuX2VkaXRvclRhZ3NXaGl0ZWxpc3QuaW5kZXhPZignLy8nKSA+IC0xO1xyXG4gICAgICAgICAgICB0aGlzLl9odG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAgPSBuZXcgd1JlZ0V4cCgnXignICsgb3B0aW9ucy5fZWRpdG9yVGFnc1doaXRlbGlzdC5yZXBsYWNlKCd8Ly8nLCAnJykgKyAnKSQnLCAnaScpO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRvclRhZ3NXaGl0ZWxpc3RSZWdFeHAgPSB1dGlsLmNyZWF0ZVRhZ3NXaGl0ZWxpc3Qob3B0aW9ucy5fZWRpdG9yVGFnc1doaXRlbGlzdC5yZXBsYWNlKCd8Ly8nLCAnfDwhLS18LS0+JykpO1xyXG4gICAgICAgICAgICB0aGlzLnBhc3RlVGFnc1doaXRlbGlzdFJlZ0V4cCA9IHV0aWwuY3JlYXRlVGFnc1doaXRlbGlzdChvcHRpb25zLnBhc3RlVGFnc1doaXRlbGlzdCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBfYXR0ciA9IG9wdGlvbnMuYXR0cmlidXRlc1doaXRlbGlzdDtcclxuICAgICAgICAgICAgY29uc3QgdGFnc0F0dHIgPSB7fTtcclxuICAgICAgICAgICAgbGV0IGFsbEF0dHIgPSAnJztcclxuICAgICAgICAgICAgaWYgKCEhX2F0dHIpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgaW4gX2F0dHIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzT3duKF9hdHRyLCBrKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT09ICdhbGwnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbEF0dHIgPSBfYXR0cltrXSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdzQXR0cltrXSA9IG5ldyB3UmVnRXhwKCcoKD86JyArIF9hdHRyW2tdICsgJ3wnICsgZGVmYXVsdEF0dHIgKyAnKVxccyo9XFxzKlwiW15cIl0qXCIpJywgJ2lnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzV2hpdGVsaXN0UmVnRXhwID0gbmV3IHdSZWdFeHAoJygoPzonICsgYWxsQXR0ciArIGRlZmF1bHRBdHRyICsgJylcXHMqPVxccypcIlteXCJdKlwiKScsICdpZycpO1xyXG4gICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzVGFnc1doaXRlbGlzdCA9IHRhZ3NBdHRyO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IG1vZGVzXHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5saW5lID0gL2lubGluZS9pLnRlc3Qob3B0aW9ucy5tb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5faXNCYWxsb29uID0gL2JhbGxvb258YmFsbG9vbi1hbHdheXMvaS50ZXN0KG9wdGlvbnMubW9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzQmFsbG9vbkFsd2F5cyA9IC9iYWxsb29uLWFsd2F5cy9pLnRlc3Qob3B0aW9ucy5tb2RlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNhY2hpbmcgYnV0dG9uc1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoaW5nQnV0dG9ucygpO1xyXG5cclxuICAgICAgICAgICAgLy8gZmlsZSBjb21wb25lbnRzXHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVJbmZvUGx1Z2luc0NoZWNrID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVJbmZvUGx1Z2luc1Jlc2V0ID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyB0ZXh0IGNvbXBvbmVudHNcclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VkVGFnc0luZm8gPSB7IHF1ZXJ5OiAnJywgbWFwOiB7fSB9O1xyXG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VkQ2xhc3MgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIENvbW1hbmQgYW5kIGZpbGUgcGx1Z2lucyByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVQbHVnaW5zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVNYW5hZ2VyLnRhZ3MgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZU1hbmFnZXIucGx1Z2luTWFwID0ge307XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsZVBsdWdpblJlZ0V4cCA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgcGx1Z2luLCBidXR0b247XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwbHVnaW5zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzT3duKHBsdWdpbnMsIGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luID0gcGx1Z2luc1trZXldO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gcGx1Z2luQ2FsbEJ1dHRvbnNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uYWN0aXZlICYmIGJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFBsdWdpbihrZXksIG51bGwsIGJ1dHRvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5jaGVja0ZpbGVJbmZvID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwbHVnaW4ucmVzZXRGaWxlSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFBsdWdpbihrZXksIG51bGwsIGJ1dHRvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZUluZm9QbHVnaW5zQ2hlY2sucHVzaChwbHVnaW4uY2hlY2tGaWxlSW5mby5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWxlSW5mb1BsdWdpbnNSZXNldC5wdXNoKHBsdWdpbi5yZXNldEZpbGVJbmZvLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKF93LkFycmF5LmlzQXJyYXkocGx1Z2luLmZpbGVUYWdzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVUYWdzID0gcGx1Z2luLmZpbGVUYWdzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFBsdWdpbihrZXksIG51bGwsIGJ1dHRvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZU1hbmFnZXIudGFncyA9IHRoaXMuX2ZpbGVNYW5hZ2VyLnRhZ3MuY29uY2F0KGZpbGVUYWdzKTtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlUGx1Z2luUmVnRXhwLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0YWcgPSAwLCB0TGVuID0gZmlsZVRhZ3MubGVuZ3RoOyB0YWcgPCB0TGVuOyB0YWcrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWxlTWFuYWdlci5wbHVnaW5NYXBbZmlsZVRhZ3NbdGFnXS50b0xvd2VyQ2FzZSgpXSA9IGtleTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm1hbmFnZWRUYWdzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHBsdWdpbi5tYW5hZ2VkVGFncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRDbGFzcy5wdXNoKCcuJyArIGluZm8uY2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZWRUYWdzSW5mby5tYXBbaW5mby5jbGFzc05hbWVdID0gaW5mby5tZXRob2QuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VkVGFnc0luZm8ucXVlcnkgPSBtYW5hZ2VkQ2xhc3MudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZU1hbmFnZXIucXVlcnlTdHJpbmcgPSB0aGlzLl9maWxlTWFuYWdlci50YWdzLmpvaW4oJywnKTtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZU1hbmFnZXIucmVnRXhwID0gbmV3IHdSZWdFeHAoJ14oJyArICB0aGlzLl9maWxlTWFuYWdlci50YWdzLmpvaW4oJ3wnKSArICcpJCcsICdpJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVNYW5hZ2VyLnBsdWdpblJlZ0V4cCA9IG5ldyB3UmVnRXhwKCdeKCcgKyAgKGZpbGVQbHVnaW5SZWdFeHAubGVuZ3RoID09PSAwID8gJ3VuZGVmaW5lZCcgOiBmaWxlUGx1Z2luUmVnRXhwLmpvaW4oJ3wnKSkgKyAnKSQnLCAnaScpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gY2FjaGUgZWRpdG9yJ3MgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fb3JpZ2luQ3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gY29udGV4dC5lbGVtZW50LnBsYWNlaG9sZGVyO1xyXG4gICAgICAgICAgICB0aGlzLl9saW5lQnJlYWtlciA9IGNvbnRleHQuZWxlbWVudC5saW5lQnJlYWtlcjtcclxuICAgICAgICAgICAgdGhpcy5fbGluZUJyZWFrZXJCdXR0b24gPSB0aGlzLl9saW5lQnJlYWtlci5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEV4Y3V0ZSBoaXN0b3J5IGZ1bmN0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeSA9IF9oaXN0b3J5KHRoaXMsIHRoaXMuX29uQ2hhbmdlX2hpc3RvcnlTdGFjay5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5vdGljZSBtb2R1bGVcclxuICAgICAgICAgICAgdGhpcy5hZGRNb2R1bGUoW19ub3RpY2VdKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEluaXQsIHZhbGlkYXRlXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2QgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLmNvbnRlbnREb2N1bWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnID0gdGhpcy5fd2QuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLl9lZGl0b3JTdHlsZXMuZWRpdG9yKSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0ID0gb3B0aW9ucy5fZWRpdG9yU3R5bGVzLmVkaXRvcjtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nKSB0aGlzLl9pZnJhbWVBdXRvID0gdGhpcy5fd2QuYm9keTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5faW5pdFd5c2l3eWdBcmVhKHJlbG9hZCwgX2luaXRIVE1MKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FjaGluZyBiYXNpYyBidXR0b25zIHRvIHVzZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2NhY2hpbmdCdXR0b25zOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZVZpZXdEaXNhYmxlZEJ1dHRvbnMgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5xdWVyeVNlbGVjdG9yQWxsKCcuc2UtdG9vbGJhciBidXR0b246bm90KFtjbGFzc349XCJzZS1jb2RlLXZpZXctZW5hYmxlZFwiXSknKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemluZ0Rpc2FibGVkQnV0dG9ucyA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZS10b29sYmFyIGJ1dHRvbjpub3QoW2NsYXNzfj1cInNlLXJlc2l6aW5nLWVuYWJsZWRcIl0pJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2wgPSBjb250ZXh0LnRvb2w7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcCA9IHtcclxuICAgICAgICAgICAgICAgIFNVQjogdG9vbC5zdWJzY3JpcHQsXHJcbiAgICAgICAgICAgICAgICBTVVA6IHRvb2wuc3VwZXJzY3JpcHQsXHJcbiAgICAgICAgICAgICAgICBPVVRERU5UOiB0b29sLm91dGRlbnQsXHJcbiAgICAgICAgICAgICAgICBJTkRFTlQ6IHRvb2wuaW5kZW50XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcFtvcHRpb25zLnRleHRUYWdzLmJvbGQudG9VcHBlckNhc2UoKV0gPSB0b29sLmJvbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcFtvcHRpb25zLnRleHRUYWdzLnVuZGVybGluZS50b1VwcGVyQ2FzZSgpXSA9IHRvb2wudW5kZXJsaW5lO1xyXG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRNYXBbb3B0aW9ucy50ZXh0VGFncy5pdGFsaWMudG9VcHBlckNhc2UoKV0gPSB0b29sLml0YWxpYztcclxuICAgICAgICAgICAgdGhpcy5jb21tYW5kTWFwW29wdGlvbnMudGV4dFRhZ3Muc3RyaWtlLnRvVXBwZXJDYXNlKCldID0gdG9vbC5zdHJpa2U7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZUNvbW1hbmRNYXAgPSB7XHJcbiAgICAgICAgICAgICAgICBmdWxsU2NyZWVuOiB0b29sLmZ1bGxTY3JlZW4sXHJcbiAgICAgICAgICAgICAgICBzaG93QmxvY2tzOiB0b29sLnNob3dCbG9ja3MsXHJcbiAgICAgICAgICAgICAgICBjb2RlVmlldzogdG9vbC5jb2RlVmlld1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXogd3lzaXd5ZyBhcmVhIChPbmx5IGNhbGxlZCBmcm9tIGNvcmUuX2luaXQpXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSByZWxvYWQgSXMgcmVsb29hZD9cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gX2luaXRIVE1MIGluaXRpYWwgaHRtbCBzdHJpbmdcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pbml0V3lzaXd5Z0FyZWE6IGZ1bmN0aW9uIChyZWxvYWQsIF9pbml0SFRNTCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgPSByZWxvYWQgPyBfaW5pdEhUTUwgOiB0aGlzLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcih0eXBlb2YgX2luaXRIVE1MID09PSAnc3RyaW5nJyA/IF9pbml0SFRNTCA6IGNvbnRleHQuZWxlbWVudC5vcmlnaW5FbGVtZW50LnZhbHVlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIHdoZW4gdGhlcmUgYXJlIGNoYW5nZXMgdG8gdGFncyBpbiB0aGUgd3lzaXd5ZyByZWdpb24uXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfcmVzb3VyY2VzU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5faWZyYW1lQXV0b0hlaWdodCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1BsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENhbGxlZCB3aGVuIGFmdGVyIGV4ZWN1dGUgXCJoaXN0b3J5LnB1c2hcIlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX29uQ2hhbmdlX2hpc3RvcnlTdGFjazogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBldmVudC5fYXBwbHlUYWdFZmZlY3RzKCk7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnRvb2wuc2F2ZSkgY29udGV4dC50b29sLnNhdmUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICBpZiAoZnVuY3Rpb25zLm9uQ2hhbmdlKSBmdW5jdGlvbnMub25DaGFuZ2UodGhpcy5nZXRDb250ZW50cyh0cnVlKSwgdGhpcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE1vZGlmeSB0aGUgaGVpZ2h0IHZhbHVlIG9mIHRoZSBpZnJhbWUgd2hlbiB0aGUgaGVpZ2h0IG9mIHRoZSBpZnJhbWUgaXMgYXV0b21hdGljLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2lmcmFtZUF1dG9IZWlnaHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lmcmFtZUF1dG8pIHtcclxuICAgICAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnN0eWxlLmhlaWdodCA9IGNvcmUuX2lmcmFtZUF1dG8ub2Zmc2V0SGVpZ2h0ICsgJ3B4JzsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGRpc3BsYXkgcHJvcGVydHkgd2hlbiB0aGVyZSBpcyBwbGFjZWhvbGRlci5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9jaGVja1BsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhcmlhYmxlLmlzQ29kZVZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB3eXNpd3lnID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwub25seVplcm9XaWR0aFNwYWNlKHd5c2l3eWcudGV4dENvbnRlbnQpIHx8IHd5c2l3eWcucXVlcnlTZWxlY3RvcignLnNlLWNvbXBvbmVudCwgcHJlLCBibG9ja3F1b3RlLCBociwgbGksIHRhYmxlLCBpbWcsIGlmcmFtZSwgdmlkZW8nKSB8fCAod3lzaXd5Zy5pbm5lclRleHQubWF0Y2goL1xcbi9nKSB8fCAnJykubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIElmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZm9ybWF0LCBhZGQgYSBmb3JtYXQgYW5kIG1vdmUgXCJzZWxlY3Rpb25cIi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xudWxsfSBmb3JtYXROYW1lIEZvcm1hdCB0YWcgbmFtZSAoZGVmYXVsdDogJ1AnKVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3NldERlZmF1bHRGb3JtYXQ6IGZ1bmN0aW9uIChmb3JtYXROYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlTWFuYWdlci5wbHVnaW5SZWdFeHAudGVzdCh0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGNvbW1vbkNvbiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGxldCBmb2N1c05vZGUsIG9mZnNldCwgZm9ybWF0O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbXBvbmVudCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChjb21tb25Db24sIHV0aWwuaXNDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBpZiAoZmlsZUNvbXBvbmVudCAmJiAhdXRpbC5pc1RhYmxlKGZpbGVDb21wb25lbnQpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmKCh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHN0YXJ0Q29uKSB8fCB1dGlsLmlzV3lzaXd5Z0RpdihzdGFydENvbikpICYmIHV0aWwuaXNDb21wb25lbnQoc3RhcnRDb24uY2hpbGROb2Rlc1tyYW5nZS5zdGFydE9mZnNldF0pKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAocmFuZ2VFbCkge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGZvcm1hdE5hbWUgfHwgb3B0aW9ucy5kZWZhdWx0VGFnKTtcclxuICAgICAgICAgICAgICAgIGZvcm1hdC5pbm5lckhUTUwgPSByYW5nZUVsLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIGZvcm1hdC5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlRWwuaW5uZXJIVE1MID0gZm9ybWF0Lm91dGVySFRNTDtcclxuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHJhbmdlRWwuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGZvY3VzTm9kZSA9IHV0aWwuZ2V0RWRnZUNoaWxkTm9kZXMoZm9ybWF0LCBudWxsKS5zYztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvY3VzTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0Lmluc2VydEJlZm9yZShmb2N1c05vZGUsIGZvcm1hdC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZm9jdXNOb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoZm9jdXNOb2RlLCBvZmZzZXQsIGZvY3VzTm9kZSwgb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pICYmIChjb21tb25Db24uY2hpbGROb2Rlcy5sZW5ndGggPD0gMSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBiciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uQ29uLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIHV0aWwuaXNCcmVhayhjb21tb25Db24uZmlyc3RDaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBiciA9IGNvbW1vbkNvbi5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBiciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uQ29uLmFwcGVuZENoaWxkKGJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGJyLCAxLCBiciwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoJ2Zvcm1hdEJsb2NrJywgZmFsc2UsIChmb3JtYXROYW1lIHx8IG9wdGlvbnMuZGVmYXVsdFRhZykpO1xyXG4gICAgICAgICAgICBmb2N1c05vZGUgPSB1dGlsLmdldEVkZ2VDaGlsZE5vZGVzKGNvbW1vbkNvbiwgY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgZm9jdXNOb2RlID0gZm9jdXNOb2RlID8gZm9jdXNOb2RlLmVjIDogY29tbW9uQ29uO1xyXG5cclxuICAgICAgICAgICAgZm9ybWF0ID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KGZvY3VzTm9kZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGlmICghZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGZvcm1hdC5uZXh0U2libGluZykpIHV0aWwucmVtb3ZlSXRlbShmb3JtYXQubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGZvcm1hdC5wcmV2aW91c1NpYmxpbmcpKSB1dGlsLnJlbW92ZUl0ZW0oZm9ybWF0LnByZXZpb3VzU2libGluZyk7XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQnJlYWsoZm9jdXNOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemVyb1dpZHRoID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgIGZvY3VzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh6ZXJvV2lkdGgsIGZvY3VzTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBmb2N1c05vZGUgPSB6ZXJvV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6YXRpb24gYWZ0ZXIgXCJzZXRPcHRpb25zXCJcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gZWwgY29udGV4dC5lbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IF9pbml0SFRNTCBJbml0aWFsIGh0bWwgc3RyaW5nXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfc2V0T3B0aW9uc0luaXQ6IGZ1bmN0aW9uIChlbCwgX2luaXRIVE1MKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQgPSBfQ29udGV4dChlbC5vcmlnaW5FbGVtZW50LCB0aGlzLl9nZXRDb25zdHJ1Y3RlZChlbCksIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzSW5mb1Jlc2V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZWRpdG9ySW5pdCh0cnVlLCBfaW5pdEhUTUwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXogZWRpdG9yXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSByZWxvYWQgSXMgcmVsb29hZD9cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gX2luaXRIVE1MIGluaXRpYWwgaHRtbCBzdHJpbmdcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9lZGl0b3JJbml0OiBmdW5jdGlvbiAocmVsb2FkLCBfaW5pdEhUTUwpIHtcclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjb3JlIGFuZCBhZGQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIHRoaXMuX2luaXQocmVsb2FkLCBfaW5pdEhUTUwpO1xyXG4gICAgICAgICAgICBldmVudC5fYWRkRXZlbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0Q2hhckNvdW50KCk7XHJcbiAgICAgICAgICAgIGV2ZW50Ll9vZmZTdGlja3lUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIGV2ZW50Lm9uUmVzaXplX3dpbmRvdygpO1xyXG5cclxuICAgICAgICAgICAgLy8gdG9vbGJhciB2aXNpYmlsaXR5XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrQ29tcG9uZW50cygpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzSW5mb0luaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50c0luZm9SZXNldCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc2V0KHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZXNTdGF0ZUNoYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgX3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbnMub25sb2FkID09PSAnZnVuY3Rpb24nKSBmdW5jdGlvbnMub25sb2FkKGNvcmUsIHJlbG9hZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW5kIHJldHVybiBhbiBvYmplY3QgdG8gY2FjaGUgdGhlIG5ldyBjb250ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dEVsIGNvbnRleHQuZWxlbWVudFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfZ2V0Q29uc3RydWN0ZWQ6IGZ1bmN0aW9uIChjb250ZXh0RWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIF90b3A6IGNvbnRleHRFbC50b3BBcmVhLFxyXG4gICAgICAgICAgICAgICAgX3JlbGF0aXZlOiBjb250ZXh0RWwucmVsYXRpdmUsXHJcbiAgICAgICAgICAgICAgICBfdG9vbEJhcjogY29udGV4dEVsLnRvb2xiYXIsXHJcbiAgICAgICAgICAgICAgICBfbWVudVRyYXk6IGNvbnRleHRFbC5fbWVudVRyYXksXHJcbiAgICAgICAgICAgICAgICBfZWRpdG9yQXJlYTogY29udGV4dEVsLmVkaXRvckFyZWEsXHJcbiAgICAgICAgICAgICAgICBfd3lzaXd5Z0FyZWE6IGNvbnRleHRFbC53eXNpd3lnRnJhbWUsXHJcbiAgICAgICAgICAgICAgICBfY29kZUFyZWE6IGNvbnRleHRFbC5jb2RlLFxyXG4gICAgICAgICAgICAgICAgX3BsYWNlaG9sZGVyOiBjb250ZXh0RWwucGxhY2Vob2xkZXIsXHJcbiAgICAgICAgICAgICAgICBfcmVzaXppbmdCYXI6IGNvbnRleHRFbC5yZXNpemluZ0JhcixcclxuICAgICAgICAgICAgICAgIF9uYXZpZ2F0aW9uOiBjb250ZXh0RWwubmF2aWdhdGlvbixcclxuICAgICAgICAgICAgICAgIF9jaGFyQ291bnRlcjogY29udGV4dEVsLmNoYXJDb3VudGVyLFxyXG4gICAgICAgICAgICAgICAgX2NoYXJXcmFwcGVyOiBjb250ZXh0RWwuY2hhcldyYXBwZXIsXHJcbiAgICAgICAgICAgICAgICBfbG9hZGluZzogY29udGV4dEVsLmxvYWRpbmcsXHJcbiAgICAgICAgICAgICAgICBfbGluZUJyZWFrZXI6IGNvbnRleHRFbC5saW5lQnJlYWtlcixcclxuICAgICAgICAgICAgICAgIF9saW5lQnJlYWtlcl90OiBjb250ZXh0RWwubGluZUJyZWFrZXJfdCxcclxuICAgICAgICAgICAgICAgIF9saW5lQnJlYWtlcl9iOiBjb250ZXh0RWwubGluZUJyZWFrZXJfYixcclxuICAgICAgICAgICAgICAgIF9yZXNpemVCYWNrOiBjb250ZXh0RWwucmVzaXplQmFja2dyb3VuZCxcclxuICAgICAgICAgICAgICAgIF9zdGlja3lEdW1teTogY29udGV4dEVsLl9zdGlja3lEdW1teSxcclxuICAgICAgICAgICAgICAgIF9hcnJvdzogY29udGV4dEVsLl9hcnJvd1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gZXZlbnQgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgY29uc3QgZXZlbnQgPSB7XHJcbiAgICAgICAgX0lFaXNDb21wb3Npbmc6IGZhbHNlLCAvLyBJbiBJRSwgdGhlcmUgaXMgbm8gXCJlLmlzQ29tcG9zaW5nXCIgaW4gdGhlIGtleS11cCBldmVudC5cclxuICAgICAgICBfbGluZUJyZWFrZXJCaW5kOiBudWxsLFxyXG4gICAgICAgIF9yZXNwb25zaXZlQ3VycmVudFNpemU6ICdkZWZhdWx0JyxcclxuICAgICAgICBfcmVzcG9uc2l2ZUJ1dHRvblNpemU6IG51bGwsXHJcbiAgICAgICAgX3Jlc3BvbnNpdmVCdXR0b25zOiBudWxsLFxyXG4gICAgICAgIF9kaXJlY3Rpb25LZXlDb2RlOiBuZXcgX3cuUmVnRXhwKCdeKDh8MTN8M1syLTldfDQwfDQ2KSQnKSxcclxuICAgICAgICBfbm9uVGV4dEtleUNvZGU6IG5ldyBfdy5SZWdFeHAoJ14oOHwxM3wxWzYtOV18MjB8Mjd8M1szLTldfDQwfDQ1fDQ2fDExWzItOV18MTJbMC0zXXwxNDR8MTQ1KSQnKSxcclxuICAgICAgICBfaGlzdG9yeUlnbm9yZUtleUNvZGU6IG5ldyBfdy5SZWdFeHAoJ14oMVs2LTldfDIwfDI3fDNbMy05XXw0MHw0NXwxMVsyLTldfDEyWzAtM118MTQ0fDE0NSkkJyksXHJcbiAgICAgICAgX29uQnV0dG9uc0NoZWNrOiBuZXcgX3cuUmVnRXhwKCdeKCcgKyBfdy5PYmplY3Qua2V5cyhvcHRpb25zLl90ZXh0VGFnc01hcCkuam9pbignfCcpICsgJykkJywgJ2knKSxcclxuICAgICAgICBfZnJvbnRaZXJvV2lkdGhSZWc6IG5ldyBfdy5SZWdFeHAodXRpbC56ZXJvV2lkdGhTcGFjZSArICcrJywgJycpLFxyXG4gICAgICAgIF9rZXlDb2RlU2hvcnRjdXQ6IHtcclxuICAgICAgICAgICAgNjU6ICdBJyxcclxuICAgICAgICAgICAgNjY6ICdCJyxcclxuICAgICAgICAgICAgODM6ICdTJyxcclxuICAgICAgICAgICAgODU6ICdVJyxcclxuICAgICAgICAgICAgNzM6ICdJJyxcclxuICAgICAgICAgICAgODk6ICdZJyxcclxuICAgICAgICAgICAgOTA6ICdaJyxcclxuICAgICAgICAgICAgMjE5OiAnWycsXHJcbiAgICAgICAgICAgIDIyMTogJ10nXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3J0Y3V0Q29tbWFuZDogZnVuY3Rpb24gKGtleUNvZGUsIHNoaWZ0KSB7XHJcbiAgICAgICAgICAgIGxldCBjb21tYW5kID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qga2V5U3RyID0gZXZlbnQuX2tleUNvZGVTaG9ydGN1dFtrZXlDb2RlXTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5U3RyKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3NlbGVjdEFsbCc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdCJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ2JvbGQnKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdib2xkJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdTJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgJiYgb3B0aW9ucy5zaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3N0cmlrZScpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3N0cmlrZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2hpZnQgJiYgb3B0aW9ucy5zaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3NhdmUnKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdzYXZlJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdVJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaG9ydGN1dHNEaXNhYmxlLmluZGV4T2YoJ3VuZGVybGluZScpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3VuZGVybGluZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnSSc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdpdGFsaWMnKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdpdGFsaWMnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1onOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNob3J0Y3V0c0Rpc2FibGUuaW5kZXhPZigndW5kbycpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAncmVkbyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ3VuZG8nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCd1bmRvJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAncmVkbyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnWyc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdpbmRlbnQnKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG9wdGlvbnMucnRsID8gJ2luZGVudCcgOiAnb3V0ZGVudCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnXSc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2hvcnRjdXRzRGlzYWJsZS5pbmRleE9mKCdpbmRlbnQnKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG9wdGlvbnMucnRsID8gJ291dGRlbnQnIDogJ2luZGVudCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbW1hbmQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGNvcmUuY29tbWFuZEhhbmRsZXIoY29yZS5jb21tYW5kTWFwW2NvbW1hbmRdLCBjb21tYW5kKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2FwcGx5VGFnRWZmZWN0czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uTm9kZSA9IGNvcmUuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uTm9kZSA9PT0gY29yZS5lZmZlY3ROb2RlKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvcmUuZWZmZWN0Tm9kZSA9IHNlbGVjdGlvbk5vZGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtYXJnaW5EaXIgPSBvcHRpb25zLnJ0bCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCc7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRNYXAgPSBjb3JlLmNvbW1hbmRNYXA7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzT25DaGVjayA9IHRoaXMuX29uQnV0dG9uc0NoZWNrO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kTWFwTm9kZXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVzID0gW107XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVQbHVnaW5zID0gY29yZS5hY3RpdmVQbHVnaW5zO1xyXG4gICAgICAgICAgICBjb25zdCBjTGVuID0gYWN0aXZlUGx1Z2lucy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBub2RlTmFtZSA9ICcnO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHNlbGVjdGlvbk5vZGUuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbk5vZGUuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCA9IHNlbGVjdGlvbk5vZGU7ICF1dGlsLmlzV3lzaXd5Z0RpdihlbGVtZW50KTsgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50KSBicmVhaztcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxIHx8IHV0aWwuaXNCcmVhayhlbGVtZW50KSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2Rlcy5wdXNoKG5vZGVOYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBBY3RpdmUgcGx1Z2lucyAqL1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIG5hbWU7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gYWN0aXZlUGx1Z2luc1tjXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZE1hcE5vZGVzLmluZGV4T2YobmFtZSkgPT09IC0xICYmIHBsdWdpbnNbbmFtZV0uYWN0aXZlLmNhbGwoY29yZSwgZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2gobmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qIE91dGRlbnQgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZE1hcE5vZGVzLmluZGV4T2YoJ09VVERFTlQnKSA9PT0gLTEgJiYgY29tbWFuZE1hcC5PVVRERU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdENlbGwoZWxlbWVudCkgfHwgKGVsZW1lbnQuc3R5bGVbbWFyZ2luRGlyXSAmJiB1dGlsLmdldE51bWJlcihlbGVtZW50LnN0eWxlW21hcmdpbkRpcl0sIDApID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdPVVRERU5UJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwLk9VVERFTlQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKiBJbmRlbnQgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZE1hcE5vZGVzLmluZGV4T2YoJ0lOREVOVCcpID09PSAtMSAmJiBjb21tYW5kTWFwLklOREVOVCAmJiB1dGlsLmlzTGlzdENlbGwoZWxlbWVudCkgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnSU5ERU5UJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXAuSU5ERU5ULnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBkZWZhdWx0IGFjdGl2ZSBidXR0b25zIFtzdHJvbmcsIGlucywgZW0sIGRlbCwgc3ViLCBzdXBdICovXHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NPbkNoZWNrLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2gobm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29tbWFuZE1hcFtub2RlTmFtZV0sICdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHJlbW92ZSBjbGFzcywgZGlzcGxheSB0ZXh0ICovXHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjb21tYW5kTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZE1hcE5vZGVzLmluZGV4T2Yoa2V5KSA+IC0xIHx8ICF1dGlsLmhhc093bihjb21tYW5kTWFwLCBrZXkpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVQbHVnaW5zLmluZGV4T2Yoa2V5KSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luc1trZXldLmFjdGl2ZS5jYWxsKGNvcmUsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kTWFwLk9VVERFTlQgJiYgL15PVVRERU5UJC9pLnRlc3Qoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXAuT1VUREVOVC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmRNYXAuSU5ERU5UICYmIC9eSU5ERU5UJC9pLnRlc3Qoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXAuSU5ERU5ULnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb21tYW5kTWFwW2tleV0sICdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHNhdmUgY3VycmVudCBub2RlcyAqL1xyXG4gICAgICAgICAgICBjb3JlLl92YXJpYWJsZS5jdXJyZW50Tm9kZXMgPSBjdXJyZW50Tm9kZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICBjb3JlLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNNYXAgPSBjb21tYW5kTWFwTm9kZXM7XHJcblxyXG4gICAgICAgICAgICAvKiogIERpc3BsYXlzIHRoZSBjdXJyZW50IG5vZGUgc3RydWN0dXJlIHRvIHJlc2l6aW5nQmFyICovXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNob3dQYXRoTGFiZWwpIGNvbnRleHQuZWxlbWVudC5uYXZpZ2F0aW9uLnRleHRDb250ZW50ID0gY29yZS5fdmFyaWFibGUuY3VycmVudE5vZGVzLmpvaW4oJyA+ICcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jYW5jZWxDYXB0aW9uRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBldmVudC5fY2FuY2VsQ2FwdGlvbkVkaXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9idXR0b25zRXZlbnRIYW5kbGVyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIGlmIChjb3JlLl9iaW5kQ29udHJvbGxlcnNPZmYpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoL14oaW5wdXR8dGV4dGFyZWF8c2VsZWN0fG9wdGlvbikkL2kudGVzdCh0YXJnZXQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb3JlLl9hbnRpQmx1ciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldCwgJy5zZS1zdWJtZW51JykpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBjb3JlLl9ub3RIaWRlVG9vbGJhciA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL3NlLW1lbnUtbGlzdC8udGVzdChjbGFzc05hbWUpICYmICEvc3VuLWVkaXRvci1jb21tb24vLnRlc3QoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gY29yZS5fc3VibWVudU5hbWUgfHwgY29tbWFuZCA9PT0gY29yZS5fY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3Rvb2xiYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGRpc3BsYXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWRpc3BsYXknKTtcclxuICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAodGFyZ2V0LnBhcmVudE5vZGUgJiYgIWNvbW1hbmQgJiYgIS9zZS1tZW51LWxpc3QvLnRlc3QoY2xhc3NOYW1lKSAmJiAhL3NlLXRvb2xiYXIvLnRlc3QoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1kaXNwbGF5Jyk7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbW1hbmQgJiYgIWRpc3BsYXkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoIWNvcmUuaGFzRm9jdXMpIGNvcmUubmF0aXZlRm9jdXMoKTtcclxuICAgICAgICAgICAgaWYgKCFjb3JlLl92YXJpYWJsZS5pc0NvZGVWaWV3KSBjb3JlLl9lZGl0b3JSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgY29yZS5hY3Rpb25DYWxsKGNvbW1hbmQsIGRpc3BsYXksIHRhcmdldCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNOb25FZGl0YWJsZShjb250ZXh0LmVsZW1lbnQud3lzaXd5ZykpIHJldHVybjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlQ2VsbCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChlLnRhcmdldCwgdXRpbC5pc0NlbGwpO1xyXG4gICAgICAgICAgICBpZiAodGFibGVDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IGNvcmUucGx1Z2lucy50YWJsZTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVBsdWdpbiAmJiB0YWJsZUNlbGwgIT09IHRhYmxlUGx1Z2luLl9maXhlZENlbGwgJiYgIXRhYmxlUGx1Z2luLl9zaGlmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuY2FsbFBsdWdpbigndGFibGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLm9uVGFibGVDZWxsTXVsdGlTZWxlY3QuY2FsbChjb3JlLCB0YWJsZUNlbGwsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcmUuX2lzQmFsbG9vbikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgvRklHVVJFL2kudGVzdChlLnRhcmdldC5ub2RlTmFtZSkpIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbnMub25Nb3VzZURvd24gPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5vbk1vdXNlRG93bihlLCBjb3JlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNOb25FZGl0YWJsZShjb250ZXh0LmVsZW1lbnQud3lzaXd5ZykpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb21wb25lbnRJbmZvID0gY29yZS5nZXRGaWxlQ29tcG9uZW50KHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAoZmlsZUNvbXBvbmVudEluZm8pIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGNvcmUuc2VsZWN0Q29tcG9uZW50KGZpbGVDb21wb25lbnRJbmZvLnRhcmdldCwgZmlsZUNvbXBvbmVudEluZm8ucGx1Z2luTmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZ2NhcHRpb24gPSB1dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0RWxlbWVudCwgJ0ZJR0NBUFRJT04nKTtcclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNOb25FZGl0YWJsZShmaWdjYXB0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbi5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgZmlnY2FwdGlvbi5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb3JlLl9pc0lubGluZSAmJiAhY29yZS5faW5saW5lVG9vbGJhckF0dHIuaXNTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuX3Nob3dUb29sYmFySW5saW5lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGVUb29sYmFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlnY2FwdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgaGlkZVRvb2xiYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3cuc2V0VGltZW91dChjb3JlLl9lZGl0b3JSYW5nZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICAgICAgY29yZS5fZWRpdG9yUmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk5vZGUgPSBjb3JlLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0RWwgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoc2VsZWN0aW9uTm9kZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWwgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlLCBudWxsKTtcclxuICAgICAgICAgICAgaWYgKCghZm9ybWF0RWwgfHwgZm9ybWF0RWwgPT09IHJhbmdlRWwpICYmICF1dGlsLmlzTm9uRWRpdGFibGUodGFyZ2V0RWxlbWVudCkgJiYgIXV0aWwuaXNMaXN0KHJhbmdlRWwpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGNvcmUuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGlmICh1dGlsLmdldEZvcm1hdEVsZW1lbnQocmFuZ2Uuc3RhcnRDb250YWluZXIpID09PSB1dGlsLmdldEZvcm1hdEVsZW1lbnQocmFuZ2UuZW5kQ29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdChyYW5nZUVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvTGkgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0xJJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZMaSA9IHNlbGVjdGlvbk5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTGkuYXBwZW5kQ2hpbGQoc2VsZWN0aW9uTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWwuaW5zZXJ0QmVmb3JlKG9MaSwgcHJldkxpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF1dGlsLmlzV3lzaXd5Z0RpdihzZWxlY3Rpb25Ob2RlKSAmJiAhdXRpbC5pc0NvbXBvbmVudChzZWxlY3Rpb25Ob2RlKSAmJiAoIXV0aWwuaXNUYWJsZShzZWxlY3Rpb25Ob2RlKSB8fCB1dGlsLmlzQ2VsbChzZWxlY3Rpb25Ob2RlKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5fc2V0RGVmYXVsdEZvcm1hdCh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlRWwpID8gJ0RJVicgOiBvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29yZS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX2FwcGx5VGFnRWZmZWN0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29yZS5faXNCYWxsb29uKSBfdy5zZXRUaW1lb3V0KGV2ZW50Ll90b2dnbGVUb29sYmFyQmFsbG9vbik7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5vbkNsaWNrKGUsIGNvcmUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9iYWxsb29uRGVsYXk6IG51bGwsXHJcbiAgICAgICAgX3Nob3dUb29sYmFyQmFsbG9vbkRlbGF5OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5fYmFsbG9vbkRlbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBfdy5jbGVhclRpbWVvdXQoZXZlbnQuX2JhbGxvb25EZWxheSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGV2ZW50Ll9iYWxsb29uRGVsYXkgPSBfdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF93LmNsZWFyVGltZW91dCh0aGlzLl9iYWxsb29uRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmFsbG9vbkRlbGF5ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dUb29sYmFyQmFsbG9vbigpO1xyXG4gICAgICAgICAgICB9LmJpbmQoZXZlbnQpLCAzNTApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF90b2dnbGVUb29sYmFyQmFsbG9vbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb3JlLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGNvcmUuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgaWYgKGNvcmUuX2JpbmRDb250cm9sbGVyc09mZiB8fCAoIWNvcmUuX2lzQmFsbG9vbkFsd2F5cyAmJiByYW5nZS5jb2xsYXBzZWQpKSBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgZWxzZSBldmVudC5fc2hvd1Rvb2xiYXJCYWxsb29uKHJhbmdlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd1Rvb2xiYXJCYWxsb29uOiBmdW5jdGlvbiAocmFuZ2VPYmopIHtcclxuICAgICAgICAgICAgaWYgKCFjb3JlLl9pc0JhbGxvb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gcmFuZ2VPYmogfHwgY29yZS5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcEFyZWEgPSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY29yZS5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpc0RpclRvcDtcclxuICAgICAgICAgICAgaWYgKGNvcmUuX2lzQmFsbG9vbkFsd2F5cyAmJiByYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBzZWxlY3Rpb24uYW5jaG9yTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaXNEaXJUb3AgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHV0aWwuZ2V0TGlzdENoaWxkTm9kZXMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaXNEaXJUb3AgPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2Rlcywgc2VsZWN0aW9uLmZvY3VzTm9kZSkgPCB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2Rlcywgc2VsZWN0aW9uLmFuY2hvck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG4gICAgICAgICAgICByZWN0cyA9IHJlY3RzW2lzRGlyVG9wID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNjcm9sbExlZnQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgbGV0IGVsID0gdG9wQXJlYTtcclxuICAgICAgICAgICAgd2hpbGUgKCEhZWwpIHtcclxuICAgICAgICAgICAgICAgIHNjcm9sbExlZnQgKz0gZWwuc2Nyb2xsTGVmdDtcclxuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCArPSBlbC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvcldpZHRoID0gdG9wQXJlYS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGV2ZW50Ll9nZXRFZGl0b3JPZmZzZXRzKG51bGwpO1xyXG4gICAgICAgICAgICBjb25zdCBzdGlja3lUb3AgPSBvZmZzZXRzLnRvcDtcclxuICAgICAgICAgICAgY29uc3QgZWRpdG9yTGVmdCA9IG9mZnNldHMubGVmdDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUudG9wID0gJy0xMDAwMHB4JztcclxuICAgICAgICAgICAgdG9vbGJhci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlY3RzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY29yZS5nZXRTZWxlY3Rpb25Ob2RlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQobm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZXJvV2lkdGggPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaW5zZXJ0Tm9kZSh6ZXJvV2lkdGgsIG51bGwsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb3JlLnNldFJhbmdlKHplcm9XaWR0aCwgMSwgemVyb1dpZHRoLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb3JlLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RzID0gY29yZS5nZXRSYW5nZSgpLmdldENsaWVudFJlY3RzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdHMgPSByZWN0c1tpc0RpclRvcCA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlY3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZU9mZnNldCA9IHV0aWwuZ2V0T2Zmc2V0KG5vZGUsIGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBub2RlT2Zmc2V0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbm9kZU9mZnNldC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBub2RlT2Zmc2V0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogbm9kZU9mZnNldC50b3AgKyBub2RlLm9mZnNldEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9UZXh0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgYXJyb3dNYXJnaW4gPSBfdy5NYXRoLnJvdW5kKGNvbnRleHQuZWxlbWVudC5fYXJyb3cub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldpZHRoID0gdG9vbGJhci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRvb2xiYXIub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWVSZWN0cyA9IC9pZnJhbWUvaS50ZXN0KGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUubm9kZU5hbWUpID8gY29udGV4dC5lbGVtZW50Lnd5c2l3eWdGcmFtZS5nZXRDbGllbnRSZWN0cygpWzBdIDogbnVsbDtcclxuICAgICAgICAgICAgaWYgKGlmcmFtZVJlY3RzKSB7XHJcbiAgICAgICAgICAgICAgICByZWN0cyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWN0cy5sZWZ0ICsgaWZyYW1lUmVjdHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3RzLnRvcCArIGlmcmFtZVJlY3RzLnRvcCxcclxuICAgICAgICAgICAgICAgICAgICByaWdodDogcmVjdHMucmlnaHQgKyBpZnJhbWVSZWN0cy5yaWdodCAtIGlmcmFtZVJlY3RzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcmVjdHMuYm90dG9tICsgaWZyYW1lUmVjdHMuYm90dG9tIC0gaWZyYW1lUmVjdHMuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBldmVudC5fc2V0VG9vbGJhck9mZnNldChpc0RpclRvcCwgcmVjdHMsIHRvb2xiYXIsIGVkaXRvckxlZnQsIGVkaXRvcldpZHRoLCBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AsIHN0aWNreVRvcCwgYXJyb3dNYXJnaW4pO1xyXG4gICAgICAgICAgICBpZiAodG9vbGJhcldpZHRoICE9PSB0b29sYmFyLm9mZnNldFdpZHRoIHx8IHRvb2xiYXJIZWlnaHQgIT09IHRvb2xiYXIub2Zmc2V0SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fc2V0VG9vbGJhck9mZnNldChpc0RpclRvcCwgcmVjdHMsIHRvb2xiYXIsIGVkaXRvckxlZnQsIGVkaXRvcldpZHRoLCBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AsIHN0aWNreVRvcCwgYXJyb3dNYXJnaW4pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50b29sYmFyQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JQYXJlbnQgPSB0b3BBcmVhLnBhcmVudEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG9wdGlvbnMudG9vbGJhckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gY29udGFpbmVyLm9mZnNldExlZnQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG9wID0gY29udGFpbmVyLm9mZnNldFRvcDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSghY29udGFpbmVyLnBhcmVudEVsZW1lbnQuY29udGFpbnMoZWRpdG9yUGFyZW50KSB8fCAhL14oQk9EWXxIVE1MKSQvaS50ZXN0KGNvbnRhaW5lci5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5vZmZzZXRQYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBjb250YWluZXIub2Zmc2V0TGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB0b3AgKz0gY29udGFpbmVyLm9mZnNldFRvcDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmxlZnQgPSAodG9vbGJhci5vZmZzZXRMZWZ0IC0gbGVmdCArIHRvcEFyZWEub2Zmc2V0TGVmdCkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS50b3AgPSAodG9vbGJhci5vZmZzZXRUb3AgLSB0b3AgKyB0b3BBcmVhLm9mZnNldFRvcCkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2V0VG9vbGJhck9mZnNldDogZnVuY3Rpb24gKGlzRGlyVG9wLCByZWN0cywgdG9vbGJhciwgZWRpdG9yTGVmdCwgZWRpdG9yV2lkdGgsIHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgc3RpY2t5VG9wLCBhcnJvd01hcmdpbikge1xyXG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gMTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldpZHRoID0gdG9vbGJhci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHJlY3RzLm5vVGV4dCAmJiAhaXNEaXJUb3AgPyAwIDogdG9vbGJhci5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZUxlZnQgPSAoaXNEaXJUb3AgPyByZWN0cy5sZWZ0IDogcmVjdHMucmlnaHQpIC0gZWRpdG9yTGVmdCAtICh0b29sYmFyV2lkdGggLyAyKSArIHNjcm9sbExlZnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJSaWdodCA9IGFic29sdXRlTGVmdCArIHRvb2xiYXJXaWR0aCAtIGVkaXRvcldpZHRoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHQgPSAoaXNEaXJUb3AgPyByZWN0cy50b3AgLSB0b29sYmFySGVpZ2h0IC0gYXJyb3dNYXJnaW4gOiByZWN0cy5ib3R0b20gKyBhcnJvd01hcmdpbikgLSAocmVjdHMubm9UZXh0ID8gMCA6IHN0aWNreVRvcCkgKyBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGxldCBsID0gYWJzb2x1dGVMZWZ0IDwgMCA/IHBhZGRpbmcgOiBvdmVyUmlnaHQgPCAwID8gYWJzb2x1dGVMZWZ0IDogYWJzb2x1dGVMZWZ0IC0gb3ZlclJpZ2h0IC0gcGFkZGluZyAtIDE7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzZXRUb3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSB0ICsgKGlzRGlyVG9wID8gKGV2ZW50Ll9nZXRFZGl0b3JPZmZzZXRzKG51bGwpLnRvcCkgOiAodG9vbGJhci5vZmZzZXRIZWlnaHQgLSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5vZmZzZXRIZWlnaHQpKTtcclxuICAgICAgICAgICAgaWYgKCFpc0RpclRvcCAmJiBzcGFjZSA+IDAgJiYgZXZlbnQuX2dldFBhZ2VCb3R0b21TcGFjZSgpIDwgc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJlc2V0VG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RpclRvcCAmJiBfZC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0VG9wID4gc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXNldFRvcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNldFRvcCkgdCA9IChpc0RpclRvcCA/IHJlY3RzLnRvcCAtIHRvb2xiYXJIZWlnaHQgLSBhcnJvd01hcmdpbiA6IHJlY3RzLmJvdHRvbSArIGFycm93TWFyZ2luKSAtIChyZWN0cy5ub1RleHQgPyAwIDogc3RpY2t5VG9wKSArIHNjcm9sbFRvcDtcclxuXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUubGVmdCA9IF93Lk1hdGguZmxvb3IobCkgKyAncHgnO1xyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLnRvcCA9IF93Lk1hdGguZmxvb3IodCkgKyAncHgnO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzRGlyVG9wKSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdzZS1hcnJvdy11cCcpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb250ZXh0LmVsZW1lbnQuX2Fycm93LCAnc2UtYXJyb3ctZG93bicpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9hcnJvdy5zdHlsZS50b3AgPSB0b29sYmFySGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ3NlLWFycm93LWRvd24nKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ3NlLWFycm93LXVwJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuX2Fycm93LnN0eWxlLnRvcCA9IC1hcnJvd01hcmdpbiArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93X2xlZnQgPSBfdy5NYXRoLmZsb29yKCh0b29sYmFyV2lkdGggLyAyKSArIChhYnNvbHV0ZUxlZnQgLSBsKSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUubGVmdCA9IChhcnJvd19sZWZ0ICsgYXJyb3dNYXJnaW4gPiB0b29sYmFyLm9mZnNldFdpZHRoID8gdG9vbGJhci5vZmZzZXRXaWR0aCAtIGFycm93TWFyZ2luIDogYXJyb3dfbGVmdCA8IGFycm93TWFyZ2luID8gYXJyb3dNYXJnaW4gOiBhcnJvd19sZWZ0KSArICdweCc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dUb29sYmFySW5saW5lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghY29yZS5faXNJbmxpbmUpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhcjtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9vbGJhckNvbnRhaW5lcikgdG9vbGJhci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICAgIGVsc2UgdG9vbGJhci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgY29yZS5faW5saW5lVG9vbGJhckF0dHIud2lkdGggPSB0b29sYmFyLnN0eWxlLndpZHRoID0gb3B0aW9ucy50b29sYmFyV2lkdGg7XHJcbiAgICAgICAgICAgIGNvcmUuX2lubGluZVRvb2xiYXJBdHRyLnRvcCA9IHRvb2xiYXIuc3R5bGUudG9wID0gKG9wdGlvbnMudG9vbGJhckNvbnRhaW5lciA/IDAgOiAoLTEgLSB0b29sYmFyLm9mZnNldEhlaWdodCkpICsgJ3B4JztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLnNob3dJbmxpbmUgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5zaG93SW5saW5lKHRvb2xiYXIsIGNvbnRleHQsIGNvcmUpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQub25TY3JvbGxfd2luZG93KCk7XHJcbiAgICAgICAgICAgIGNvcmUuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oaWRlVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIWNvcmUuX25vdEhpZGVUb29sYmFyICYmICFjb3JlLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBjb3JlLl9pbmxpbmVUb29sYmFyQXR0ci5pc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uSW5wdXRfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgY29yZS5fZWRpdG9yUmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoZS5kYXRhID09PSBudWxsID8gJycgOiBlLmRhdGEgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGUuZGF0YSkgfHwgJyc7ICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIWNvcmUuX2NoYXJDb3VudChkYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uSW5wdXQgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5vbklucHV0KGUsIGNvcmUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pc1VuZWRpdGFibGVOb2RlOiBmdW5jdGlvbiAocmFuZ2UsIGlzRnJvbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gaXNGcm9udCA/IHJhbmdlLnN0YXJ0Q29udGFpbmVyIDogcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpc0Zyb250ID8gcmFuZ2Uuc3RhcnRPZmZzZXQgOiByYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdLZXkgPSBpc0Zyb250ID8gJ3ByZXZpb3VzU2libGluZycgOiAnbmV4dFNpYmxpbmcnO1xyXG4gICAgICAgICAgICBjb25zdCBpc0VsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDE7XHJcbiAgICAgICAgICAgIGxldCBzaWJsaW5nTm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHNpYmxpbmdOb2RlID0gZXZlbnQuX2lzVW5lZGl0YWJsZU5vZGVfZ2V0U2libGluZyhjb250YWluZXIuY2hpbGROb2Rlc1tvZmZzZXRdLCBzaWJsaW5nS2V5LCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmdOb2RlICYmIHNpYmxpbmdOb2RlLm5vZGVUeXBlID09PSAxICYmIHNpYmxpbmdOb2RlLmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICdmYWxzZSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9IGV2ZW50Ll9pc1VuZWRpdGFibGVOb2RlX2dldFNpYmxpbmcoY29udGFpbmVyLCBzaWJsaW5nS2V5LCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcmUuaXNFZGdlUG9pbnQoY29udGFpbmVyLCBvZmZzZXQsIGlzRnJvbnQgPyAnZnJvbnQnIDogJ2VuZCcpICYmIChzaWJsaW5nTm9kZSAmJiBzaWJsaW5nTm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBzaWJsaW5nTm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAnZmFsc2UnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9pc1VuZWRpdGFibGVOb2RlX2dldFNpYmxpbmc6IGZ1bmN0aW9uIChzZWxlY3ROb2RlLCBzaWJsaW5nS2V5LCBjb250YWluZXIpIHtcclxuICAgICAgICAgICAgaWYgKCFzZWxlY3ROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHNpYmxpbmdOb2RlID0gc2VsZWN0Tm9kZVtzaWJsaW5nS2V5XTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2libGluZ05vZGUpIHtcclxuICAgICAgICAgICAgICAgIHNpYmxpbmdOb2RlID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nTm9kZSA9IHNpYmxpbmdOb2RlID8gc2libGluZ05vZGVbc2libGluZ0tleV0gOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdOb2RlICYmICF1dGlsLmlzQ29tcG9uZW50KHNpYmxpbmdOb2RlKSkgc2libGluZ05vZGUgPSBzaWJsaW5nS2V5ID09PSAncHJldmlvdXNTaWJsaW5nJyA/IHNpYmxpbmdOb2RlLmZpcnN0RWxlbWVudENoaWxkIDogc2libGluZ05vZGUubGFzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzaWJsaW5nTm9kZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25TaG9ydGN1dEtleTogZmFsc2UsXHJcbiAgICAgICAgb25LZXlEb3duX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBlLmtleUNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZS5zaGlmdEtleTtcclxuICAgICAgICAgICAgY29uc3QgY3RybCA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHwga2V5Q29kZSA9PT0gOTEgfHwga2V5Q29kZSA9PT0gOTIgfHwga2V5Q29kZSA9PT0gMjI0O1xyXG4gICAgICAgICAgICBjb25zdCBhbHQgPSBlLmFsdEtleTtcclxuICAgICAgICAgICAgZXZlbnQuX0lFaXNDb21wb3NpbmcgPSBrZXlDb2RlID09PSAyMjk7XHJcblxyXG4gICAgICAgICAgICBjb3JlLnN1Ym1lbnVPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3JlLl9pc0JhbGxvb24pIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9oaWRlVG9vbGJhcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogU2hvcnRjdXRzICovXHJcbiAgICAgICAgICAgIGlmIChjdHJsICYmIGV2ZW50Ll9zaG9ydGN1dENvbW1hbmQoa2V5Q29kZSwgc2hpZnQpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb25TaG9ydGN1dEtleSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Ll9vblNob3J0Y3V0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb25TaG9ydGN1dEtleSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogZGVmYXVsdCBrZXkgYWN0aW9uICovXHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Ob2RlID0gY29yZS5nZXRTZWxlY3Rpb25Ob2RlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gY29yZS5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RSYW5nZSA9ICFyYW5nZS5jb2xsYXBzZWQgfHwgcmFuZ2Uuc3RhcnRDb250YWluZXIgIT09IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbXBvbmVudE5hbWUgPSBjb3JlLl9maWxlTWFuYWdlci5wbHVnaW5SZWdFeHAudGVzdChjb3JlLmN1cnJlbnRDb250cm9sbGVyTmFtZSkgPyBjb3JlLmN1cnJlbnRDb250cm9sbGVyTmFtZSA6ICcnO1xyXG4gICAgICAgICAgICBsZXQgZm9ybWF0RWwgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoc2VsZWN0aW9uTm9kZSwgbnVsbCkgfHwgc2VsZWN0aW9uTm9kZTtcclxuICAgICAgICAgICAgbGV0IHJhbmdlRWwgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChmb3JtYXRFbCwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgODogLyoqIGJhY2tzcGFjZSBrZXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdFJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlQ29tcG9uZW50TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUucGx1Z2luc1tmaWxlQ29tcG9uZW50TmFtZV0uZGVzdHJveS5jYWxsKGNvcmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RSYW5nZSAmJiBldmVudC5faGFyZERlbGV0ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNGb3JtYXRFbGVtZW50KGZvcm1hdEVsKSAmJiAhY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RFbGVtZW50Q2hpbGQgJiYgIXV0aWwuaXNDb21wb25lbnQoc2VsZWN0aW9uTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JlLl9zZXREZWZhdWx0Rm9ybWF0KG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0UmFuZ2UgJiYgIWZvcm1hdEVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgKHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwICYmICFzZWxlY3Rpb25Ob2RlLnByZXZpb3VzU2libGluZyAmJiAhdXRpbC5pc0xpc3RDZWxsKGZvcm1hdEVsKSAmJiBcclxuICAgICAgICAgICAgICAgICAgICAgKHV0aWwuaXNGb3JtYXRFbGVtZW50KGZvcm1hdEVsKSAmJiAoIXV0aWwuaXNGcmVlRm9ybWF0RWxlbWVudChmb3JtYXRFbCkgfHwgdXRpbC5pc0Nsb3N1cmVGcmVlRm9ybWF0RWxlbWVudChmb3JtYXRFbCkpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc3VyZSByYW5nZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Nsb3N1cmVSYW5nZUZvcm1hdEVsZW1lbnQoZm9ybWF0RWwucGFyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFpbnRhaW4gZGVmYXVsdCBmb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNXeXNpd3lnRGl2KGZvcm1hdEVsLnBhcmVudE5vZGUpICYmIGZvcm1hdEVsLmNoaWxkTm9kZXMubGVuZ3RoIDw9IDEgJiYgKCFmb3JtYXRFbC5maXJzdENoaWxkIHx8IHV0aWwub25seVplcm9XaWR0aFNwYWNlKGZvcm1hdEVsLnRleHRDb250ZW50KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdEVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IG9wdGlvbnMuZGVmYXVsdFRhZy50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RWwuaW5uZXJIVE1MID0gJzxicj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gZm9ybWF0RWwuYXR0cmlidXRlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXR0cnNbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RWwucmVtb3ZlQXR0cmlidXRlKGF0dHJzWzBdLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGb3JtYXQuaW5uZXJIVE1MID0gJzxicj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVsLnBhcmVudEVsZW1lbnQucmVwbGFjZUNoaWxkKGRlZmF1bHRGb3JtYXQsIGZvcm1hdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlLm5hdGl2ZUZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHJlbW92ZSB0YWdcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0RWwgJiYgcmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHJhbmdlLmVuZENvbnRhaW5lciAmJiBzZWxlY3Rpb25Ob2RlLm5vZGVUeXBlID09PSAzICYmICF1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlLnBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQgPyBzZWxlY3Rpb25Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMSA6IChyYW5nZS5lbmRPZmZzZXQgLSByYW5nZS5zdGFydE9mZnNldCkgPT09IHNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IHNlbGVjdGlvbk5vZGUucGFyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gc2VsZWN0aW9uTm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JSJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVsLmFwcGVuZENoaWxkKHByZXYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlLnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKHNlbGVjdGlvbk5vZGUsIG51bGwsIGZvcm1hdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0IDogcHJldi5ub2RlVHlwZSA9PT0gMyA/IHByZXYudGV4dENvbnRlbnQubGVuZ3RoIDogMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UocHJldiwgb2Zmc2V0LCBwcmV2LCBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhZ1tjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5faXNVbmVkaXRhYmxlTm9kZShyYW5nZSwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5lc3RlZCBsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0RWwgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQocmFuZ2Uuc3RhcnRDb250YWluZXIsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlRWwgPSB1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChmb3JtYXRFbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRWwgJiYgZm9ybWF0RWwgJiYgIXV0aWwuaXNDZWxsKHJhbmdlRWwpICYmICEvXkZJR0NBUFRJT04kL2kudGVzdChyYW5nZUVsLm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0xpc3RDZWxsKGZvcm1hdEVsKSAmJiB1dGlsLmlzTGlzdChyYW5nZUVsKSAmJiAodXRpbC5pc0xpc3RDZWxsKHJhbmdlRWwucGFyZW50Tm9kZSkgfHwgZm9ybWF0RWwucHJldmlvdXNFbGVtZW50U2libGluZykgJiYgKHNlbGVjdGlvbk5vZGUgPT09IGZvcm1hdEVsIHx8IChzZWxlY3Rpb25Ob2RlLm5vZGVUeXBlID09PSAzICYmICghc2VsZWN0aW9uTm9kZS5wcmV2aW91c1NpYmxpbmcgfHwgdXRpbC5pc0xpc3Qoc2VsZWN0aW9uTm9kZS5wcmV2aW91c1NpYmxpbmcpKSkpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAodXRpbC5nZXRGb3JtYXRFbGVtZW50KHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBudWxsKSAhPT0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHJhbmdlLmVuZENvbnRhaW5lciwgbnVsbCkgPyByYW5nZUVsLmNvbnRhaW5zKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSA6IChyYW5nZS5zdGFydE9mZnNldCA9PT0gMCAgJiYgcmFuZ2UuY29sbGFwc2VkKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciAhPT0gcmFuZ2UuZW5kQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlLnJlbW92ZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoLCByYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRDb250YWluZXIudGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuaGlzdG9yeS5wdXNoKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IGZvcm1hdEVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgcmFuZ2VFbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdENlbGwocHJldikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZMYXN0ID0gcHJldjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2LmNvbnRhaW5zKGZvcm1hdEVsKSAmJiB1dGlsLmlzTGlzdENlbGwocHJldkxhc3QpICYmIHV0aWwuaXNMaXN0KHByZXZMYXN0Lmxhc3RFbGVtZW50Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGFzdCA9IHByZXZMYXN0Lmxhc3RFbGVtZW50Q2hpbGQubGFzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh1dGlsLmlzTGlzdENlbGwocHJldkxhc3QpICYmIHV0aWwuaXNMaXN0KHByZXZMYXN0Lmxhc3RFbGVtZW50Q2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkxhc3QgPSBwcmV2TGFzdC5sYXN0RWxlbWVudENoaWxkICYmIHByZXZMYXN0Lmxhc3RFbGVtZW50Q2hpbGQubGFzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2TGFzdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbiA9IHByZXYgPT09IHJhbmdlRWwucGFyZW50Tm9kZSA/IHJhbmdlRWwucHJldmlvdXNTaWJsaW5nIDogcHJldi5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24gPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb24sIHJhbmdlRWwucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjb24ubm9kZVR5cGUgPT09IDMgPyBjb24udGV4dENvbnRlbnQubGVuZ3RoIDogMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBmb3JtYXRFbC5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBjb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNoaWxkID0gY2hpbGRyZW5bMF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lmluc2VydEJlZm9yZShjaGlsZCwgYWZ0ZXIubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGZvcm1hdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlRWwuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB1dGlsLnJlbW92ZUl0ZW0ocmFuZ2VFbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlLnNldFJhbmdlKGNvbiwgb2Zmc2V0LCBjb24sIG9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5oaXN0b3J5LnB1c2godHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIHJhbmdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0UmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW0gPSBjb21tb25Db247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29tbSAmJiBjb21tICE9PSByYW5nZUVsICYmICF1dGlsLmlzV3lzaXd5Z0Rpdihjb21tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tLnByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tbS5wcmV2aW91c1NpYmxpbmcubm9kZVR5cGUgPT09IDEgfHwgIXV0aWwub25seVplcm9XaWR0aFNwYWNlKGNvbW0ucHJldmlvdXNTaWJsaW5nLnRleHRDb250ZW50LnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IGNvbW0ucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFjaCAmJiByYW5nZUVsLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5kZXRhY2hSYW5nZUZvcm1hdEVsZW1lbnQocmFuZ2VFbCwgKHV0aWwuaXNMaXN0Q2VsbChmb3JtYXRFbCkgPyBbZm9ybWF0RWxdIDogbnVsbCksIG51bGwsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuaGlzdG9yeS5wdXNoKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdFJhbmdlICYmIGZvcm1hdEVsICYmIChyYW5nZS5zdGFydE9mZnNldCA9PT0gMCB8fCAoc2VsZWN0aW9uTm9kZSA9PT0gZm9ybWF0RWwgPyAhIWZvcm1hdEVsLmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXRdIDogZmFsc2UpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWwgPSBzZWxlY3Rpb25Ob2RlID09PSBmb3JtYXRFbCA/IGZvcm1hdEVsLmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXRdIDogc2VsZWN0aW9uTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IGZvcm1hdEVsLnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0IGZpbGUgY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlnbm9yZVpXUyA9IChjb21tb25Db24ubm9kZVR5cGUgPT09IDMgfHwgdXRpbC5pc0JyZWFrKGNvbW1vbkNvbikpICYmICFjb21tb25Db24ucHJldmlvdXNTaWJsaW5nICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbC5wcmV2aW91c1NpYmxpbmcgJiYgKHV0aWwuaXNDb21wb25lbnQoY29tbW9uQ29uLnByZXZpb3VzU2libGluZykgfHwgKGlnbm9yZVpXUyAmJiB1dGlsLmlzQ29tcG9uZW50KHByZXYpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVDb21wb25lbnRJbmZvID0gY29yZS5nZXRGaWxlQ29tcG9uZW50KHByZXYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVDb21wb25lbnRJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdEVsLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkgdXRpbC5yZW1vdmVJdGVtKGZvcm1hdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29yZS5zZWxlY3RDb21wb25lbnQoZmlsZUNvbXBvbmVudEluZm8udGFyZ2V0LCBmaWxlQ29tcG9uZW50SW5mby5wbHVnaW5OYW1lKSA9PT0gZmFsc2UpIGNvcmUuYmx1cigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1dGlsLmlzQ29tcG9uZW50KHByZXYpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHByZXYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIG5vbkVkaXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTm9uRWRpdGFibGUoc2VsLnByZXZpb3VzU2libGluZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oc2VsLnByZXZpb3VzU2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ2OiAvKiogZGVsZXRlIGtleSAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlQ29tcG9uZW50TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUucGx1Z2luc1tmaWxlQ29tcG9uZW50TmFtZV0uZGVzdHJveS5jYWxsKGNvcmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RSYW5nZSAmJiBldmVudC5faGFyZERlbGV0ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyB0YWdbY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIl1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuX2lzVW5lZGl0YWJsZU5vZGUocmFuZ2UsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlKSB8fCBzZWxlY3Rpb25Ob2RlLm5leHRTaWJsaW5nID09PSBudWxsIHx8ICh1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShzZWxlY3Rpb25Ob2RlLm5leHRTaWJsaW5nKSAmJiBzZWxlY3Rpb25Ob2RlLm5leHRTaWJsaW5nLm5leHRTaWJsaW5nID09PSBudWxsKSkgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgPT09IHNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0RWwgPSBmb3JtYXRFbC5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dEVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNDb21wb25lbnQobmV4dEVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShmb3JtYXRFbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZm9ybWF0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzVGFibGUobmV4dEVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IHV0aWwuZ2V0Q2hpbGRFbGVtZW50KG5leHRFbCwgdXRpbC5pc0NlbGwsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCA9IGNlbGwuZmlyc3RFbGVtZW50Q2hpbGQgfHwgY2VsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShjZWxsLCAwLCBjZWxsLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdCBmaWxlIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbXBvbmVudEluZm8gPSBjb3JlLmdldEZpbGVDb21wb25lbnQobmV4dEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlQ29tcG9uZW50SW5mbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcmUuc2VsZWN0Q29tcG9uZW50KGZpbGVDb21wb25lbnRJbmZvLnRhcmdldCwgZmlsZUNvbXBvbmVudEluZm8ucGx1Z2luTmFtZSkgPT09IGZhbHNlKSBjb3JlLmJsdXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRpbC5pc0NvbXBvbmVudChuZXh0RWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0obmV4dEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RSYW5nZSAmJiAoY29yZS5pc0VkZ2VQb2ludChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCkgfHwgKHNlbGVjdGlvbk5vZGUgPT09IGZvcm1hdEVsID8gISFmb3JtYXRFbC5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSA6IGZhbHNlKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uTm9kZSA9PT0gZm9ybWF0RWwgPyBmb3JtYXRFbC5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSA6IHNlbGVjdGlvbk5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBub25FZGl0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc05vbkVkaXRhYmxlKHNlbC5uZXh0U2libGluZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oc2VsLm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZUVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZm9ybWF0RWwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdENlbGwoZm9ybWF0RWwpICYmIHV0aWwuaXNMaXN0KHJhbmdlRWwpICYmIChzZWxlY3Rpb25Ob2RlID09PSBmb3JtYXRFbCB8fCAoc2VsZWN0aW9uTm9kZS5ub2RlVHlwZSA9PT0gMyAmJiAoIXNlbGVjdGlvbk5vZGUubmV4dFNpYmxpbmcgfHwgdXRpbC5pc0xpc3Qoc2VsZWN0aW9uTm9kZS5uZXh0U2libGluZykpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICh1dGlsLmdldEZvcm1hdEVsZW1lbnQocmFuZ2Uuc3RhcnRDb250YWluZXIsIG51bGwpICE9PSB1dGlsLmdldEZvcm1hdEVsZW1lbnQocmFuZ2UuZW5kQ29udGFpbmVyLCBudWxsKSA/IHJhbmdlRWwuY29udGFpbnMocmFuZ2UuZW5kQ29udGFpbmVyKSA6IChyYW5nZS5lbmRPZmZzZXQgPT09IHNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQubGVuZ3RoICYmIHJhbmdlLmNvbGxhcHNlZCkpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyICE9PSByYW5nZS5lbmRDb250YWluZXIpIGNvcmUucmVtb3ZlTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSB1dGlsLmdldEFycmF5SXRlbShmb3JtYXRFbC5jaGlsZHJlbiwgdXRpbC5pc0xpc3QsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHQgfHwgZm9ybWF0RWwubmV4dEVsZW1lbnRTaWJsaW5nIHx8IHJhbmdlRWwucGFyZW50Tm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmICh1dGlsLmlzTGlzdChuZXh0KSB8fCB1dGlsLmdldEFycmF5SXRlbShuZXh0LmNoaWxkcmVuLCB1dGlsLmlzTGlzdCwgZmFsc2UpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb24sIGNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNMaXN0KG5leHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXh0LmZpcnN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24gPSBjaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5bMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RWwuaW5zZXJ0QmVmb3JlKGNoaWxkcmVuWzBdLCBuZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uID0gbmV4dC5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV4dC5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UoY29uLCAwLCBjb24sIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5oaXN0b3J5LnB1c2godHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgOTogLyoqIHRhYiBrZXkgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUNvbXBvbmVudE5hbWUgfHwgb3B0aW9ucy50YWJEaXNhYmxlKSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0cmwgfHwgYWx0IHx8IHV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvbk5vZGUpKSBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFZGdlID0gKCFyYW5nZS5jb2xsYXBzZWQgfHwgY29yZS5pc0VkZ2VQb2ludChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEZvcm1hdHMgPSBjb3JlLmdldFNlbGVjdGVkRWxlbWVudHMobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IGNvcmUuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZjID0gdXRpbC5pc0xpc3RDZWxsKHNlbGVjdGVkRm9ybWF0c1swXSksIGxjID0gdXRpbC5pc0xpc3RDZWxsKHNlbGVjdGVkRm9ybWF0c1tzZWxlY3RlZEZvcm1hdHMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByID0ge3NjOiByYW5nZS5zdGFydENvbnRhaW5lciwgc286IHJhbmdlLnN0YXJ0T2Zmc2V0LCBlYzogcmFuZ2UuZW5kQ29udGFpbmVyLCBlbzogcmFuZ2UuZW5kT2Zmc2V0fTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VsZWN0ZWRGb3JtYXRzLmxlbmd0aCwgZjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBzZWxlY3RlZEZvcm1hdHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdENlbGwoZikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFzaGlmdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZXN0ZWQgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPiAwICYmIGlzRWRnZSAmJiBjb3JlLnBsdWdpbnMubGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByID0gY29yZS5wbHVnaW5zLmxpc3QuZWRpdEluc2lkZUxpc3QuY2FsbChjb3JlLCBzaGlmdCwgY2VsbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlQ2VsbCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3Rpb25Ob2RlLCB1dGlsLmlzQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUNlbGwgJiYgaXNFZGdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YWJsZUNlbGwsICd0YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB1dGlsLmdldExpc3RDaGlsZHJlbih0YWJsZSwgdXRpbC5pc0NlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IHNoaWZ0ID8gdXRpbC5wcmV2SWR4KGNlbGxzLCB0YWJsZUNlbGwpIDogdXRpbC5uZXh0SWR4KGNlbGxzLCB0YWJsZUNlbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IGNlbGxzLmxlbmd0aCAmJiAhc2hpZnQpIGlkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSAtMSAmJiBzaGlmdCkgaWR4ID0gY2VsbHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW92ZUNlbGwgPSBjZWxsc1tpZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3ZlQ2VsbCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlQ2VsbCA9IG1vdmVDZWxsLmZpcnN0RWxlbWVudENoaWxkIHx8IG1vdmVDZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShtb3ZlQ2VsbCwgMCwgbW92ZUNlbGwsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbGluZXMuY29uY2F0KGNlbGxzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmMgPSBsYyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBMaW5lcyB0YWIoNClcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJUZXh0ID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShuZXcgX3cuQXJyYXkoY29yZS5fdmFyaWFibGUudGFiU2l6ZSArIDEpLmpvaW4oJ1xcdTAwQTAnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFJhbmdlID0gY29yZS5pbnNlcnROb2RlKHRhYlRleHQsIG51bGwsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGV4dFJhbmdlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNjID0gdGFiVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zbyA9IHRleHRSYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5lYyA9IHRhYlRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZW8gPSB0ZXh0UmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY2hpbGQ7IGkgPD0gbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBsaW5lc1tpXS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkKSBjb250aW51ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0uaW5zZXJ0QmVmb3JlKHRhYlRleHQuY2xvbmVOb2RlKGZhbHNlKSwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudGV4dENvbnRlbnQgPSB0YWJUZXh0LnRleHRDb250ZW50ICsgY2hpbGQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQobGluZXNbMF0sICd0ZXh0JywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZENoaWxkID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQobGluZXNbbGVuXSwgJ3RleHQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZjICYmIGZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zYyA9IGZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc28gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxjICYmIGVuZENoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZWMgPSBlbmRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5lbyA9IGVuZENoaWxkLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBsaW5lcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxpbmU7IGkgPD0gbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZXNbaV0uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGxpbmUubGVuZ3RoLCBjaGlsZDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGxpbmVbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UoY2hpbGQpKSBjb250aW51ZTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFxzezEsNH0kLy50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXlxcc3sxLDR9Ly50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9eXFxzezEsNH0vLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHV0aWwuZ2V0Q2hpbGRFbGVtZW50KGxpbmVzWzBdLCAndGV4dCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZENoaWxkID0gdXRpbC5nZXRDaGlsZEVsZW1lbnQobGluZXNbbGVuXSwgJ3RleHQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmMgJiYgZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2MgPSBmaXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc28gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYyAmJiBlbmRDaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZWMgPSBlbmRDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVvID0gZW5kQ2hpbGQudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb3JlLnNldFJhbmdlKHIuc2MsIHIuc28sIHIuZWMsIHIuZW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICAgICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEzOiAvKiogZW50ZXIga2V5ICovXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJlZUZvcm1hdEVsID0gdXRpbC5nZXRGcmVlRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcmUuX2NoYXJUeXBlSFRNTCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50ZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIXNoaWZ0ICYmIGZyZWVGb3JtYXRFbCkgfHwgc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVySFRNTCA9ICc8YnI+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVySFRNTCA9ICc8JyArIGZvcm1hdEVsLm5vZGVOYW1lICsgJz48YnI+PC8nICsgZm9ybWF0RWwubm9kZU5hbWUgKyAnPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29yZS5jaGVja0NoYXJDb3VudChlbnRlckhUTUwsICdieXRlLWh0bWwnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0ICYmIC9eSFsxLTZdJC9pLnRlc3QoZm9ybWF0RWwubm9kZU5hbWUpICYmIGNvcmUuaXNFZGdlRm9ybWF0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0LCAnZW5kJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdGb3JtYXQgPSBjb3JlLmFwcGVuZEZvcm1hdFRhZyhmb3JtYXRFbCwgb3B0aW9ucy5kZWZhdWx0VGFnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShuZXdGb3JtYXQsIDEsIG5ld0Zvcm1hdCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGlmdCAmJiBmcmVlRm9ybWF0RWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gb3JtYXQgPSBzZWxlY3Rpb25Ob2RlID09PSBmcmVlRm9ybWF0RWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdTZWxlY3Rpb24gPSBjb3JlLmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNlbGVjdGlvbk5vZGUuY2hpbGROb2Rlcywgb2Zmc2V0ID0gd1NlbGVjdGlvbi5mb2N1c09mZnNldCwgcHJldiA9IHNlbGVjdGlvbk5vZGUucHJldmlvdXNFbGVtZW50U2libGluZywgbmV4dCA9IHNlbGVjdGlvbk5vZGUubmV4dFNpYmxpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQoZnJlZUZvcm1hdEVsKSAmJiAhIWNoaWxkcmVuICYmICgoc2VsZWN0aW9uRm9ybWF0ICYmIHJhbmdlLmNvbGxhcHNlZCAmJiBjaGlsZHJlbi5sZW5ndGggLSAxIDw9IG9mZnNldCArIDEgJiYgdXRpbC5pc0JyZWFrKGNoaWxkcmVuW29mZnNldF0pICYmICghY2hpbGRyZW5bb2Zmc2V0ICsgMV0gfHwgKCghY2hpbGRyZW5bb2Zmc2V0ICsgMl0gfHwgdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UoY2hpbGRyZW5bb2Zmc2V0ICsgMl0udGV4dENvbnRlbnQpKSAmJiBjaGlsZHJlbltvZmZzZXQgKyAxXS5ub2RlVHlwZSA9PT0gMyAmJiB1dGlsLm9ubHlaZXJvV2lkdGhTcGFjZShjaGlsZHJlbltvZmZzZXQgKyAxXS50ZXh0Q29udGVudCkpKSAmJiAgb2Zmc2V0ID4gMCAmJiB1dGlsLmlzQnJlYWsoY2hpbGRyZW5bb2Zmc2V0IC0gMV0pKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICghc2VsZWN0aW9uRm9ybWF0ICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKHNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQpICYmIHV0aWwuaXNCcmVhayhwcmV2KSAmJiAodXRpbC5pc0JyZWFrKHByZXYucHJldmlvdXNTaWJsaW5nKSB8fCAhdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UocHJldi5wcmV2aW91c1NpYmxpbmcudGV4dENvbnRlbnQpKSAmJiAoIW5leHQgfHwgKCF1dGlsLmlzQnJlYWsobmV4dCkgJiYgdXRpbC5vbmx5WmVyb1dpZHRoU3BhY2UobmV4dC50ZXh0Q29udGVudCkpKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uRm9ybWF0KSB1dGlsLnJlbW92ZUl0ZW0oY2hpbGRyZW5bb2Zmc2V0IC0gMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB1dGlsLnJlbW92ZUl0ZW0oc2VsZWN0aW9uTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFbCA9IGNvcmUuYXBwZW5kRm9ybWF0VGFnKGZyZWVGb3JtYXRFbCwgdXRpbC5pc0Zvcm1hdEVsZW1lbnQoZnJlZUZvcm1hdEVsLm5leHRFbGVtZW50U2libGluZykgPyBmcmVlRm9ybWF0RWwubmV4dEVsZW1lbnRTaWJsaW5nIDogbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvcHlGb3JtYXRBdHRyaWJ1dGVzKG5ld0VsLCBmcmVlRm9ybWF0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShuZXdFbCwgMSwgbmV3RWwsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Gb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5pbnNlcnRIVE1MKCgocmFuZ2UuY29sbGFwc2VkICYmIHV0aWwuaXNCcmVhayhyYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0IC0gMV0pKSA/ICc8YnI+JyA6ICc8YnI+PGJyPicpLCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzTm9kZSA9IHdTZWxlY3Rpb24uZm9jdXNOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldCA9IHdTZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJlZUZvcm1hdEVsID09PSBmb2N1c05vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c05vZGUgPSBmb2N1c05vZGUuY2hpbGROb2Rlc1t3T2Zmc2V0IC0gb2Zmc2V0ID4gMSA/IHdPZmZzZXQgLSAxIDogd09mZnNldF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShmb2N1c05vZGUsIDEsIGZvY3VzTm9kZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c05leHQgPSB3U2VsZWN0aW9uLmZvY3VzTm9kZS5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyID0gdXRpbC5jcmVhdGVFbGVtZW50KCdCUicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pbnNlcnROb2RlKGJyLCBudWxsLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJQcmV2ID0gYnIucHJldmlvdXNTaWJsaW5nLCBick5leHQgPSBici5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0JyZWFrKGZvY3VzTmV4dCkgJiYgIXV0aWwuaXNCcmVhayhiclByZXYpICYmICghYnJOZXh0IHx8IHV0aWwub25seVplcm9XaWR0aFNwYWNlKGJyTmV4dCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYnIuY2xvbmVOb2RlKGZhbHNlKSwgYnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UoYnIsIDEsIGJyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShick5leHQsIDAsIGJyTmV4dCwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9vblNob3J0Y3V0S2V5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0UmFuZ2UpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUVsICYmIGZvcm1hdEVsICYmICF1dGlsLmlzQ2VsbChyYW5nZUVsKSAmJiAhL15GSUdDQVBUSU9OJC9pLnRlc3QocmFuZ2VFbC5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBjb3JlLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcmUuaXNFZGdlUG9pbnQocmFuZ2UuZW5kQ29udGFpbmVyLCByYW5nZS5lbmRPZmZzZXQpICYmIHV0aWwuaXNMaXN0KHNlbGVjdGlvbk5vZGUubmV4dFNpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFbCA9IHV0aWwuY3JlYXRlRWxlbWVudCgnTEknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyID0gdXRpbC5jcmVhdGVFbGVtZW50KCdCUicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwuYXBwZW5kQ2hpbGQoYnIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0VsLCBmb3JtYXRFbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwuYXBwZW5kQ2hpbGQoc2VsZWN0aW9uTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UoYnIsIDEsIGJyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm5vZGVUeXBlID09PSAzID8gIXJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm5leHRFbGVtZW50U2libGluZyA6IHRydWUpICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKGZvcm1hdEVsLmlubmVyVGV4dC50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzTGlzdENlbGwocmFuZ2VFbC5wYXJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWwgPSBmb3JtYXRFbC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbCA9IHV0aWwuc3BsaXRFbGVtZW50KGZvcm1hdEVsLCBudWxsLCB1dGlsLmdldEVsZW1lbnREZXB0aChmb3JtYXRFbCkgLSAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld0VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0xpc3RDZWxsID0gdXRpbC5jcmVhdGVFbGVtZW50KCdMSScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0Q2VsbC5pbm5lckhUTUwgPSAnPGJyPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRWwuaW5zZXJ0QmVmb3JlKG5ld0xpc3RDZWxsLCBuZXdFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsID0gbmV3TGlzdENlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdGb3JtYXQgPSB1dGlsLmlzQ2VsbChyYW5nZUVsLnBhcmVudE5vZGUpID8gJ0RJVicgOiB1dGlsLmlzTGlzdChyYW5nZUVsLnBhcmVudE5vZGUpID8gJ0xJJyA6IHV0aWwuaXNGb3JtYXRFbGVtZW50KHJhbmdlRWwubmV4dEVsZW1lbnRTaWJsaW5nKSA/IHJhbmdlRWwubmV4dEVsZW1lbnRTaWJsaW5nLm5vZGVOYW1lIDogdXRpbC5pc0Zvcm1hdEVsZW1lbnQocmFuZ2VFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSA/IHJhbmdlRWwucHJldmlvdXNFbGVtZW50U2libGluZy5ub2RlTmFtZSA6IG9wdGlvbnMuZGVmYXVsdFRhZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbCA9IHV0aWwuY3JlYXRlRWxlbWVudChuZXdGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSBjb3JlLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUVsLCBbZm9ybWF0RWxdLCBudWxsLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLmNjLmluc2VydEJlZm9yZShuZXdFbCwgZWRnZS5lYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsLmlubmVySFRNTCA9ICc8YnI+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29weUZvcm1hdEF0dHJpYnV0ZXMobmV3RWwsIGZvcm1hdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbUFsbFBhcmVudHMoZm9ybWF0RWwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShuZXdFbCwgMSwgbmV3RWwsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUVsICYmIHV0aWwuZ2V0UGFyZW50RWxlbWVudChyYW5nZUVsLCAnRklHQ0FQVElPTicpICYmIHV0aWwuZ2V0UGFyZW50RWxlbWVudChyYW5nZUVsLCB1dGlsLmlzTGlzdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbCA9IGNvcmUuYXBwZW5kRm9ybWF0VGFnKGZvcm1hdEVsLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShmb3JtYXRFbCwgMCwgZm9ybWF0RWwsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVDb21wb25lbnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcENvbnRleHQgPSBjb250ZXh0W2ZpbGVDb21wb25lbnROYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcENvbnRleHQuX2NvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IGNvbnRhaW5lci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIHx8IGNvbnRhaW5lci5uZXh0RWxlbWVudFNpYmxpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0xpc3RDZWxsKGNvbnRhaW5lci5wYXJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0JSJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbCA9IHV0aWwuY3JlYXRlRWxlbWVudCh1dGlsLmlzRm9ybWF0RWxlbWVudChzaWJsaW5nKSA/IHNpYmxpbmcubm9kZU5hbWUgOiBvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gJzxicj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3RWwsIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JlLmNhbGxQbHVnaW4oZmlsZUNvbXBvbmVudE5hbWUsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3JlLnNlbGVjdENvbXBvbmVudChjb21wQ29udGV4dC5fZWxlbWVudCwgZmlsZUNvbXBvbmVudE5hbWUpID09PSBmYWxzZSkgY29yZS5ibHVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVDb21wb25lbnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hpZnQgJiYga2V5Q29kZSA9PT0gMTYpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IGNvcmUucGx1Z2lucy50YWJsZTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVBsdWdpbiAmJiAhdGFibGVQbHVnaW4uX3NoaWZ0ICYmICF0YWJsZVBsdWdpbi5fcmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChmb3JtYXRFbCwgdXRpbC5pc0NlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLm9uVGFibGVDZWxsTXVsdGlTZWxlY3QuY2FsbChjb3JlLCBjZWxsLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGlmdCAmJiAodXRpbC5pc09TWF9JT1MgPyBhbHQgOiBjdHJsKSAmJiBrZXlDb2RlID09PSAzMikge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ic3AgPSBjb3JlLmluc2VydE5vZGUodXRpbC5jcmVhdGVUZXh0Tm9kZSgnXFx1MDBhMCcpKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYnNwICYmIG5ic3AuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShuYnNwLmNvbnRhaW5lciwgbmJzcC5lbmRPZmZzZXQsIG5ic3AuY29udGFpbmVyLCBuYnNwLmVuZE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0S2V5ID0gIWN0cmwgJiYgIWFsdCAmJiAhc2VsZWN0UmFuZ2UgJiYgIWV2ZW50Ll9ub25UZXh0S2V5Q29kZS50ZXN0KGtleUNvZGUpO1xyXG4gICAgICAgICAgICBpZiAodGV4dEtleSAmJiByYW5nZS5jb2xsYXBzZWQgJiYgcmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHJhbmdlLmVuZENvbnRhaW5lciAmJiB1dGlsLmlzQnJlYWsocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6ZXJvV2lkdGggPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgY29yZS5pbnNlcnROb2RlKHplcm9XaWR0aCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZSh6ZXJvV2lkdGgsIDEsIHplcm9XaWR0aCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uS2V5RG93biA9PT0gJ2Z1bmN0aW9uJykgZnVuY3Rpb25zLm9uS2V5RG93bihlLCBjb3JlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbktleVVwX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5fb25TaG9ydGN1dEtleSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb3JlLl9lZGl0b3JSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBjb3JlLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBlLmtleUNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGN0cmwgPSBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5IHx8IGtleUNvZGUgPT09IDkxIHx8IGtleUNvZGUgPT09IDkyIHx8IGtleUNvZGUgPT09IDIyNDtcclxuICAgICAgICAgICAgY29uc3QgYWx0ID0gZS5hbHRLZXk7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Ob2RlID0gY29yZS5nZXRTZWxlY3Rpb25Ob2RlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29yZS5faXNCYWxsb29uICYmICgoY29yZS5faXNCYWxsb29uQWx3YXlzICYmIGtleUNvZGUgIT09IDI3KSB8fCAhcmFuZ2UuY29sbGFwc2VkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvcmUuX2lzQmFsbG9vbkFsd2F5cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlDb2RlICE9PSAyNykgZXZlbnQuX3Nob3dUb29sYmFyQmFsbG9vbkRlbGF5KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhckJhbGxvb24oKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiB3aGVuIGZvcm1hdCB0YWcgZGVsZXRlZCAqL1xyXG4gICAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gOCAmJiB1dGlsLmlzV3lzaXd5Z0RpdihzZWxlY3Rpb25Ob2RlKSAmJiBzZWxlY3Rpb25Ob2RlLnRleHRDb250ZW50ID09PSAnJyAmJiBzZWxlY3Rpb25Ob2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlLmlubmVySFRNTCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9Gb3JtYXRUYWcgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5pc0Zvcm1hdEVsZW1lbnQoY29yZS5fdmFyaWFibGUuY3VycmVudE5vZGVzWzBdKSA/IGNvcmUuX3ZhcmlhYmxlLmN1cnJlbnROb2Rlc1swXSA6IG9wdGlvbnMuZGVmYXVsdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBvRm9ybWF0VGFnLmlubmVySFRNTCA9ICc8YnI+JztcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlLmFwcGVuZENoaWxkKG9Gb3JtYXRUYWcpO1xyXG4gICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShvRm9ybWF0VGFnLCAwLCBvRm9ybWF0VGFnLCAwKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9hcHBseVRhZ0VmZmVjdHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHNlbGVjdGlvbk5vZGUsIG51bGwpO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc2VsZWN0aW9uTm9kZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIGlmICgoKCFmb3JtYXRFbCAmJiByYW5nZS5jb2xsYXBzZWQpIHx8IGZvcm1hdEVsID09PSByYW5nZUVsKSAmJiAhdXRpbC5pc0NvbXBvbmVudChzZWxlY3Rpb25Ob2RlKSAmJiAhdXRpbC5pc0xpc3Qoc2VsZWN0aW9uTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvcmUuX3NldERlZmF1bHRGb3JtYXQodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZUVsKSA/ICdESVYnIDogb3B0aW9ucy5kZWZhdWx0VGFnKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUgPSBjb3JlLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50Ll9kaXJlY3Rpb25LZXlDb2RlLnRlc3Qoa2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9hcHBseVRhZ0VmZmVjdHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGV4dEtleSA9ICFjdHJsICYmICFhbHQgJiYgIWV2ZW50Ll9ub25UZXh0S2V5Q29kZS50ZXN0KGtleUNvZGUpO1xyXG4gICAgICAgICAgICBpZiAodGV4dEtleSAmJiBzZWxlY3Rpb25Ob2RlLm5vZGVUeXBlID09PSAzICYmIHV0aWwuemVyb1dpZHRoUmVnRXhwLnRlc3Qoc2VsZWN0aW9uTm9kZS50ZXh0Q29udGVudCkgJiYgIShlLmlzQ29tcG9zaW5nICE9PSB1bmRlZmluZWQgPyBlLmlzQ29tcG9zaW5nIDogZXZlbnQuX0lFaXNDb21wb3NpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc28gPSByYW5nZS5zdGFydE9mZnNldCwgZW8gPSByYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udFplcm9XaWR0aENudCA9IChzZWxlY3Rpb25Ob2RlLnRleHRDb250ZW50LnN1YnN0cmluZygwLCBlbykubWF0Y2goZXZlbnQuX2Zyb250WmVyb1dpZHRoUmVnKSB8fCAnJykubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgc28gPSByYW5nZS5zdGFydE9mZnNldCAtIGZyb250WmVyb1dpZHRoQ250O1xyXG4gICAgICAgICAgICAgICAgZW8gPSByYW5nZS5lbmRPZmZzZXQgLSBmcm9udFplcm9XaWR0aENudDtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQgPSBzZWxlY3Rpb25Ob2RlLnRleHRDb250ZW50LnJlcGxhY2UodXRpbC56ZXJvV2lkdGhSZWdFeHAsICcnKTtcclxuICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2Uoc2VsZWN0aW9uTm9kZSwgc28gPCAwID8gMCA6IHNvLCBzZWxlY3Rpb25Ob2RlLCBlbyA8IDAgPyAwIDogZW8pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb3JlLl9jaGFyQ291bnQoJycpO1xyXG5cclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uS2V5VXAgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5vbktleVVwKGUsIGNvcmUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uU2Nyb2xsX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvcmUuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgaWYgKGNvcmUuX2lzQmFsbG9vbikgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uU2Nyb2xsID09PSAnZnVuY3Rpb24nKSBmdW5jdGlvbnMub25TY3JvbGwoZSwgY29yZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Gb2N1c193eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoY29yZS5fYW50aUJsdXIpIHJldHVybjtcclxuICAgICAgICAgICAgY29yZS5oYXNGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb3JlLl9pc0lubGluZSkgZXZlbnQuX3Nob3dUb29sYmFySW5saW5lKCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uRm9jdXMgPT09ICdmdW5jdGlvbicpIGZ1bmN0aW9ucy5vbkZvY3VzKGUsIGNvcmUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uQmx1cl93eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoY29yZS5fYW50aUJsdXIgfHwgY29yZS5fdmFyaWFibGUuaXNDb2RlVmlldykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb3JlLmhhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvcmUuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgaWYgKGNvcmUuX2lzSW5saW5lIHx8IGNvcmUuX2lzQmFsbG9vbikgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25zLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykgZnVuY3Rpb25zLm9uQmx1cihlLCBjb3JlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFjdGl2ZSBjbGFzcyByZXNldCBvZiBidXR0b25zXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRNYXAgPSBjb3JlLmNvbW1hbmRNYXA7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBsdWdpbnMgPSBjb3JlLmFjdGl2ZVBsdWdpbnM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjb21tYW5kTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaGFzT3duKGNvbW1hbmRNYXAsIGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVBsdWdpbnMuaW5kZXhPZihrZXkpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBwbHVnaW5zW2tleV0uYWN0aXZlLmNhbGwoY29yZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmRNYXAuT1VUREVOVCAmJiAvXk9VVERFTlQkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcC5PVVRERU5ULnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZE1hcC5JTkRFTlQgJiYgL15JTkRFTlQkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcC5JTkRFTlQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbW1hbmRNYXBba2V5XSwgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb3JlLl92YXJpYWJsZS5jdXJyZW50Tm9kZXMgPSBbXTtcclxuICAgICAgICAgICAgY29yZS5fdmFyaWFibGUuY3VycmVudE5vZGVzTWFwID0gW107XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNob3dQYXRoTGFiZWwpIGNvbnRleHQuZWxlbWVudC5uYXZpZ2F0aW9uLnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fcmVzaXppbmdCYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBjb3JlLnN1Ym1lbnVPZmYoKTtcclxuICAgICAgICAgICAgY29yZS5jb250cm9sbGVyc09mZigpO1xyXG5cclxuICAgICAgICAgICAgY29yZS5fdmFyaWFibGUucmVzaXplQ2xpZW50WSA9IGUuY2xpZW50WTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9zdXJlRnVuYygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xvc3VyZUZ1bmMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjbG9zdXJlRnVuYyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZV9lZGl0b3I6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZUludGVydmFsID0gY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0ICsgKGUuY2xpZW50WSAtIGNvcmUuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IChyZXNpemVJbnRlcnZhbCA8IGNvcmUuX3ZhcmlhYmxlLm1pblJlc2l6aW5nU2l6ZSA/IGNvcmUuX3ZhcmlhYmxlLm1pblJlc2l6aW5nU2l6ZSA6IHJlc2l6ZUludGVydmFsKSArICdweCc7XHJcbiAgICAgICAgICAgIGNvcmUuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25SZXNpemVfd2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvcmUuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNpdmVTaXplID0gZXZlbnQuX3Jlc3BvbnNpdmVCdXR0b25TaXplO1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2l2ZVNpemUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2l2ZVdpZHRoID0gJ2RlZmF1bHQnO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDEsIGxlbiA9IHJlc3BvbnNpdmVTaXplLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgcmVzcG9uc2l2ZVNpemVbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZVdpZHRoID0gcmVzcG9uc2l2ZVNpemVbaV0gKyAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5fcmVzcG9uc2l2ZUN1cnJlbnRTaXplICE9PSByZXNwb25zaXZlV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5fcmVzcG9uc2l2ZUN1cnJlbnRTaXplID0gcmVzcG9uc2l2ZVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5zZXRUb29sYmFyQnV0dG9ucyhldmVudC5fcmVzcG9uc2l2ZUJ1dHRvbnNbcmVzcG9uc2l2ZVdpZHRoXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuZmlsZUJyb3dzZXIgJiYgY29udGV4dC5maWxlQnJvd3Nlci5hcmVhLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIuYm9keS5zdHlsZS5tYXhIZWlnaHQgPSAoX3cuaW5uZXJIZWlnaHQgLSBjb250ZXh0LmZpbGVCcm93c2VyLmhlYWRlci5vZmZzZXRIZWlnaHQgLSA1MCkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29yZS5zdWJtZW51QWN0aXZlQnV0dG9uICYmIGNvcmUuc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgY29yZS5fc2V0TWVudVBvc2l0aW9uKGNvcmUuc3VibWVudUFjdGl2ZUJ1dHRvbiwgY29yZS5zdWJtZW51KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcmUuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgY29yZS5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiArPSAoX3cuaW5uZXJIZWlnaHQgLSBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRIZWlnaHQpIC0gY29yZS5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IGNvcmUuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29yZS5fdmFyaWFibGUuaXNDb2RlVmlldyAmJiBjb3JlLl9pc0lubGluZSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX3Nob3dUb29sYmFySW5saW5lKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvcmUuX2lmcmFtZUF1dG9IZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3JlLl9zdGlja3kpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gKGNvbnRleHQuZWxlbWVudC50b3BBcmVhLm9mZnNldFdpZHRoIC0gMikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQub25TY3JvbGxfd2luZG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblNjcm9sbF93aW5kb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGNvcmUuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbiB8fCBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCB8fCBvcHRpb25zLnN0aWNreVRvb2xiYXIgPCAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gKHRoaXMuc2Nyb2xsWSB8fCBfZC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSArIG9wdGlvbnMuc3RpY2t5VG9vbGJhcjtcclxuICAgICAgICAgICAgY29uc3QgZWRpdG9yVG9wID0gZXZlbnQuX2dldEVkaXRvck9mZnNldHMob3B0aW9ucy50b29sYmFyQ29udGFpbmVyKS50b3AgLSAoY29yZS5faXNJbmxpbmUgPyBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0IDogMCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoeSA8IGVkaXRvclRvcCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX29mZlN0aWNreVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh5ICsgY29yZS5fdmFyaWFibGUubWluUmVzaXppbmdTaXplID49IGVkaXRvckhlaWdodCArIGVkaXRvclRvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb3JlLl9zdGlja3kpIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSAoZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wICsgb3B0aW9ucy5zdGlja3lUb29sYmFyIC15IC0gY29yZS5fdmFyaWFibGUubWluUmVzaXppbmdTaXplKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBlZGl0b3JUb3ApIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9nZXRFZGl0b3JPZmZzZXRzOiBmdW5jdGlvbiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbCA9IGNvbnRhaW5lciB8fCBjb250ZXh0LmVsZW1lbnQudG9wQXJlYTtcclxuICAgICAgICAgICAgbGV0IHQgPSAwLCBsID0gMCwgcyA9IDA7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAob2Zmc2V0RWwpIHtcclxuICAgICAgICAgICAgICAgIHQgKz0gb2Zmc2V0RWwub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgbCArPSBvZmZzZXRFbC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgICAgICAgICAgcyArPSBvZmZzZXRFbC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXRFbCA9IG9mZnNldEVsLm9mZnNldFBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHRvcDogdCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IGwsXHJcbiAgICAgICAgICAgICAgICBzY3JvbGw6IHNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfZ2V0UGFnZUJvdHRvbVNwYWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfZC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gKGV2ZW50Ll9nZXRFZGl0b3JPZmZzZXRzKG51bGwpLnRvcCArIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLm9mZnNldEhlaWdodCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uU3RpY2t5VG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjb3JlLl9pc0lubGluZSAmJiAhb3B0aW9ucy50b29sYmFyQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5oZWlnaHQgPSBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LnRvb2xiYXIuc3R5bGUudG9wID0gb3B0aW9ucy5zdGlja3lUb29sYmFyICsgJ3B4JztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gY29yZS5faXNJbmxpbmUgPyBjb3JlLl9pbmxpbmVUb29sYmFyQXR0ci53aWR0aCA6IGVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudC50b29sYmFyLCAnc2UtdG9vbGJhci1zdGlja3knKTtcclxuICAgICAgICAgICAgY29yZS5fc3RpY2t5ID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb2ZmU3RpY2t5VG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5fc3RpY2t5RHVtbXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLnRvcCA9IGNvcmUuX2lzSW5saW5lID8gY29yZS5faW5saW5lVG9vbGJhckF0dHIudG9wIDogJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IGNvcmUuX2lzSW5saW5lID8gY29yZS5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhlbGVtZW50LnRvb2xiYXIsICdzZS10b29sYmFyLXN0aWNreScpO1xyXG4gICAgICAgICAgICBjb3JlLl9zdGlja3kgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY29kZVZpZXdBdXRvSGVpZ2h0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnNjcm9sbEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gRmlyZUZveCAtIHRhYmxlIGRlbGV0ZSwgQ2hyb21lIC0gaW1hZ2UsIHZpZGVvLCBhdWRpb1xyXG4gICAgICAgIF9oYXJkRGVsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gY29yZS5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBzYyA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBlYyA9IHJhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHRhYmxlXHJcbiAgICAgICAgICAgIGNvbnN0IHNDZWxsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc2MpO1xyXG4gICAgICAgICAgICBjb25zdCBlQ2VsbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVjKTtcclxuICAgICAgICAgICAgY29uc3Qgc0lzQ2VsbCA9IHV0aWwuaXNDZWxsKHNDZWxsKTtcclxuICAgICAgICAgICAgY29uc3QgZUlzQ2VsbCA9IHV0aWwuaXNDZWxsKGVDZWxsKTtcclxuICAgICAgICAgICAgaWYgKCgoc0lzQ2VsbCAmJiAhc0NlbGwucHJldmlvdXNFbGVtZW50U2libGluZyAmJiAhc0NlbGwucGFyZW50RWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB8fCAoZUlzQ2VsbCAmJiAhZUNlbGwubmV4dEVsZW1lbnRTaWJsaW5nICYmICFlQ2VsbC5wYXJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZykpICYmIHNDZWxsICE9PSBlQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzSXNDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHV0aWwuZ2V0UGFyZW50RWxlbWVudChlQ2VsbCwgdXRpbC5pc0NvbXBvbmVudCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZUlzQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbSh1dGlsLmdldFBhcmVudEVsZW1lbnQoc0NlbGwsIHV0aWwuaXNDb21wb25lbnQpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHV0aWwuZ2V0UGFyZW50RWxlbWVudChzQ2VsbCwgdXRpbC5pc0NvbXBvbmVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUubmF0aXZlRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHNDb21wID0gc2Mubm9kZVR5cGUgPT09IDEgPyB1dGlsLmdldFBhcmVudEVsZW1lbnQoc2MsICcuc2UtY29tcG9uZW50JykgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBlQ29tcCA9IGVjLm5vZGVUeXBlID09PSAxID8gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGVjLCAnLnNlLWNvbXBvbmVudCcpIDogbnVsbDtcclxuICAgICAgICAgICAgaWYgKHNDb21wKSB1dGlsLnJlbW92ZUl0ZW0oc0NvbXApO1xyXG4gICAgICAgICAgICBpZiAoZUNvbXApIHV0aWwucmVtb3ZlSXRlbShlQ29tcCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25QYXN0ZV93eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gdXRpbC5pc0lFID8gX3cuY2xpcGJvYXJkRGF0YSA6IGUuY2xpcGJvYXJkRGF0YTtcclxuICAgICAgICAgICAgaWYgKCFjbGlwYm9hcmREYXRhKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50Ll9kYXRhVHJhbnNmZXJBY3Rpb24oJ3Bhc3RlJywgZSwgY2xpcGJvYXJkRGF0YSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NldENsaXBib2FyZENvbXBvbmVudDogZnVuY3Rpb24gKGUsIGluZm8sIGNsaXBib2FyZERhdGEpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvaHRtbCcsIGluZm8uY29tcG9uZW50Lm91dGVySFRNTCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Db3B5X3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSB1dGlsLmlzSUUgPyBfdy5jbGlwYm9hcmREYXRhIDogZS5jbGlwYm9hcmREYXRhO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9ucy5vbkNvcHkgPT09ICdmdW5jdGlvbicgJiYgIWZ1bmN0aW9ucy5vbkNvcHkoZSwgY2xpcGJvYXJkRGF0YSwgY29yZSkpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSBjb3JlLmN1cnJlbnRGaWxlQ29tcG9uZW50SW5mbztcclxuICAgICAgICAgICAgaWYgKGluZm8gJiYgIXV0aWwuaXNJRSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX3NldENsaXBib2FyZENvbXBvbmVudChlLCBpbmZvLCBjbGlwYm9hcmREYXRhKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoaW5mby5jb21wb25lbnQsICdzZS1jb21wb25lbnQtY29weScpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29weSBlZmZlY3RcclxuICAgICAgICAgICAgICAgIF93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoaW5mby5jb21wb25lbnQsICdzZS1jb21wb25lbnQtY29weScpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uQ3V0X3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSB1dGlsLmlzSUUgPyBfdy5jbGlwYm9hcmREYXRhIDogZS5jbGlwYm9hcmREYXRhO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9ucy5vbkN1dCA9PT0gJ2Z1bmN0aW9uJyAmJiAhZnVuY3Rpb25zLm9uQ3V0KGUsIGNsaXBib2FyZERhdGEsIGNvcmUpKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmZvID0gY29yZS5jdXJyZW50RmlsZUNvbXBvbmVudEluZm87XHJcbiAgICAgICAgICAgIGlmIChpbmZvICYmICF1dGlsLmlzSUUpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9zZXRDbGlwYm9hcmRDb21wb25lbnQoZSwgaW5mbywgY2xpcGJvYXJkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oaW5mby5jb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgY29yZS5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICAgICAgICAgIGNvcmUuaGlzdG9yeS5wdXNoKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Ecm9wX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyO1xyXG4gICAgICAgICAgICBpZiAoIWRhdGFUcmFuc2ZlcikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzSUUpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvcmUucmVtb3ZlTm9kZSgpO1xyXG4gICAgICAgICAgICBldmVudC5fc2V0RHJvcExvY2F0aW9uU2VsZWN0aW9uKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gZXZlbnQuX2RhdGFUcmFuc2ZlckFjdGlvbignZHJvcCcsIGUsIGRhdGFUcmFuc2Zlcik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3NldERyb3BMb2NhdGlvblNlbGVjdGlvbjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUucmFuZ2VQYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UoZS5yYW5nZVBhcmVudCwgZS5yYW5nZU9mZnNldCwgZS5yYW5nZVBhcmVudCwgZS5yYW5nZU9mZnNldCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29yZS5fd2QuY2FyZXRSYW5nZUZyb21Qb2ludCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGNvcmUuX3dkLmNhcmV0UmFuZ2VGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xyXG4gICAgICAgICAgICAgICAgY29yZS5zZXRSYW5nZShyLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0LCByLmVuZENvbnRhaW5lciwgci5lbmRPZmZzZXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGNvcmUuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2Uoci5zdGFydENvbnRhaW5lciwgci5zdGFydE9mZnNldCwgci5lbmRDb250YWluZXIsIHIuZW5kT2Zmc2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9kYXRhVHJhbnNmZXJBY3Rpb246IGZ1bmN0aW9uICh0eXBlLCBlLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBwbGFpblRleHQsIGNsZWFuRGF0YTtcclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNJRSkge1xyXG4gICAgICAgICAgICAgICAgcGxhaW5UZXh0ID0gZGF0YS5nZXREYXRhKCdUZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gY29yZS5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcERpdiA9IHV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2M6IHJhbmdlLnN0YXJ0Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvOiByYW5nZS5zdGFydE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICBlYzogcmFuZ2UuZW5kQ29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGVvOiByYW5nZS5lbmRPZmZzZXRcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgdGVtcERpdi5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGVtcERpdi5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgbGVmdDowOyB3aWR0aDoxcHg7IGhlaWdodDoxcHg7IG92ZXJmbG93OmhpZGRlbjsnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQodGVtcERpdik7XHJcbiAgICAgICAgICAgICAgICB0ZW1wRGl2LmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgX3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYW5EYXRhID0gdGVtcERpdi5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHRlbXBEaXYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuc2V0UmFuZ2UodGVtcFJhbmdlLnNjLCB0ZW1wUmFuZ2Uuc28sIHRlbXBSYW5nZS5lYywgdGVtcFJhbmdlLmVvKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5fc2V0Q2xpcGJvYXJkRGF0YSh0eXBlLCBlLCBwbGFpblRleHQsIGNsZWFuRGF0YSwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBsYWluVGV4dCA9IGRhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gICAgICAgICAgICAgICAgY2xlYW5EYXRhID0gZGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSB8fCBwbGFpblRleHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuX3NldENsaXBib2FyZERhdGEodHlwZSwgZSwgcGxhaW5UZXh0LCBjbGVhbkRhdGEsIGRhdGEpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9zZXRDbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAodHlwZSwgZSwgcGxhaW5UZXh0LCBjbGVhbkRhdGEsIGRhdGEpIHtcclxuICAgICAgICAgICAgLy8gTVMgd29yZCwgT25lTm9kZSwgRXhjZWxcclxuICAgICAgICAgICAgY29uc3QgTVNEYXRhID0gL2NsYXNzPVtcIiddKk1zbyhOb3JtYWx8TGlzdCkvaS50ZXN0KGNsZWFuRGF0YSkgfHwgL2NvbnRlbnQ9W1wiJ10qV29yZC5Eb2N1bWVudC9pLnRlc3QoY2xlYW5EYXRhKSB8fCAvY29udGVudD1bXCInXSpPbmVOb3RlLkZpbGUvaS50ZXN0KGNsZWFuRGF0YSkgfHwgL2NvbnRlbnQ9W1wiJ10qRXhjZWwuU2hlZXQvaS50ZXN0KGNsZWFuRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChNU0RhdGEpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFuRGF0YSA9IGNsZWFuRGF0YS5yZXBsYWNlKC9cXG4vZywgJyAnKTtcclxuICAgICAgICAgICAgICAgIHBsYWluVGV4dCA9IHBsYWluVGV4dC5yZXBsYWNlKC9cXG4vZywgJyAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBsYWluVGV4dCA9IHBsYWluVGV4dC5yZXBsYWNlKC9cXG4vZywgJycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjbGVhbkRhdGEgPSBjb3JlLmNsZWFuSFRNTChjbGVhbkRhdGEsIGNvcmUucGFzdGVUYWdzV2hpdGVsaXN0UmVnRXhwKTtcclxuICAgICAgICAgICAgY29uc3QgbWF4Q2hhckNvdW50ID0gY29yZS5fY2hhckNvdW50KGNvcmUuX2NoYXJUeXBlSFRNTCA/IGNsZWFuRGF0YSA6IHBsYWluVGV4dCk7XHJcblxyXG4gICAgICAgICAgICAvLyBwYXN0ZSBldmVudFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3Bhc3RlJyAmJiB0eXBlb2YgZnVuY3Rpb25zLm9uUGFzdGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZnVuY3Rpb25zLm9uUGFzdGUoZSwgY2xlYW5EYXRhLCBtYXhDaGFyQ291bnQsIGNvcmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIGNsZWFuRGF0YSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRyb3AgZXZlbnRcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkcm9wJyAmJiB0eXBlb2YgZnVuY3Rpb25zLm9uRHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmdW5jdGlvbnMub25Ecm9wKGUsIGNsZWFuRGF0YSwgbWF4Q2hhckNvdW50LCBjb3JlKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSBjbGVhbkRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZmlsZXNcclxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBkYXRhLmZpbGVzO1xyXG4gICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCAmJiAhTVNEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoL15pbWFnZS8udGVzdChmaWxlc1swXS50eXBlKSAmJiBjb3JlLnBsdWdpbnMuaW1hZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMuaW5zZXJ0SW1hZ2UoZmlsZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1heENoYXJDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYW5EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbnMuaW5zZXJ0SFRNTChjbGVhbkRhdGEsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uTW91c2VNb3ZlX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChjb3JlLmlzRGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGUudGFyZ2V0LCB1dGlsLmlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29uc3QgbGluZUJyZWFrZXJTdHlsZSA9IGNvcmUuX2xpbmVCcmVha2VyLnN0eWxlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiAhY29yZS5jdXJyZW50Q29udHJvbGxlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN0eEVsID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWwgPSBjdHhFbC53eXNpd3lnO1xyXG4gICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCArPSBlbC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoZWwgJiYgIS9eKEJPRFl8SFRNTCkkL2kudGVzdChlbC5ub2RlTmFtZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdTY3JvbGwgPSBjdHhFbC53eXNpd3lnLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBldmVudC5fZ2V0RWRpdG9yT2Zmc2V0cyhudWxsKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvcCA9IHV0aWwuZ2V0T2Zmc2V0KGNvbXBvbmVudCwgY3R4RWwud3lzaXd5Z0ZyYW1lKS50b3AgKyB3U2Nyb2xsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IGUucGFnZVkgKyBzY3JvbGxUb3AgKyAob3B0aW9ucy5pZnJhbWUgJiYgIW9wdGlvbnMudG9vbGJhckNvbnRhaW5lciA/IGN0eEVsLnRvb2xiYXIub2Zmc2V0SGVpZ2h0IDogMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY29tcG9uZW50VG9wICsgKG9wdGlvbnMuaWZyYW1lID8gc2Nyb2xsVG9wIDogb2Zmc2V0cy50b3ApO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzTGlzdCA9IHV0aWwuaXNMaXN0Q2VsbChjb21wb25lbnQucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlyID0gJycsIHRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKChpc0xpc3QgPyAhY29tcG9uZW50LnByZXZpb3VzU2libGluZyA6ICF1dGlsLmlzRm9ybWF0RWxlbWVudChjb21wb25lbnQucHJldmlvdXNFbGVtZW50U2libGluZykpICYmIHkgPCAoYyArIDIwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IGNvbXBvbmVudFRvcDtcclxuICAgICAgICAgICAgICAgICAgICBkaXIgPSAndCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpc0xpc3QgPyAhY29tcG9uZW50Lm5leHRTaWJsaW5nIDogIXV0aWwuaXNGb3JtYXRFbGVtZW50KGNvbXBvbmVudC5uZXh0RWxlbWVudFNpYmxpbmcpKSAmJiB5ID4gKGMgKyBjb21wb25lbnQub2Zmc2V0SGVpZ2h0IC0gMjApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gY29tcG9uZW50VG9wICsgY29tcG9uZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBkaXIgPSAnYic7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha2VyU3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29yZS5fdmFyaWFibGUuX2xpbmVCcmVha0NvbXAgPSBjb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb3JlLl92YXJpYWJsZS5fbGluZUJyZWFrRGlyID0gZGlyO1xyXG4gICAgICAgICAgICAgICAgbGluZUJyZWFrZXJTdHlsZS50b3AgPSAodG9wIC0gd1Njcm9sbCkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgY29yZS5fbGluZUJyZWFrZXJCdXR0b24uc3R5bGUubGVmdCA9ICh1dGlsLmdldE9mZnNldChjb21wb25lbnQpLmxlZnQgKyAoY29tcG9uZW50Lm9mZnNldFdpZHRoIC8gMikgLSAxNSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgbGluZUJyZWFrZXJTdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfSAvLyBvZmYgbGluZSBicmVha2VyXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmVCcmVha2VyU3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lQnJlYWtlclN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25Nb3VzZURvd25fbGluZUJyZWFrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uTGluZUJyZWFrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb3JlLl92YXJpYWJsZS5fbGluZUJyZWFrQ29tcDtcclxuICAgICAgICAgICAgY29uc3QgZGlyID0gIXRoaXMgPyBjb3JlLl92YXJpYWJsZS5fbGluZUJyZWFrRGlyIDogdGhpcztcclxuICAgICAgICAgICAgY29uc3QgaXNMaXN0ID0gdXRpbC5pc0xpc3RDZWxsKGNvbXBvbmVudC5wYXJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChpc0xpc3QgPyAnQlInIDogdXRpbC5pc0NlbGwoY29tcG9uZW50LnBhcmVudE5vZGUpID8gJ0RJVicgOiBvcHRpb25zLmRlZmF1bHRUYWcpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTGlzdCkgZm9ybWF0LmlubmVySFRNTCA9ICc8YnI+JztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3JlLl9jaGFyVHlwZUhUTUwgJiYgIWNvcmUuY2hlY2tDaGFyQ291bnQoZm9ybWF0Lm91dGVySFRNTCwgJ2J5dGUtaHRtbCcpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZm9ybWF0LCBkaXIgPT09ICd0JyA/IGNvbXBvbmVudCA6IGNvbXBvbmVudC5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgIGNvcmUuX2xpbmVCcmVha2VyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGNvcmUuX3ZhcmlhYmxlLl9saW5lQnJlYWtDb21wID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzRWwgPSBpc0xpc3QgPyBmb3JtYXQgOiBmb3JtYXQuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgY29yZS5zZXRSYW5nZShmb2N1c0VsLCAxLCBmb2N1c0VsLCAxKTtcclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2FkZEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50V3lzaXd5ZyA9IG9wdGlvbnMuaWZyYW1lID8gY29yZS5fd3cgOiBjb250ZXh0LmVsZW1lbnQud3lzaXd5ZztcclxuXHJcbiAgICAgICAgICAgIC8qKiB0b29sYmFyIGV2ZW50ICovXHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Ll9idXR0b25zRXZlbnRIYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fbWVudVRyYXkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQuX2J1dHRvbnNFdmVudEhhbmRsZXIsIGZhbHNlKTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudC5vbkNsaWNrX3Rvb2xiYXIsIGZhbHNlKTtcclxuICAgICAgICAgICAgLyoqIGVkaXRvciBhcmVhICovXHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5vbk1vdXNlRG93bl93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcih1dGlsLmlzSUUgPyAndGV4dGlucHV0JyA6ICdpbnB1dCcsIGV2ZW50Lm9uSW5wdXRfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2ZW50Lm9uS2V5RG93bl93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50Lm9uS2V5VXBfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBldmVudC5vblBhc3RlX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgZXZlbnRXeXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLCBldmVudC5vbkNvcHlfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignY3V0JywgZXZlbnQub25DdXRfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGV2ZW50Lm9uRHJvcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50Lm9uRm9jdXNfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Lm9uQmx1cl93eXNpd3lnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAvKiogbGluZSBicmVha2VyICovXHJcbiAgICAgICAgICAgIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQgPSB7IGE6IGV2ZW50Ll9vbkxpbmVCcmVhay5iaW5kKCcnKSwgdDogZXZlbnQuX29uTGluZUJyZWFrLmJpbmQoJ3QnKSwgYjogZXZlbnQuX29uTGluZUJyZWFrLmJpbmQoJ2InKSB9O1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQub25Nb3VzZU1vdmVfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBjb3JlLl9saW5lQnJlYWtlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5fb25Nb3VzZURvd25fbGluZUJyZWFrLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvcmUuX2xpbmVCcmVha2VyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQuX2xpbmVCcmVha2VyQmluZC5hLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5saW5lQnJlYWtlcl90LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQubGluZUJyZWFrZXJfYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5fbGluZUJyZWFrZXJCaW5kLmIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiBFdmVudHMgYXJlIHJlZ2lzdGVyZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgdGFibGUgcGx1Z2luLiAgKi9cclxuICAgICAgICAgICAgaWYgKGNvcmUucGx1Z2lucy50YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRXeXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBldmVudC5vbk1vdXNlRG93bl93eXNpd3lnLCB7cGFzc2l2ZTogdHJ1ZSwgdXNlQ2FwdHVyZTogZmFsc2V9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLyoqIGNvZGUgdmlldyBhcmVhIGF1dG8gbGluZSAqL1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyAmJiAhb3B0aW9ucy5jb2RlTWlycm9yRWRpdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQuX2NvZGVWaWV3QXV0b0hlaWdodCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudC5fY29kZVZpZXdBdXRvSGVpZ2h0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50Ll9jb2RlVmlld0F1dG9IZWlnaHQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHJlc2l6aW5nQmFyICovXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICgvXFxkKy8udGVzdChvcHRpb25zLmhlaWdodCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQub25Nb3VzZURvd25fcmVzaXppbmdCYXIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIsICdzZS1yZXNpemluZy1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8qKiB3aW5kb3cgZXZlbnQgKi9cclxuICAgICAgICAgICAgZXZlbnQuX3NldFJlc3BvbnNpdmVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIF93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGV2ZW50Lm9uUmVzaXplX3dpbmRvdyk7XHJcbiAgICAgICAgICAgIF93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdyk7XHJcblxyXG4gICAgICAgICAgICBfdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3csIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RpY2t5VG9vbGJhciA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBfdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93aW5kb3csIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZW1vdmVFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudFd5c2l3eWcgPSBvcHRpb25zLmlmcmFtZSA/IGNvcmUuX3d3IDogY29udGV4dC5lbGVtZW50Lnd5c2l3eWc7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5fYnV0dG9uc0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fbWVudVRyYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQuX2J1dHRvbnNFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfdG9vbGJhcik7XHJcblxyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQub25Nb3VzZURvd25fd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKHV0aWwuaXNJRSA/ICd0ZXh0aW5wdXQnIDogJ2lucHV0JywgZXZlbnQub25JbnB1dF93eXNpd3lnKTtcclxuICAgICAgICAgICAgZXZlbnRXeXNpd3lnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBldmVudC5vbktleURvd25fd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50Lm9uS2V5VXBfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50Lm9uUGFzdGVfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb3B5JywgZXZlbnQub25Db3B5X3d5c2l3eWcpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignY3V0JywgZXZlbnQub25DdXRfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgZXZlbnQub25Ecm9wX3d5c2l3eWcpO1xyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZXZlbnQub25TY3JvbGxfd3lzaXd5Zyk7XHJcblxyXG4gICAgICAgICAgICBldmVudFd5c2l3eWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQub25Nb3VzZU1vdmVfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGNvcmUuX2xpbmVCcmVha2VyQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Ll9vbk1vdXNlRG93bl9saW5lQnJlYWspO1xyXG4gICAgICAgICAgICBjb3JlLl9saW5lQnJlYWtlckJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQuYSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5saW5lQnJlYWtlcl90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQudCk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5saW5lQnJlYWtlcl9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQuYik7XHJcbiAgICAgICAgICAgIGV2ZW50Ll9saW5lQnJlYWtlckJpbmQgPSBudWxsO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZXZlbnRXeXNpd3lnLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBldmVudC5vbk1vdXNlRG93bl93eXNpd3lnLCB7cGFzc2l2ZTogdHJ1ZSwgdXNlQ2FwdHVyZTogZmFsc2V9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50Lm9uRm9jdXNfd3lzaXd5Zyk7XHJcbiAgICAgICAgICAgIGV2ZW50V3lzaXd5Zy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgZXZlbnQub25CbHVyX3d5c2l3eWcpO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2ZW50Ll9jb2RlVmlld0F1dG9IZWlnaHQpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50Ll9jb2RlVmlld0F1dG9IZWlnaHQpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50Ll9jb2RlVmlld0F1dG9IZWlnaHQpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGNvbnRleHQuZWxlbWVudC5yZXNpemluZ0Jhcikge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Lm9uTW91c2VEb3duX3Jlc2l6aW5nQmFyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgX3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZXZlbnQub25SZXNpemVfd2luZG93KTtcclxuICAgICAgICAgICAgX3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZXZlbnQub25TY3JvbGxfd2luZG93KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2V0UmVzcG9uc2l2ZVRvb2xiYXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKF9yZXNwb25zaXZlQnV0dG9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIF9yZXNwb25zaXZlQnV0dG9ucyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGV2ZW50Ll9yZXNwb25zaXZlQ3VycmVudFNpemUgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVBcnJheSA9IGV2ZW50Ll9yZXNwb25zaXZlQnV0dG9uU2l6ZSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25zT2JqID0gZXZlbnQuX3Jlc3BvbnNpdmVCdXR0b25zID0ge2RlZmF1bHQ6IF9yZXNwb25zaXZlQnV0dG9uc1swXX07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBfcmVzcG9uc2l2ZUJ1dHRvbnMubGVuZ3RoLCBzaXplLCBidXR0b25Hcm91cDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Hcm91cCA9IF9yZXNwb25zaXZlQnV0dG9uc1tpXTtcclxuICAgICAgICAgICAgICAgIHNpemUgPSBidXR0b25Hcm91cFswXSAqIDE7XHJcbiAgICAgICAgICAgICAgICBzaXplQXJyYXkucHVzaChzaXplKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnNPYmpbc2l6ZV0gPSBidXR0b25Hcm91cFsxXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2l6ZUFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KS51bnNoaWZ0KCdkZWZhdWx0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKiogZnVuY3Rpb25zICovXHJcbiAgICBjb25zdCBmdW5jdGlvbnMgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvcmUsIFV0aWwgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29yZTogY29yZSxcclxuICAgICAgICB1dGlsOiB1dGlsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZnVuY3Rpb25zXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgRXZlbnQgT2JqZWN0XHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBvbmxvYWQ6IG51bGwsXHJcbiAgICAgICAgb25TY3JvbGw6IG51bGwsXHJcbiAgICAgICAgb25Nb3VzZURvd246IG51bGwsXHJcbiAgICAgICAgb25DbGljazogbnVsbCxcclxuICAgICAgICBvbklucHV0OiBudWxsLFxyXG4gICAgICAgIG9uS2V5RG93bjogbnVsbCxcclxuICAgICAgICBvbktleVVwOiBudWxsLFxyXG4gICAgICAgIG9uQ29weTogbnVsbCxcclxuICAgICAgICBvbkN1dDogbnVsbCxcclxuICAgICAgICBvbkZvY3VzOiBudWxsLFxyXG4gICAgICAgIG9uQmx1cjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGZ1bmN0aW9uc1xyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBDdXJyZW50IGNvbnRlbnRzXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBvbkNoYW5nZTogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGZ1bmN0aW9ucyAoZHJvcCwgcGFzdGUpXHJcbiAgICAgICAgICogV2hlbiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgc3RvcHBlZC5cclxuICAgICAgICAgKiBJZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLCB0aGUgY2xlYW5EYXRhIHZhbHVlIGlzIG1vZGlmaWVkIHRvIHRoZSByZXR1cm4gdmFsdWUuXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGUgRXZlbnQgb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGVhbkRhdGEgSFRNTCBzdHJpbmcgbW9kaWZpZWQgZm9yIGVkaXRvciBmb3JtYXQuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBtYXhDaGFydENvdW50IG9wdGlvbiAodHJ1ZSBpZiBtYXggY2hhcmFjdGVyIGlzIGV4Y2VlZGVkKVxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW58U3RyaW5nfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uRHJvcDogbnVsbCxcclxuICAgICAgICBvblBhc3RlOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBpbmxpbmUgdG9vbGJhciBpcyBwb3NpdGlvbmVkIGFuZCBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRvb2xiYXIgVG9vbGJhciBFbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgVGhlIGVkaXRvcidzIGNvbnRleHQgb2JqZWN0IChlZGl0b3IuZ2V0Q29udGV4dCgpKVxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0lubGluZTogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENhbGxlZCBqdXN0IGFmdGVyIHRoZSBjb250cm9sbGVyIGlzIHBvc2l0aW9uZWQgYW5kIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICAgICAqIGNvbnRyb2xsZXIgLSBlZGl0aW5nIGVsZW1lbnRzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIFtpbWFnZSByZXNpemluZywgdGFibGUgZWRpdG9yLCBsaW5rIGVkaXRvci4uXV1cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgY2FsbGVkIHRoZSBjb250cm9sbGVyXHJcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gY29udHJvbGxlcnMgQXJyYXkgb2YgQ29udHJvbGxlciBlbGVtZW50c1xyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0NvbnRyb2xsZXI6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBbiBldmVudCB3aGVuIHRvZ2dsaW5nIGJldHdlZW4gY29kZSB2aWV3IGFuZCB3eXNpd3lnIHZpZXcuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0NvZGVWaWV3IFdoZXRoZXIgdGhlIGN1cnJlbnQgY29kZSB2aWV3IG1vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29yZSBDb3JlIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUNvZGVWaWV3OiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQW4gZXZlbnQgd2hlbiB0b2dnbGluZyBmdWxsIHNjcmVlbi5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRnVsbFNjcmVlbiBXaGV0aGVyIHRoZSBjdXJyZW50IGZ1bGwgc2NyZWVuIG1vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29yZSBDb3JlIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW46IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUgaW1hZ2UgdXBsb2FkXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIFJlc3BvbnNlIG9iamVjdFxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIElucHV0IGluZm9ybWF0aW9uXHJcbiAgICAgICAgICogLSBsaW5rVmFsdWU6IExpbmsgdXJsIHZhbHVlXHJcbiAgICAgICAgICogLSBsaW5rTmV3V2luZG93OiBPcGVuIGluIG5ldyB3aW5kb3cgQ2hlY2sgVmFsdWVcclxuICAgICAgICAgKiAtIGlucHV0V2lkdGg6IFZhbHVlIG9mIHdpZHRoIGlucHV0XHJcbiAgICAgICAgICogLSBpbnB1dEhlaWdodDogVmFsdWUgb2YgaGVpZ2h0IGlucHV0XHJcbiAgICAgICAgICogLSBhbGlnbjogQWxpZ24gQ2hlY2sgVmFsdWVcclxuICAgICAgICAgKiAtIGlzVXBkYXRlOiBVcGRhdGUgaW1hZ2UgaWYgdHJ1ZSwgY3JlYXRlIGltYWdlIGlmIGZhbHNlXHJcbiAgICAgICAgICogLSBlbGVtZW50OiBJZiBpc1VwZGF0ZSBpcyB0cnVlLCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGltYWdlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW1hZ2VVcGxvYWRIYW5kbGVyOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIHZpZGVvIHVwbG9hZFxyXG4gICAgICAgICAqIEBwYXJhbSB4bWxIdHRwIHhtbEh0dHBSZXF1ZXN0IG9iamVjdFxyXG4gICAgICAgICAqIEBwYXJhbSBpbmZvIElucHV0IGluZm9ybWF0aW9uXHJcbiAgICAgICAgICogLSBpbnB1dFdpZHRoOiBWYWx1ZSBvZiB3aWR0aCBpbnB1dFxyXG4gICAgICAgICAqIC0gaW5wdXRIZWlnaHQ6IFZhbHVlIG9mIGhlaWdodCBpbnB1dFxyXG4gICAgICAgICAqIC0gYWxpZ246IEFsaWduIENoZWNrIFZhbHVlXHJcbiAgICAgICAgICogLSBpc1VwZGF0ZTogVXBkYXRlIHZpZGVvIGlmIHRydWUsIGNyZWF0ZSB2aWRlbyBpZiBmYWxzZVxyXG4gICAgICAgICAqIC0gZWxlbWVudDogSWYgaXNVcGRhdGUgaXMgdHJ1ZSwgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2aWRlby5cclxuICAgICAgICAgKiBAcGFyYW0gY29yZSBDb3JlIG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHZpZGVvVXBsb2FkSGFuZGxlcjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEl0IHJlcGxhY2VzIHRoZSBkZWZhdWx0IGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBhdWRpbyB1cGxvYWRcclxuICAgICAgICAgKiBAcGFyYW0geG1sSHR0cCB4bWxIdHRwUmVxdWVzdCBvYmplY3RcclxuICAgICAgICAgKiBAcGFyYW0gaW5mbyBJbnB1dCBpbmZvcm1hdGlvblxyXG4gICAgICAgICAqIC0gaXNVcGRhdGU6IFVwZGF0ZSBhdWRpbyBpZiB0cnVlLCBjcmVhdGUgYXVkaW8gaWYgZmFsc2VcclxuICAgICAgICAgKiAtIGVsZW1lbnQ6IElmIGlzVXBkYXRlIGlzIHRydWUsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXVkaW8uXHJcbiAgICAgICAgICogQHBhcmFtIGNvcmUgQ29yZSBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBhdWRpb1VwbG9hZEhhbmRsZXI6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgYmVmb3JlIHRoZSBpbWFnZSBpcyB1cGxvYWRlZFxyXG4gICAgICAgICAqIElmIHRydWUgaXMgcmV0dXJuZWQsIHRoZSBpbnRlcm5hbCB1cGxvYWQgcHJvY2VzcyBydW5zIG5vcm1hbGx5LlxyXG4gICAgICAgICAqIElmIGZhbHNlIGlzIHJldHVybmVkLCBubyBpbWFnZSB1cGxvYWQgaXMgcGVyZm9ybWVkLlxyXG4gICAgICAgICAqIElmIG5ldyBmaWxlTGlzdCBhcmUgcmV0dXJuZWQsICByZXBsYWNlZCB0aGUgcHJldmlvdXMgZmlsZUxpc3RcclxuICAgICAgICAgKiBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQsIGl0IHdhaXRzIHVudGlsIFwidXBsb2FkSGFuZGxlclwiIGlzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGZpbGVzIEZpbGVzIGFycmF5XHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gaW5mbzoge1xyXG4gICAgICAgICAqIC0gbGlua1ZhbHVlOiBMaW5rIHVybCB2YWx1ZVxyXG4gICAgICAgICAqIC0gbGlua05ld1dpbmRvdzogT3BlbiBpbiBuZXcgd2luZG93IENoZWNrIFZhbHVlXHJcbiAgICAgICAgICogLSBpbnB1dFdpZHRoOiBWYWx1ZSBvZiB3aWR0aCBpbnB1dFxyXG4gICAgICAgICAqIC0gaW5wdXRIZWlnaHQ6IFZhbHVlIG9mIGhlaWdodCBpbnB1dFxyXG4gICAgICAgICAqIC0gYWxpZ246IEFsaWduIENoZWNrIFZhbHVlXHJcbiAgICAgICAgICogLSBpc1VwZGF0ZTogVXBkYXRlIGltYWdlIGlmIHRydWUsIGNyZWF0ZSBpbWFnZSBpZiBmYWxzZVxyXG4gICAgICAgICAqIC0gZWxlbWVudDogSWYgaXNVcGRhdGUgaXMgdHJ1ZSwgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbWFnZS5cclxuICAgICAgICAgKiB9XHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3RcclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGxvYWRIYW5kbGVyIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCwgaXQgd2FpdHMgdW50aWwgXCJ1cGxvYWRIYW5kbGVyXCIgaXMgZXhlY3V0ZWQuXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgXCJ1cGxvYWRIYW5kbGVyXCIgaXMgYW4gdXBsb2FkIGZ1bmN0aW9uIHdpdGggXCJjb3JlXCIgYW5kIFwiaW5mb1wiIGJvdW5kLlxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgIFt1cGxvYWQgZmlsZXNdIDogdXBsb2FkSGFuZGxlcihmaWxlcyBvciBbbmV3IEZpbGUoLi4uKSxdKVxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgIFtlcnJvcl0gICAgICAgIDogdXBsb2FkSGFuZGxlcihcIkVycm9yIG1lc3NhZ2VcIilcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICBbSnVzdCBmaW5pc2hdICA6IHVwbG9hZEhhbmRsZXIoKVxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgIFtkaXJlY3RseSByZWdpc3Rlcl0gOiB1cGxvYWRIYW5kbGVyKHJlc3BvbnNlKSAvLyBTYW1lIGZvcm1hdCBhcyBcImltYWdlVXBsb2FkVXJsXCIgcmVzcG9uc2VcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgpIHtcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJlcnJvck1lc3NhZ2VcIjogXCJpbnNlcnQgZXJyb3IgbWVzc2FnZVwiLFxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlc3VsdFwiOiBbIHsgXCJ1cmxcIjogXCIuLi5cIiwgXCJuYW1lXCI6IFwiLi4uXCIsIFwic2l6ZVwiOiBcIjk5OVwiIH0sIF1cclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufEFycmF5fHVuZGVmaW5lZH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBvbkltYWdlVXBsb2FkQmVmb3JlOiBudWxsLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgYmVmb3JlIHRoZSB2aWRlbyBpcyB1cGxvYWRlZFxyXG4gICAgICAgICAqIElmIHRydWUgaXMgcmV0dXJuZWQsIHRoZSBpbnRlcm5hbCB1cGxvYWQgcHJvY2VzcyBydW5zIG5vcm1hbGx5LlxyXG4gICAgICAgICAqIElmIGZhbHNlIGlzIHJldHVybmVkLCBubyB2aWRlbyhpZnJhbWUsIHZpZGVvKSB1cGxvYWQgaXMgcGVyZm9ybWVkLlxyXG4gICAgICAgICAqIElmIG5ldyBmaWxlTGlzdCBhcmUgcmV0dXJuZWQsICByZXBsYWNlZCB0aGUgcHJldmlvdXMgZmlsZUxpc3RcclxuICAgICAgICAgKiBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQsIGl0IHdhaXRzIHVudGlsIFwidXBsb2FkSGFuZGxlclwiIGlzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGZpbGVzIEZpbGVzIGFycmF5XHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gaW5mbzoge1xyXG4gICAgICAgICAqIC0gaW5wdXRXaWR0aDogVmFsdWUgb2Ygd2lkdGggaW5wdXRcclxuICAgICAgICAgKiAtIGlucHV0SGVpZ2h0OiBWYWx1ZSBvZiBoZWlnaHQgaW5wdXRcclxuICAgICAgICAgKiAtIGFsaWduOiBBbGlnbiBDaGVjayBWYWx1ZVxyXG4gICAgICAgICAqIC0gaXNVcGRhdGU6IFVwZGF0ZSB2aWRlbyBpZiB0cnVlLCBjcmVhdGUgdmlkZW8gaWYgZmFsc2VcclxuICAgICAgICAgKiAtIGVsZW1lbnQ6IElmIGlzVXBkYXRlIGlzIHRydWUsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmlkZW8uXHJcbiAgICAgICAgICogfVxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBsb2FkSGFuZGxlciBJZiB1bmRlZmluZWQgaXMgcmV0dXJuZWQsIGl0IHdhaXRzIHVudGlsIFwidXBsb2FkSGFuZGxlclwiIGlzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgIFwidXBsb2FkSGFuZGxlclwiIGlzIGFuIHVwbG9hZCBmdW5jdGlvbiB3aXRoIFwiY29yZVwiIGFuZCBcImluZm9cIiBib3VuZC5cclxuICAgICAgICAgKiAgICAgICAgICAgICAgICBbdXBsb2FkIGZpbGVzXSA6IHVwbG9hZEhhbmRsZXIoZmlsZXMgb3IgW25ldyBGaWxlKC4uLiksXSlcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICBbZXJyb3JdICAgICAgICA6IHVwbG9hZEhhbmRsZXIoXCJFcnJvciBtZXNzYWdlXCIpXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgW0p1c3QgZmluaXNoXSAgOiB1cGxvYWRIYW5kbGVyKClcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICBbZGlyZWN0bHkgcmVnaXN0ZXJdIDogdXBsb2FkSGFuZGxlcihyZXNwb25zZSkgLy8gU2FtZSBmb3JtYXQgYXMgXCJ2aWRlb1VwbG9hZFVybFwiIHJlc3BvbnNlXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KSB7XHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwiZXJyb3JNZXNzYWdlXCI6IFwiaW5zZXJ0IGVycm9yIG1lc3NhZ2VcIixcclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXN1bHRcIjogWyB7IFwidXJsXCI6IFwiLi4uXCIsIFwibmFtZVwiOiBcIi4uLlwiLCBcInNpemVcIjogXCI5OTlcIiB9LCBdXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbnxBcnJheXx1bmRlZmluZWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25WaWRlb1VwbG9hZEJlZm9yZTogbnVsbCxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIGJlZm9yZSB0aGUgYXVkaW8gaXMgdXBsb2FkZWRcclxuICAgICAgICAgKiBJZiB0cnVlIGlzIHJldHVybmVkLCB0aGUgaW50ZXJuYWwgdXBsb2FkIHByb2Nlc3MgcnVucyBub3JtYWxseS5cclxuICAgICAgICAgKiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgbm8gYXVkaW8gdXBsb2FkIGlzIHBlcmZvcm1lZC5cclxuICAgICAgICAgKiBJZiBuZXcgZmlsZUxpc3QgYXJlIHJldHVybmVkLCAgcmVwbGFjZWQgdGhlIHByZXZpb3VzIGZpbGVMaXN0XHJcbiAgICAgICAgICogSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkLCBpdCB3YWl0cyB1bnRpbCBcInVwbG9hZEhhbmRsZXJcIiBpcyBleGVjdXRlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBmaWxlcyBGaWxlcyBhcnJheVxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIGluZm86IHtcclxuICAgICAgICAgKiAtIGlzVXBkYXRlOiBVcGRhdGUgYXVkaW8gaWYgdHJ1ZSwgY3JlYXRlIGF1ZGlvIGlmIGZhbHNlXHJcbiAgICAgICAgICogLSBlbGVtZW50OiBJZiBpc1VwZGF0ZSBpcyB0cnVlLCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGF1ZGlvLlxyXG4gICAgICAgICAqIH1cclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29yZSBDb3JlIG9iamVjdFxyXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwbG9hZEhhbmRsZXIgSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkLCBpdCB3YWl0cyB1bnRpbCBcInVwbG9hZEhhbmRsZXJcIiBpcyBleGVjdXRlZC5cclxuICAgICAgICAgKiAgICAgICAgICAgICAgICBcInVwbG9hZEhhbmRsZXJcIiBpcyBhbiB1cGxvYWQgZnVuY3Rpb24gd2l0aCBcImNvcmVcIiBhbmQgXCJpbmZvXCIgYm91bmQuXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgW3VwbG9hZCBmaWxlc10gOiB1cGxvYWRIYW5kbGVyKGZpbGVzIG9yIFtuZXcgRmlsZSguLi4pLF0pXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgW2Vycm9yXSAgICAgICAgOiB1cGxvYWRIYW5kbGVyKFwiRXJyb3IgbWVzc2FnZVwiKVxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgIFtKdXN0IGZpbmlzaF0gIDogdXBsb2FkSGFuZGxlcigpXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgW2RpcmVjdGx5IHJlZ2lzdGVyXSA6IHVwbG9hZEhhbmRsZXIocmVzcG9uc2UpIC8vIFNhbWUgZm9ybWF0IGFzIFwiYXVkaW9VcGxvYWRVcmxcIiByZXNwb25zZVxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCkge1xyXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcImVycm9yTWVzc2FnZVwiOiBcImluc2VydCBlcnJvciBtZXNzYWdlXCIsXHJcbiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVzdWx0XCI6IFsgeyBcInVybFwiOiBcIi4uLlwiLCBcIm5hbWVcIjogXCIuLi5cIiwgXCJzaXplXCI6IFwiOTk5XCIgfSwgXVxyXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW58QXJyYXl8dW5kZWZpbmVkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uQXVkaW9VcGxvYWRCZWZvcmU6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkZWQsIHVwZGF0ZWQsIGRlbGV0ZWRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldEVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVXBsb2FkZWQgaW5kZXhcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgVXBsb2FkIHN0YXR1cyAoJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJylcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mbyBJbWFnZSBpbmZvIG9iamVjdFxyXG4gICAgICAgICAqIC0gaW5kZXg6IGRhdGEgaW5kZXhcclxuICAgICAgICAgKiAtIG5hbWU6IGZpbGUgbmFtZVxyXG4gICAgICAgICAqIC0gc2l6ZTogZmlsZSBzaXplXHJcbiAgICAgICAgICogLSBzZWxlY3Q6IHNlbGVjdCBmdW5jdGlvblxyXG4gICAgICAgICAqIC0gZGVsZXRlOiBkZWxldGUgZnVuY3Rpb25cclxuICAgICAgICAgKiAtIGVsZW1lbnQ6IHRhcmdldCBlbGVtZW50XHJcbiAgICAgICAgICogLSBzcmM6IHNyYyBhdHRyaWJ1dGUgb2YgdGFnXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHJlbWFpbmluZ0ZpbGVzQ291bnQgQ291bnQgb2YgcmVtYWluaW5nIGZpbGVzIHRvIHVwbG9hZCAoMCB3aGVuIGFkZGVkIGFzIGEgdXJsKVxyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb3JlIENvcmUgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25JbWFnZVVwbG9hZDogbnVsbCxcclxuICAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENhbGxlZCB3aGVuIHRoZSB2aWRlbyhpZnJhbWUsIHZpZGVvKSBpcyBpcyB1cGxvYWRlZCwgdXBkYXRlZCwgZGVsZXRlZFxyXG4gICAgICAgICAqIC0tIGFyZ3VtZW50cyBpcyBzYW1lIFwib25JbWFnZVVwbG9hZFwiIC0tXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25WaWRlb1VwbG9hZDogbnVsbCxcclxuICAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBpcyBpcyB1cGxvYWRlZCwgdXBkYXRlZCwgZGVsZXRlZFxyXG4gICAgICAgICAqIC0tIGFyZ3VtZW50cyBpcyBzYW1lIFwib25JbWFnZVVwbG9hZFwiIC0tXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25BdWRpb1VwbG9hZDogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENhbGxlZCB3aGVuIHRoZSBpbWFnZSBpcyB1cGxvYWQgZmFpbGVkXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGVycm9yTWVzc2FnZSBFcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCBSZXNwb25zZSBPYmplY3RcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29yZSBDb3JlIG9iamVjdFxyXG4gICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWRFcnJvcjogbnVsbCxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIHdoZW4gdGhlIHZpZGVvKGlmcmFtZSwgdmlkZW8pIHVwbG9hZCBmYWlsZWRcclxuICAgICAgICAgKiAtLSBhcmd1bWVudHMgaXMgc2FtZSBcIm9uSW1hZ2VVcGxvYWRFcnJvclwiIC0tXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25WaWRlb1VwbG9hZEVycm9yOiBudWxsLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gdXBsb2FkIGZhaWxlZFxyXG4gICAgICAgICAqIC0tIGFyZ3VtZW50cyBpcyBzYW1lIFwib25JbWFnZVVwbG9hZEVycm9yXCIgLS1cclxuICAgICAgICAgKi9cclxuICAgICAgICBvbkF1ZGlvVXBsb2FkRXJyb3I6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXNldCB0aGUgYnV0dG9ucyBvbiB0aGUgdG9vbGJhci4gKEVkaXRvciBpcyBub3QgcmVsb2FkZWQpXHJcbiAgICAgICAgICogWW91IGNhbm5vdCBzZXQgYSBuZXcgcGx1Z2luIGZvciB0aGUgYnV0dG9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGJ1dHRvbkxpc3QgQnV0dG9uIGxpc3QgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0VG9vbGJhckJ1dHRvbnM6IGZ1bmN0aW9uIChidXR0b25MaXN0KSB7XHJcbiAgICAgICAgICAgIGNvcmUuc3VibWVudU9mZigpO1xyXG4gICAgICAgICAgICBjb3JlLmNvbnRhaW5lck9mZigpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgbmV3VG9vbGJhciA9IF9Db25zdHJ1Y3Rvci5fY3JlYXRlVG9vbEJhcihfZCwgYnV0dG9uTGlzdCwgY29yZS5wbHVnaW5zLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgX3Jlc3BvbnNpdmVCdXR0b25zID0gbmV3VG9vbGJhci5yZXNwb25zaXZlQnV0dG9ucztcclxuICAgICAgICAgICAgY29yZS5fbW9yZUxheWVyQWN0aXZlQnV0dG9uID0gbnVsbDtcclxuICAgICAgICAgICAgZXZlbnQuX3NldFJlc3BvbnNpdmVUb29sYmFyKCk7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5yZXBsYWNlQ2hpbGQobmV3VG9vbGJhci5fYnV0dG9uVHJheSwgY29udGV4dC5lbGVtZW50Ll9idXR0b25UcmF5KTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q29udGV4dCA9IF9Db250ZXh0KGNvbnRleHQuZWxlbWVudC5vcmlnaW5FbGVtZW50LCBjb3JlLl9nZXRDb25zdHJ1Y3RlZChjb250ZXh0LmVsZW1lbnQpLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudCA9IG5ld0NvbnRleHQuZWxlbWVudDtcclxuICAgICAgICAgICAgY29udGV4dC50b29sID0gbmV3Q29udGV4dC50b29sO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pZnJhbWUpIGNvbnRleHQuZWxlbWVudC53eXNpd3lnID0gY29yZS5fd2QuYm9keTtcclxuICAgICAgICAgICAgY29yZS5fY2FjaGluZ0J1dHRvbnMoKTtcclxuICAgICAgICAgICAgY29yZS5oaXN0b3J5Ll9yZXNldENhY2hpbmdCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICAgIGNvcmUuYWN0aXZlUGx1Z2lucyA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBvbGRDYWxsQnV0dG9ucyA9IHBsdWdpbkNhbGxCdXR0b25zO1xyXG4gICAgICAgICAgICBwbHVnaW5DYWxsQnV0dG9ucyA9IG5ld1Rvb2xiYXIucGx1Z2luQ2FsbEJ1dHRvbnM7XHJcbiAgICAgICAgICAgIGxldCBwbHVnaW4sIGJ1dHRvbiwgb2xkQnV0dG9uO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gcGx1Z2luQ2FsbEJ1dHRvbnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdXRpbC5oYXNPd24ocGx1Z2luQ2FsbEJ1dHRvbnMsIGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luID0gcGx1Z2luc1trZXldO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gcGx1Z2luQ2FsbEJ1dHRvbnNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uYWN0aXZlICYmIGJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9sZEJ1dHRvbiA9IG9sZENhbGxCdXR0b25zW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29yZS5jYWxsUGx1Z2luKGtleSwgbnVsbCwgb2xkQnV0dG9uIHx8IGJ1dHRvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b24ucGFyZW50RWxlbWVudC5yZXBsYWNlQ2hpbGQob2xkQnV0dG9uLCBidXR0b24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5DYWxsQnV0dG9uc1trZXldID0gb2xkQnV0dG9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcmUuaGFzRm9jdXMpIGV2ZW50Ll9hcHBseVRhZ0VmZmVjdHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3JlLl92YXJpYWJsZS5pc0NvZGVWaWV3KSB1dGlsLmFkZENsYXNzKGNvcmUuX3N0eWxlQ29tbWFuZE1hcC5jb2RlVmlldywgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICBpZiAoY29yZS5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB1dGlsLmFkZENsYXNzKGNvcmUuX3N0eWxlQ29tbWFuZE1hcC5mdWxsU2NyZWVuLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIGlmICh1dGlsLmhhc0NsYXNzKGNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc2Utc2hvdy1ibG9jaycpKSB1dGlsLmFkZENsYXNzKGNvcmUuX3N0eWxlQ29tbWFuZE1hcC5zaG93QmxvY2tzLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBvciByZXNldCBvcHRpb24gcHJvcGVydHkgKEVkaXRvciBpcyByZWxvYWRlZClcclxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gX29wdGlvbnMgT3B0aW9uc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIChfb3B0aW9ucykge1xyXG4gICAgICAgICAgICBldmVudC5fcmVtb3ZlRXZlbnQoKTtcclxuICAgICAgICAgICAgY29yZS5fcmVzZXRDb21wb25lbnRzKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvcmUuX3N0eWxlQ29tbWFuZE1hcC5zaG93QmxvY2tzLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29yZS5fc3R5bGVDb21tYW5kTWFwLmNvZGVWaWV3LCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIGNvcmUuX3ZhcmlhYmxlLmlzQ29kZVZpZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29yZS5faWZyYW1lQXV0byA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBjb3JlLnBsdWdpbnMgPSBfb3B0aW9ucy5wbHVnaW5zIHx8IGNvcmUucGx1Z2lucztcclxuICAgICAgICAgICAgY29uc3QgbWVyZ2VPcHRpb25zID0gW29wdGlvbnMsIF9vcHRpb25zXS5yZWR1Y2UoZnVuY3Rpb24gKGluaXQsIG9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5oYXNPd24ob3B0aW9uLCBrZXkpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAncGx1Z2lucycgJiYgb3B0aW9uW2tleV0gJiYgaW5pdFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5pdFtrZXldLCBvID0gb3B0aW9uW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLmxlbmd0aCA/IGkgOiBfdy5PYmplY3Qua2V5cyhpKS5tYXAoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gaVtuYW1lXTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBvLmxlbmd0aCA/IG8gOiBfdy5PYmplY3Qua2V5cyhvKS5tYXAoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gb1tuYW1lXTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRba2V5XSA9IChvLmZpbHRlcihmdW5jdGlvbih2YWwpIHsgcmV0dXJuIGkuaW5kZXhPZih2YWwpID09PSAtMTsgfSkpLmNvbmNhdChpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0W2tleV0gPSBvcHRpb25ba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5pdDtcclxuICAgICAgICAgICAgfSwge30pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZWwgPSBjb250ZXh0LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IF9pbml0SFRNTCA9IGVsLnd5c2l3eWcuaW5uZXJIVE1MO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IG9wdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjb25zID0gX0NvbnN0cnVjdG9yLl9zZXRPcHRpb25zKG1lcmdlT3B0aW9ucywgY29udGV4dCwgb3B0aW9ucyk7ICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25zLmNhbGxCdXR0b25zKSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW5DYWxsQnV0dG9ucyA9IGNvbnMuY2FsbEJ1dHRvbnM7XHJcbiAgICAgICAgICAgICAgICBjb3JlLmluaXRQbHVnaW5zID0ge307XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25zLnBsdWdpbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvcmUucGx1Z2lucyA9IHBsdWdpbnMgPSBjb25zLnBsdWdpbnM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2V0IGNvbnRleHRcclxuICAgICAgICAgICAgaWYgKGVsLl9tZW51VHJheS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHRoaXMuX21lbnVUcmF5ID0ge307XHJcbiAgICAgICAgICAgIF9yZXNwb25zaXZlQnV0dG9ucyA9IGNvbnMudG9vbGJhci5yZXNwb25zaXZlQnV0dG9ucztcclxuICAgICAgICAgICAgY29yZS5vcHRpb25zID0gb3B0aW9ucyA9IG1lcmdlT3B0aW9ucztcclxuICAgICAgICAgICAgY29yZS5sYW5nID0gbGFuZyA9IG9wdGlvbnMubGFuZztcclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZWwud3lzaXd5Z0ZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5fc2V0SWZyYW1lRG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29yZS5fc2V0T3B0aW9uc0luaXQoZWwsIF9pbml0SFRNTCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWwuZWRpdG9yQXJlYS5hcHBlbmRDaGlsZChlbC53eXNpd3lnRnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgY29yZS5fc2V0T3B0aW9uc0luaXQoZWwsIF9pbml0SFRNTCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IFwib3B0aW9ucy5kZWZhdWx0U3R5bGVcIiBzdHlsZS5cclxuICAgICAgICAgKiBEZWZpbmUgdGhlIHN0eWxlIG9mIHRoZSBlZGl0IGFyZWFcclxuICAgICAgICAgKiBJdCBjYW4gYWxzbyBiZSBkZWZpbmVkIHdpdGggdGhlIFwic2V0T3B0aW9uc1wiIG1ldGhvZCwgYnV0IHRoZSBcInNldERlZmF1bHRTdHlsZVwiIG1ldGhvZCBkb2VzIG5vdCByZW5kZXIgdGhlIGVkaXRvciBhZ2Fpbi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3R5bGUgU3R5bGUgc3RyaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0RGVmYXVsdFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3U3R5bGVzID0gb3B0aW9ucy5fZWRpdG9yU3R5bGVzID0gdXRpbC5fc2V0RGVmYXVsdE9wdGlvblN0eWxlKG9wdGlvbnMsIHN0eWxlKTtcclxuICAgICAgICAgICAgY29uc3QgZWwgPSBjb250ZXh0LmVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyB0b3AgYXJlYVxyXG4gICAgICAgICAgICBlbC50b3BBcmVhLnN0eWxlLmNzc1RleHQgPSBuZXdTdHlsZXMudG9wO1xyXG4gICAgICAgICAgICAvLyBjb2RlIHZpZXdcclxuICAgICAgICAgICAgZWwuY29kZS5zdHlsZS5jc3NUZXh0ID0gb3B0aW9ucy5fZWRpdG9yU3R5bGVzLmZyYW1lO1xyXG4gICAgICAgICAgICBlbC5jb2RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICAgICAgICBlbC5jb2RlLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbC5jb2RlLnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gd3lzaXd5ZyBmcmFtZVxyXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWZyYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbC53eXNpd3lnRnJhbWUuc3R5bGUuY3NzVGV4dCA9IG5ld1N0eWxlcy5mcmFtZSArIG5ld1N0eWxlcy5lZGl0b3I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbC53eXNpd3lnRnJhbWUuc3R5bGUuY3NzVGV4dCA9IG5ld1N0eWxlcy5mcmFtZTtcclxuICAgICAgICAgICAgICAgIGVsLnd5c2l3eWcuc3R5bGUuY3NzVGV4dCA9IG5ld1N0eWxlcy5lZGl0b3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiBhIG5vdGljZSBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTm90aWNlIG1lc3NhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2VPcGVuOiBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb3JlLm5vdGljZS5vcGVuLmNhbGwoY29yZSwgbWVzc2FnZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGEgbm90aWNlIGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2VDbG9zZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb3JlLm5vdGljZS5jbG9zZS5jYWxsKGNvcmUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIHRvIHRoZSBvcmlnaW5hbCB0ZXh0YXJlYVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lm9yaWdpbkVsZW1lbnQudmFsdWUgPSBjb3JlLmdldENvbnRlbnRzKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgc3VuZWRpdG9yJ3MgY29udGV4dCBvYmplY3QuIENvbnRhaW5zIHNldHRpbmdzLCBwbHVnaW5zLCBhbmQgY2FjaGVkIGVsZW1lbnQgb2JqZWN0c1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0Q29udGV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUNvbnRlbnRzIC0gUmV0dXJuIG9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBib2R5IHdpdGhvdXQgaGVhZGVycyB3aGVuIHRoZSBcImZ1bGxQYWdlXCIgb3B0aW9uIGlzIHRydWVcclxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENvbnRlbnRzOiBmdW5jdGlvbiAob25seUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb3JlLmdldENvbnRlbnRzKG9ubHlDb250ZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgb25seSB0aGUgdGV4dCBvZiB0aGUgc3VuZWRpdG9yIGNvbnRlbnRzXHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRUZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy50ZXh0Q29udGVudDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBlZGl0b3IncyBudW1iZXIgb2YgY2hhcmFjdGVycyBvciBiaW5hcnkgZGF0YSBzaXplLlxyXG4gICAgICAgICAqIFlvdSBjYW4gdXNlIHRoZSBcImNoYXJDb3VudGVyVHlwZVwiIG9wdGlvbiBmb3JtYXQuXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8bnVsbH0gY2hhckNvdW50ZXJUeXBlIG9wdGlvbnMgLSBjaGFyQ291bnRlclR5cGUgKCdjaGFyJywgJ2J5dGUnLCAnYnl0ZS1odG1sJylcclxuICAgICAgICAgKiBJZiBhcmd1bWVudCBpcyBubyB2YWx1ZSwgdGhlIGN1cnJlbnRseSBzZXQgXCJjaGFyQ291bnRlclR5cGVcIiBvcHRpb24gaXMgdXNlZC5cclxuICAgICAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENoYXJDb3VudDogZnVuY3Rpb24gKGNoYXJDb3VudGVyVHlwZSkge1xyXG4gICAgICAgICAgICBjaGFyQ291bnRlclR5cGUgPSB0eXBlb2YgY2hhckNvdW50ZXJUeXBlID09PSAnc3RyaW5nJyA/IGNoYXJDb3VudGVyVHlwZSA6IG9wdGlvbnMuY2hhckNvdW50ZXJUeXBlO1xyXG4gICAgICAgICAgICByZXR1cm4gY29yZS5nZXRDaGFyTGVuZ3RoKChjb3JlLl9jaGFyVHlwZUhUTUwgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgOiBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy50ZXh0Q29udGVudCksIGNoYXJDb3VudGVyVHlwZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdXBsb2FkZWQgaW1hZ2VzIGluZm9ybWF0aW9uc1xyXG4gICAgICAgICAqIC0gaW5kZXg6IGRhdGEgaW5kZXhcclxuICAgICAgICAgKiAtIG5hbWU6IGZpbGUgbmFtZVxyXG4gICAgICAgICAqIC0gc2l6ZTogZmlsZSBzaXplXHJcbiAgICAgICAgICogLSBzZWxlY3Q6IHNlbGVjdCBmdW5jdGlvblxyXG4gICAgICAgICAqIC0gZGVsZXRlOiBkZWxldGUgZnVuY3Rpb25cclxuICAgICAgICAgKiAtIGVsZW1lbnQ6IHRhcmdldCBlbGVtZW50XHJcbiAgICAgICAgICogLSBzcmM6IHNyYyBhdHRyaWJ1dGUgb2YgdGFnXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldEltYWdlc0luZm86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW1hZ2UgPyBjb250ZXh0LmltYWdlLl9pbmZvTGlzdCA6IFtdO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdXBsb2FkZWQgZmlsZXMocGx1Z2luIHVzaW5nIGZpbGVNYW5hZ2VyKSBpbmZvcm1hdGlvbiBsaXN0LlxyXG4gICAgICAgICAqIGltYWdlOiBbaW1nXSwgdmlkZW86IFt2aWRlbywgaWZyYW1lXSwgYXVkaW86IFthdWRpb11cclxuICAgICAgICAgKiBXaGVuIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyAnaW1hZ2UnLCBpdCBpcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBcImdldEltYWdlc0luZm9cIi5cclxuICAgICAgICAgKiAtIGluZGV4OiBkYXRhIGluZGV4XHJcbiAgICAgICAgICogLSBuYW1lOiBmaWxlIG5hbWVcclxuICAgICAgICAgKiAtIHNpemU6IGZpbGUgc2l6ZVxyXG4gICAgICAgICAqIC0gc2VsZWN0OiBzZWxlY3QgZnVuY3Rpb25cclxuICAgICAgICAgKiAtIGRlbGV0ZTogZGVsZXRlIGZ1bmN0aW9uXHJcbiAgICAgICAgICogLSBlbGVtZW50OiB0YXJnZXQgZWxlbWVudFxyXG4gICAgICAgICAqIC0gc3JjOiBzcmMgYXR0cmlidXRlIG9mIHRhZ1xyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIFBsdWdpbiBuYW1lIChpbWFnZSwgdmlkZW8sIGF1ZGlvKVxyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRGaWxlc0luZm86IGZ1bmN0aW9uIChwbHVnaW5OYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0W3BsdWdpbk5hbWVdID8gY29udGV4dFtwbHVnaW5OYW1lXS5faW5mb0xpc3QgOiBbXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVXBsb2FkIGltYWdlcyB1c2luZyBpbWFnZSBwbHVnaW5cclxuICAgICAgICAgKiBAcGFyYW0ge0ZpbGVMaXN0fSBmaWxlcyBGaWxlTGlzdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluc2VydEltYWdlOiBmdW5jdGlvbiAoZmlsZXMpIHtcclxuICAgICAgICAgICAgaWYgKCFjb3JlLnBsdWdpbnMuaW1hZ2UgfHwgIWZpbGVzKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvcmUuaW5pdFBsdWdpbnMuaW1hZ2UpIGNvcmUuY2FsbFBsdWdpbignaW1hZ2UnLCBjb3JlLnBsdWdpbnMuaW1hZ2Uuc3VibWl0QWN0aW9uLmJpbmQoY29yZSwgZmlsZXMpLCBudWxsKTtcclxuICAgICAgICAgICAgZWxzZSBjb3JlLnBsdWdpbnMuaW1hZ2Uuc3VibWl0QWN0aW9uLmNhbGwoY29yZSwgZmlsZXMpO1xyXG4gICAgICAgICAgICBjb3JlLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEluc2VydHMgYW4gSFRNTCBlbGVtZW50IG9yIEhUTUwgc3RyaW5nIG9yIHBsYWluIHN0cmluZyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBodG1sIEhUTUwgRWxlbWVudCBvciBIVE1MIHN0cmluZyBvciBwbGFpbiBzdHJpbmdcclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5vdENsZWFuaW5nRGF0YSBJZiB0cnVlLCBpbnNlcnRzIHRoZSBIVE1MIHN0cmluZyB3aXRob3V0IHJlZmluaW5nIGl0IHdpdGggY29yZS5jbGVhbkhUTUwuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBjaGVja0NoYXJDb3VudCBJZiB0cnVlLCBpZiBcIm9wdGlvbnMubWF4Q2hhckNvdW50XCIgaXMgZXhjZWVkZWQgd2hlbiBcImVsZW1lbnRcIiBpcyBhZGRlZCwgbnVsbCBpcyByZXR1cm5lZCB3aXRob3V0IGFkZGl0aW9uLlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmFuZ2VTZWxlY3Rpb24gSWYgdHJ1ZSwgcmFuZ2Ugc2VsZWN0IHRoZSBpbnNlcnRlZCBub2RlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluc2VydEhUTUw6IGZ1bmN0aW9uIChodG1sLCBub3RDbGVhbmluZ0RhdGEsIGNoZWNrQ2hhckNvdW50LCByYW5nZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGh0bWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5vdENsZWFuaW5nRGF0YSkgaHRtbCA9IGNvcmUuY2xlYW5IVE1MKGh0bWwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb20gPSBfZC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb21UcmVlID0gZG9tLmNoaWxkTm9kZXM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NoYXJDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gY29yZS5fY2hhclR5cGVIVE1MID8gJ291dGVySFRNTCcgOiAndGV4dENvbnRlbnQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBkb21UcmVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0hUTUwgKz0gZG9tVHJlZVtpXVt0eXBlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcmUuY2hlY2tDaGFyQ291bnQoY2hlY2tIVE1MLCBudWxsKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGMsIGEsIHQsIGZpcnN0Q29uO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9IGRvbVRyZWVbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBjb3JlLmluc2VydE5vZGUoYywgYSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhID0gdC5jb250YWluZXIgfHwgdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdENvbikgZmlyc3RDb24gPSB0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYS5ub2RlVHlwZSA9PT0gMyA/ICh0LmVuZE9mZnNldCB8fCBhLnRleHRDb250ZW50Lmxlbmd0aCk6IGEuY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlU2VsZWN0aW9uKSBjb3JlLnNldFJhbmdlKGZpcnN0Q29uLmNvbnRhaW5lciB8fCBmaXJzdENvbiwgZmlyc3RDb24uc3RhcnRPZmZzZXQgfHwgMCwgYSwgb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvcmUuc2V0UmFuZ2UoYSwgb2Zmc2V0LCBhLCBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3JlLmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGh0bWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNDb21wb25lbnQoaHRtbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3JlLmluc2VydENvbXBvbmVudChodG1sLCBmYWxzZSwgY2hlY2tDaGFyQ291bnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNGb3JtYXRFbGVtZW50KGh0bWwpIHx8IHV0aWwuaXNNZWRpYShodG1sKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoY29yZS5nZXRTZWxlY3Rpb25Ob2RlKCksIG51bGwpO1x0XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaW5zZXJ0Tm9kZShodG1sLCBhZnRlck5vZGUsIGNoZWNrQ2hhckNvdW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29yZS5lZmZlY3ROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgY29yZS5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xyXG4gICAgICAgICAgICBjb3JlLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZH0gY29udGVudHMgQ29udGVudHMgdG8gSW5wdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRDb250ZW50czogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvcmUuc2V0Q29udGVudHMoY29udGVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgY29udGVudHMgdG8gdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBDb250ZW50cyB0byBJbnB1dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFwcGVuZENvbnRlbnRzOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udmVydFZhbHVlID0gY29yZS5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29udGVudHMpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCFjb3JlLl92YXJpYWJsZS5pc0NvZGVWaWV3KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgICAgIHRlbXAuaW5uZXJIVE1MID0gY29udmVydFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHd5c2l3eWcgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5ZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGVtcC5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHd5c2l3eWcuYXBwZW5kQ2hpbGQoY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29yZS5fc2V0Q29kZVZpZXcoY29yZS5fZ2V0Q29kZVZpZXcoKSArICdcXG4nICsgY29yZS5jb252ZXJ0SFRNTEZvckNvZGVWaWV3KGNvbnZlcnRWYWx1ZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXHJcbiAgICAgICAgICAgIGNvcmUuaGlzdG9yeS5wdXNoKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGlzYWJsZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC50b29sLmNvdmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIGZhbHNlKTtcclxuICAgICAgICAgICAgY29yZS5pc0Rpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29kZU1pcnJvckVkaXRvci5zZXRPcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBlbmFibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQudG9vbC5jb3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHRydWUpO1xyXG4gICAgICAgICAgICBjb3JlLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvZGVNaXJyb3JFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29kZU1pcnJvckVkaXRvci5zZXRPcHRpb24oJ3JlYWRPbmx5JywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNob3cgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9wQXJlYVN0eWxlID0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGU7XHJcbiAgICAgICAgICAgIGlmICh0b3BBcmVhU3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB0b3BBcmVhU3R5bGUuZGlzcGxheSA9IG9wdGlvbnMuZGlzcGxheTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZXN0cm95IHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8qKiBvZmYgbWVudXMgKi9cclxuICAgICAgICAgICAgY29yZS5zdWJtZW51T2ZmKCk7XHJcbiAgICAgICAgICAgIGNvcmUuY29udGFpbmVyT2ZmKCk7XHJcbiAgICAgICAgICAgIGNvcmUuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgaWYgKGNvcmUubm90aWNlKSBjb3JlLm5vdGljZS5jbG9zZS5jYWxsKGNvcmUpO1xyXG4gICAgICAgICAgICBpZiAoY29yZS5tb2RhbEZvcm0pIGNvcmUucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbChjb3JlKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgaGlzdG9yeSAqL1xyXG4gICAgICAgICAgICBjb3JlLmhpc3RvcnkuX2Rlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgICAgIGV2ZW50Ll9yZW1vdmVFdmVudCgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLyoqIHJlbW92ZSBlbGVtZW50ICovXHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjb250ZXh0LmVsZW1lbnQudG9vbGJhcik7XHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjb250ZXh0LmVsZW1lbnQudG9wQXJlYSk7XHJcblxyXG4gICAgICAgICAgICAvKiogcmVtb3ZlIG9iamVjdCByZWZlcmVuY2UgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBjb3JlKSB7IGlmICh1dGlsLmhhc093bihjb3JlLCBrKSkgZGVsZXRlIGNvcmVba107IH1cclxuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBldmVudCkgeyBpZiAodXRpbC5oYXNPd24oZXZlbnQsIGspKSBkZWxldGUgZXZlbnRba107IH1cclxuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBjb250ZXh0KSB7IGlmICh1dGlsLmhhc093bihjb250ZXh0LCBrKSkgZGVsZXRlIGNvbnRleHRba107IH1cclxuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBwbHVnaW5DYWxsQnV0dG9ucykgeyBpZiAodXRpbC5oYXNPd24ocGx1Z2luQ2FsbEJ1dHRvbnMsIGspKSBkZWxldGUgcGx1Z2luQ2FsbEJ1dHRvbnNba107IH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgdXNlciBvYmplY3QgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgayBpbiB0aGlzKSB7IGlmICh1dGlsLmhhc093bih0aGlzLCBrKSkgZGVsZXRlIHRoaXNba107IH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVG9vbGJhciBtZXRob2RzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgdGhlIHRvb2xiYXJcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRvb2wuY292ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQGRlc2NyaXB0aW9uIEVuYWJsZSB0aGUgdG9vbGJhclxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZW5hYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC50b29sLmNvdmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQGRlc2NyaXB0aW9uIFNob3cgdGhlIHRvb2xiYXJcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb3JlLl9pc0lubGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQGRlc2NyaXB0aW9uIEhpZGUgdGhlIHRvb2xiYXJcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb3JlLl9pc0lubGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9oaWRlVG9vbGJhcigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fc3RpY2t5RHVtbXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKioqKioqKioqKiogQ29yZSBpbml0ICoqKioqKioqKioqKi9cclxuICAgIC8vIGZ1bmN0aW9uc1xyXG4gICAgY29yZS5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7XHJcbiAgICBjb3JlLm9wdGlvbnMgPSBvcHRpb25zO1xyXG5cclxuICAgIC8vIENyZWF0ZSB0byBzaWJsaW5nIG5vZGVcclxuICAgIGxldCBjb250ZXh0RWwgPSBjb250ZXh0LmVsZW1lbnQ7XHJcbiAgICBsZXQgb3JpZ2luRWwgPSBjb250ZXh0RWwub3JpZ2luRWxlbWVudDtcclxuICAgIGxldCB0b3BFbCA9IGNvbnRleHRFbC50b3BBcmVhO1xyXG4gICAgb3JpZ2luRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIHRvcEVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgIC8vIGluaXRcclxuICAgIGlmIChvcHRpb25zLmlmcmFtZSkge1xyXG4gICAgICAgIGNvbnRleHRFbC53eXNpd3lnRnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdXRpbC5fc2V0SWZyYW1lRG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvcmUuX2VkaXRvckluaXQoZmFsc2UsIG9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgICAgICBvcHRpb25zLnZhbHVlID0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnQgZWRpdG9yIGVsZW1lbnRcclxuICAgIGlmICh0eXBlb2Ygb3JpZ2luRWwubmV4dEVsZW1lbnRTaWJsaW5nID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIG9yaWdpbkVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRvcEVsLCBvcmlnaW5FbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBvcmlnaW5FbC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRvcEVsKTtcclxuICAgIH1cclxuXHJcbiAgICBjb250ZXh0RWwuZWRpdG9yQXJlYS5hcHBlbmRDaGlsZChjb250ZXh0RWwud3lzaXd5Z0ZyYW1lKTtcclxuICAgIGNvbnRleHRFbCA9IG9yaWdpbkVsID0gdG9wRWwgPSBudWxsO1xyXG5cclxuICAgIC8vIGluaXRcclxuICAgIGlmICghb3B0aW9ucy5pZnJhbWUpIHtcclxuICAgICAgICBjb3JlLl9lZGl0b3JJbml0KGZhbHNlLCBvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBvcHRpb25zLnZhbHVlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb25zO1xyXG59XHJcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE5IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY29yZSwgY2hhbmdlKSB7XG4gICAgY29uc3QgX3cgPSBjb3JlLl93O1xuICAgIGNvbnN0IHV0aWwgPSBjb3JlLnV0aWw7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gY29yZS5vcHRpb25zLmhpc3RvcnlTdGFja0RlbGF5VGltZTtcbiAgICBsZXQgZWRpdG9yID0gY29yZS5jb250ZXh0LmVsZW1lbnQ7XG4gICAgbGV0IHVuZG8gPSBjb3JlLmNvbnRleHQudG9vbC51bmRvO1xuICAgIGxldCByZWRvID0gY29yZS5jb250ZXh0LnRvb2wucmVkbztcblxuICAgIGxldCBwdXNoRGVsYXkgPSBudWxsO1xuICAgIGxldCBzdGFja0luZGV4ID0gMDtcbiAgICBsZXQgc3RhY2sgPSBbXTtcblxuICAgIGZ1bmN0aW9uIHNldENvbnRlbnRzRnJvbVN0YWNrICgpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0YWNrW3N0YWNrSW5kZXhdO1xuICAgICAgICBlZGl0b3Iud3lzaXd5Zy5pbm5lckhUTUwgPSBpdGVtLmNvbnRlbnRzO1xuXG4gICAgICAgIGNvcmUuc2V0UmFuZ2UodXRpbC5nZXROb2RlRnJvbVBhdGgoaXRlbS5zLnBhdGgsIGVkaXRvci53eXNpd3lnKSwgaXRlbS5zLm9mZnNldCwgdXRpbC5nZXROb2RlRnJvbVBhdGgoaXRlbS5lLnBhdGgsIGVkaXRvci53eXNpd3lnKSwgaXRlbS5lLm9mZnNldCk7XG4gICAgICAgIGNvcmUuZm9jdXMoKTtcblxuICAgICAgICBpZiAoc3RhY2tJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHVuZG8pIHVuZG8uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHJlZG8pIHJlZG8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YWNrSW5kZXggPT09IHN0YWNrLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGlmICh1bmRvKSB1bmRvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIGlmIChyZWRvKSByZWRvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1bmRvKSB1bmRvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIGlmIChyZWRvKSByZWRvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvcmUuY29udHJvbGxlcnNPZmYoKTtcbiAgICAgICAgY29yZS5fY2hlY2tDb21wb25lbnRzKCk7XG4gICAgICAgIGNvcmUuX3NldENoYXJDb3VudCgpO1xuICAgICAgICBjb3JlLl9yZXNvdXJjZXNTdGF0ZUNoYW5nZSgpO1xuICAgICAgICBcbiAgICAgICAgLy8gb25DaGFuZ2VcbiAgICAgICAgY2hhbmdlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVzaFN0YWNrICgpIHtcbiAgICAgICAgY29yZS5fY2hlY2tDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjb3JlLmdldENvbnRlbnRzKHRydWUpO1xuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgKCEhc3RhY2tbc3RhY2tJbmRleF0gJiYgY3VycmVudCA9PT0gc3RhY2tbc3RhY2tJbmRleF0uY29udGVudHMpKSByZXR1cm47XG5cbiAgICAgICAgc3RhY2tJbmRleCsrO1xuICAgICAgICBjb25zdCByYW5nZSA9IGNvcmUuX3ZhcmlhYmxlLl9yYW5nZTtcblxuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gc3RhY2tJbmRleCkge1xuICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLCBzdGFja0luZGV4KTtcbiAgICAgICAgICAgIGlmIChyZWRvKSByZWRvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHN0YWNrW3N0YWNrSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHM6IHsgcGF0aDogWzAsIDBdLCBvZmZzZXQ6IFswLCAwXSB9LFxuICAgICAgICAgICAgICAgIGU6IHsgcGF0aDogMCwgb2Zmc2V0OiAwIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFja1tzdGFja0luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY3VycmVudCxcbiAgICAgICAgICAgICAgICBzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHV0aWwuZ2V0Tm9kZVBhdGgocmFuZ2Uuc3RhcnRDb250YWluZXIsIG51bGwsIG51bGwpLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHV0aWwuZ2V0Tm9kZVBhdGgocmFuZ2UuZW5kQ29udGFpbmVyLCBudWxsLCBudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiByYW5nZS5lbmRPZmZzZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YWNrSW5kZXggPT09IDEgJiYgdW5kbykgdW5kby5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgY29yZS5fc2V0Q2hhckNvdW50KCk7XG4gICAgICAgIC8vIG9uQ2hhbmdlXG4gICAgICAgIGNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSGlzdG9yeSBzdGFja1xuICAgICAgICAgKi9cbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2F2aW5nIHRoZSBjdXJyZW50IHN0YXR1cyB0byB0aGUgaGlzdG9yeSBvYmplY3Qgc3RhY2tcbiAgICAgICAgICogSWYgXCJkZWxheVwiIGlzIHRydWUsIGl0IHdpbGwgYmUgc2F2ZWQgYWZ0ZXIgKG9wdGlvbnMuaGlzdG9yeVN0YWNrRGVsYXlUaW1lIHx8IDQwMCkgbWlsaXNlY29uZHNcbiAgICAgICAgICogSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZSBcImRlbGF5XCIgYXJndW1lbnQgdHJ1ZSBiZWZvcmUgaXQgaXMgc2F2ZWQsIHRoZSBkZWxheSB0aW1lIGlzIHJlbmV3YWxcbiAgICAgICAgICogWW91IGNhbiBzcGVjaWZ5IHRoZSBkZWxheSB0aW1lIGJ5IHNlbmRpbmcgYSBudW1iZXIuXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbnxOdW1iZXJ9IGRlbGF5IElmIHRydWUsIEFkZCBzdGFjayB3aXRob3V0IGRlbGF5IHRpbWUuXG4gICAgICAgICAqL1xuICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZGVsYXkpIHtcbiAgICAgICAgICAgIF93LnNldFRpbWVvdXQoY29yZS5fcmVzb3VyY2VzU3RhdGVDaGFuZ2UuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb25zdCB0aW1lID0gdHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyA/IChkZWxheSA+IDAgPyBkZWxheSA6IDApIDogKCFkZWxheSA/IDAgOiBkZWxheVRpbWUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXRpbWUgfHwgcHVzaERlbGF5KSB7XG4gICAgICAgICAgICAgICAgX3cuY2xlYXJUaW1lb3V0KHB1c2hEZWxheSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjaygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoRGVsYXkgPSBfdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdy5jbGVhclRpbWVvdXQocHVzaERlbGF5KTtcbiAgICAgICAgICAgICAgICBwdXNoRGVsYXkgPSBudWxsO1xuICAgICAgICAgICAgICAgIHB1c2hTdGFjaygpO1xuICAgICAgICAgICAgfSwgdGltZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBVbmRvIGZ1bmN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB1bmRvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc3RhY2tJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBzdGFja0luZGV4LS07XG4gICAgICAgICAgICAgICAgc2V0Q29udGVudHNGcm9tU3RhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJlZG8gZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHJlZG86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggLSAxID4gc3RhY2tJbmRleCkge1xuICAgICAgICAgICAgICAgIHN0YWNrSW5kZXgrKztcbiAgICAgICAgICAgICAgICBzZXRDb250ZW50c0Zyb21TdGFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR28gdG8gdGhlIGhpc3Rvcnkgc3RhY2sgZm9yIHRoYXQgaW5kZXguXG4gICAgICAgICAqIElmIFwiaW5kZXhcIiBpcyAtMSwgZ28gdG8gdGhlIGxhc3Qgc3RhY2tcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFN0YWNrIGluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBnbzogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBzdGFja0luZGV4ID0gaW5kZXggPCAwID8gKHN0YWNrLmxlbmd0aCAtIDEpIDogaW5kZXg7XG4gICAgICAgICAgICBzZXRDb250ZW50c0Zyb21TdGFjaygpO1xuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXNldCB0aGUgaGlzdG9yeSBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoaWdub3JlQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmICh1bmRvKSB1bmRvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChyZWRvKSByZWRvLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChjb3JlLmNvbnRleHQudG9vbC5zYXZlKSBjb3JlLmNvbnRleHQudG9vbC5zYXZlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgc3RhY2suc3BsaWNlKDApO1xuICAgICAgICAgICAgc3RhY2tJbmRleCA9IDA7XG5cbiAgICAgICAgICAgIC8vIHB1c2hTdGFja1xuICAgICAgICAgICAgc3RhY2tbc3RhY2tJbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IGNvcmUuZ2V0Q29udGVudHModHJ1ZSksXG4gICAgICAgICAgICAgICAgczoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZToge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghaWdub3JlQ2hhbmdlRXZlbnQpIGNoYW5nZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVzZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBidXR0b25zIHRvIGZpdCB0aGUgY3VycmVudCBzdGFjay5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9yZXNldENhY2hpbmdCdXR0b246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVkaXRvciA9IGNvcmUuY29udGV4dC5lbGVtZW50O1xuICAgICAgICAgICAgdW5kbyA9IGNvcmUuY29udGV4dC50b29sLnVuZG87XG4gICAgICAgICAgICByZWRvID0gY29yZS5jb250ZXh0LnRvb2wucmVkbztcblxuICAgICAgICAgICAgaWYgKHN0YWNrSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodW5kbykgdW5kby5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZG8gJiYgc3RhY2tJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMSkgcmVkby5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcmUuY29udGV4dC50b29sLnNhdmUpIGNvcmUuY29udGV4dC50b29sLnNhdmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja0luZGV4ID09PSBzdGFjay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZG8pIHJlZG8uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGFsbCBzdGFja3MgYW5kIHJlbW92ZSB0aGUgdGltZW91dCBmdW5jdGlvbi5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9kZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAocHVzaERlbGF5KSBfdy5jbGVhclRpbWVvdXQocHVzaERlbGF5KTtcbiAgICAgICAgICAgIHN0YWNrID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgJy4vYXNzZXRzL2Nzcy9zdW5lZGl0b3IuY3NzJztcbmltcG9ydCAnLi9hc3NldHMvY3NzL3N1bmVkaXRvci1jb250ZW50cy5jc3MnO1xuXG5pbXBvcnQgcGx1Z2lucyBmcm9tICcuL3BsdWdpbnMnO1xuaW1wb3J0IHN1bmVkaXRvciBmcm9tICcuL3N1bmVkaXRvcic7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdTVU5FRElUT1InLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogc3VuZWRpdG9yLmluaXQoe1xuICAgICAgICBwbHVnaW5zOiBwbHVnaW5zXG4gICAgfSlcbn0pOyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cbiAgICAgICAgICAgIGZhY3RvcnkoZ2xvYmFsLCB0cnVlKSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmICghdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NVTkVESVRPUl9NT0RVTEVTIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeSh3KTtcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShnbG9iYWwpO1xuICAgIH1cbn0odHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBub0dsb2JhbCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHtcbiAgICAgICAgbmFtZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgY29udGFpbmVyIGZvciB0aGUgcmVzaXppbmcgY29tcG9uZW50IGFuZCBpbnNlcnQgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY292ZXIgQ292ZXIgZWxlbWVudCAoRklHVVJFKVxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgb2YgY29udGFpbmVyIChmaXhlZDogc2UtY29tcG9uZW50KVxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gQ3JlYXRlZCBjb250YWluZXIgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgc2V0X2NvbnRhaW5lcjogZnVuY3Rpb24gKGNvdmVyLCBjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnc2UtY29tcG9uZW50ICcgKyBjbGFzc05hbWU7XG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY292ZXIpO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENvdmVyIHRoZSB0YXJnZXQgZWxlbWVudCB3aXRoIGEgRklHVVJFIGVsZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgc2V0X2NvdmVyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgY292ZXIgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnRklHVVJFJyk7XG4gICAgICAgICAgICBjb3Zlci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICBcbiAgICAgICAgICAgIHJldHVybiBjb3ZlcjtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybiBIVE1MIHN0cmluZyBvZiBjYXB0aW9uKEZJR0NBUFRJT04pIGVsZW1lbnRcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZV9jYXB0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ0ZJR0NBUFRJT04nKTtcbiAgICAgICAgICAgIGNhcHRpb24uc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcbiAgICAgICAgICAgIGNhcHRpb24uaW5uZXJIVE1MID0gJzxkaXY+JyArIHRoaXMubGFuZy5kaWFsb2dCb3guY2FwdGlvbiArICc8L2Rpdj4nO1xuICAgICAgICAgICAgcmV0dXJuIGNhcHRpb247XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBub0dsb2JhbCA9PT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIXdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUykge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1NVTkVESVRPUl9NT0RVTEVTJywge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuU1VORURJVE9SX01PRFVMRVMsICdjb21wb25lbnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn0pKTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG4gICAgICAgICAgICBmYWN0b3J5KGdsb2JhbCwgdHJ1ZSkgOlxuICAgICAgICAgICAgZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXcuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTVU5FRElUT1JfTU9EVUxFUyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkodyk7XG4gICAgICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZhY3RvcnkoZ2xvYmFsKTtcbiAgICB9XG59KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24gKHdpbmRvdywgbm9HbG9iYWwpIHtcbiAgICBjb25zdCByZXNpemluZyA9IHtcbiAgICAgICAgbmFtZTogJ3Jlc2l6aW5nJyxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvclxuICAgICAgICAgKiBSZXF1aXJlIGNvbnRleHQgcHJvcGVydGllcyB3aGVuIHJlc2l6aW5nIG1vZHVsZVxuICAgICAgICAgICAgaW5wdXRYOiBFbGVtZW50LFxuICAgICAgICAgICAgaW5wdXRZOiBFbGVtZW50LFxuICAgICAgICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIF9jb3ZlcjogbnVsbCxcbiAgICAgICAgICAgIF9lbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgX2VsZW1lbnRfdzogMSxcbiAgICAgICAgICAgIF9lbGVtZW50X2g6IDEsXG4gICAgICAgICAgICBfZWxlbWVudF9sOiAwLFxuICAgICAgICAgICAgX2VsZW1lbnRfdDogMCxcbiAgICAgICAgICAgIF9kZWZhdWx0U2l6ZVg6ICdhdXRvJyxcbiAgICAgICAgICAgIF9kZWZhdWx0U2l6ZVk6ICdhdXRvJyxcbiAgICAgICAgICAgIF9vcmlnaW5fdzogY29yZS5vcHRpb25zLmltYWdlV2lkdGggPT09ICdhdXRvJyA/ICcnIDogY29yZS5vcHRpb25zLmltYWdlV2lkdGgsXG4gICAgICAgICAgICBfb3JpZ2luX2g6IGNvcmUub3B0aW9ucy5pbWFnZUhlaWdodCA9PT0gJ2F1dG8nID8gJycgOiBjb3JlLm9wdGlvbnMuaW1hZ2VIZWlnaHQsXG4gICAgICAgICAgICBfcHJvcG9ydGlvbkNoZWNrZWQ6IHRydWUsXG4gICAgICAgICAgICAvLyAtLSBzZWxlY3QgZnVuY3Rpb24gLS1cbiAgICAgICAgICAgIF9yZXNpemluZzogY29yZS5vcHRpb25zLmltYWdlUmVzaXppbmcsXG4gICAgICAgICAgICBfcmVzaXplRG90SGlkZTogIWNvcmUub3B0aW9ucy5pbWFnZUhlaWdodFNob3csXG4gICAgICAgICAgICBfcm90YXRpb246IGNvcmUub3B0aW9ucy5pbWFnZVJvdGF0aW9uLFxuICAgICAgICAgICAgX29ubHlQZXJjZW50YWdlOiBjb3JlLm9wdGlvbnMuaW1hZ2VTaXplT25seVBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBfcmF0aW86IGZhbHNlLFxuICAgICAgICAgICAgX3JhdGlvWDogMSxcbiAgICAgICAgICAgIF9yYXRpb1k6IDFcbiAgICAgICAgICAgIF9jYXB0aW9uU2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIC8vIC0tIHdoZW4gdXNlZCBjYXB0aW9uIChfY2FwdGlvblNob3c6IHRydWUpIC0tXG4gICAgICAgICAgICBfY2FwdGlvbjogbnVsbCxcbiAgICAgICAgICAgIF9jYXB0aW9uQ2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBjYXB0aW9uQ2hlY2tFbDogbnVsbCxcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpY29ucyA9IGNvcmUuaWNvbnM7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZyA9IHtcbiAgICAgICAgICAgICAgICBfcmVzaXplQ2xpZW50WDogMCxcbiAgICAgICAgICAgICAgICBfcmVzaXplQ2xpZW50WTogMCxcbiAgICAgICAgICAgICAgICBfcmVzaXplX3BsdWdpbjogJycsXG4gICAgICAgICAgICAgICAgX3Jlc2l6ZV93OiAwLFxuICAgICAgICAgICAgICAgIF9yZXNpemVfaDogMCxcbiAgICAgICAgICAgICAgICBfb3JpZ2luX3c6IDAsXG4gICAgICAgICAgICAgICAgX29yaWdpbl9oOiAwLFxuICAgICAgICAgICAgICAgIF9yb3RhdGVWZXJ0aWNhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgX3Jlc2l6ZV9kaXJlY3Rpb246ICcnLFxuICAgICAgICAgICAgICAgIF9tb3ZlX3BhdGg6IG51bGwsXG4gICAgICAgICAgICAgICAgX2lzQ2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhbGlnbkljb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2ljOiBpY29ucy5hbGlnbl9qdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpY29ucy5hbGlnbl9sZWZ0LFxuICAgICAgICAgICAgICAgICAgICByaWdodDogaWNvbnMuYWxpZ25fcmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlcjogaWNvbnMuYWxpZ25fY2VudGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICBcbiAgICAgICAgICAgIC8qKiByZXNpemUgY29udHJvbGxlciwgYnV0dG9uICovXG4gICAgICAgICAgICBsZXQgcmVzaXplX2Rpdl9jb250YWluZXIgPSB0aGlzLnNldENvbnRyb2xsZXJfcmVzaXplKGNvcmUpO1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5yZXNpemVDb250YWluZXIgPSByZXNpemVfZGl2X2NvbnRhaW5lcjtcbiAgICBcbiAgICAgICAgICAgIGNvbnRleHQucmVzaXppbmcucmVzaXplRGl2ID0gcmVzaXplX2Rpdl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLnNlLW1vZGFsLXJlc2l6ZScpO1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5yZXNpemVEb3QgPSByZXNpemVfZGl2X2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2UtcmVzaXplLWRvdCcpO1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5yZXNpemVEaXNwbGF5ID0gcmVzaXplX2Rpdl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLnNlLXJlc2l6ZS1kaXNwbGF5Jyk7XG4gICAgXG4gICAgICAgICAgICBsZXQgcmVzaXplX2J1dHRvbiA9IHRoaXMuc2V0Q29udHJvbGxlcl9idXR0b24oY29yZSk7XG4gICAgICAgICAgICBjb250ZXh0LnJlc2l6aW5nLnJlc2l6ZUJ1dHRvbiA9IHJlc2l6ZV9idXR0b247XG4gICAgXG4gICAgICAgICAgICBsZXQgcmVzaXplX2hhbmRsZXMgPSBjb250ZXh0LnJlc2l6aW5nLnJlc2l6ZUhhbmRsZXMgPSBjb250ZXh0LnJlc2l6aW5nLnJlc2l6ZURvdC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJyk7XG4gICAgICAgICAgICBjb250ZXh0LnJlc2l6aW5nLnJlc2l6ZUJ1dHRvbkdyb3VwID0gcmVzaXplX2J1dHRvbi5xdWVyeVNlbGVjdG9yKCcuX3NlX3Jlc2l6aW5nX2J0bl9ncm91cCcpO1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5yb3RhdGlvbkJ1dHRvbnMgPSByZXNpemVfYnV0dG9uLnF1ZXJ5U2VsZWN0b3JBbGwoJy5fc2VfcmVzaXppbmdfYnRuX2dyb3VwIC5fc2Vfcm90YXRpb24nKTtcbiAgICAgICAgICAgIGNvbnRleHQucmVzaXppbmcucGVyY2VudGFnZUJ1dHRvbnMgPSByZXNpemVfYnV0dG9uLnF1ZXJ5U2VsZWN0b3JBbGwoJy5fc2VfcmVzaXppbmdfYnRuX2dyb3VwIC5fc2VfcGVyY2VudGFnZScpO1xuICAgIFxuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5hbGlnbk1lbnUgPSByZXNpemVfYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5zZS1yZXNpemluZy1hbGlnbi1saXN0Jyk7XG4gICAgICAgICAgICBjb250ZXh0LnJlc2l6aW5nLmFsaWduTWVudUxpc3QgPSBjb250ZXh0LnJlc2l6aW5nLmFsaWduTWVudS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnRleHQucmVzaXppbmcuYWxpZ25CdXR0b24gPSByZXNpemVfYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfcmVzaXppbmdfYWxpZ25fYnV0dG9uJyk7XG4gICAgICAgICAgICBjb250ZXh0LnJlc2l6aW5nLmF1dG9TaXplQnV0dG9uID0gcmVzaXplX2J1dHRvbi5xdWVyeVNlbGVjdG9yKCcuX3NlX3Jlc2l6aW5nX2J0bl9ncm91cCAuX3NlX2F1dG9fc2l6ZScpO1xuICAgICAgICAgICAgY29udGV4dC5yZXNpemluZy5jYXB0aW9uQnV0dG9uID0gcmVzaXplX2J1dHRvbi5xdWVyeVNlbGVjdG9yKCcuX3NlX3Jlc2l6aW5nX2NhcHRpb25fYnV0dG9uJyk7XG4gICAgXG4gICAgICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICAgICAgcmVzaXplX2Rpdl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9KTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzFdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzJdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzNdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzRdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzVdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzZdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9oYW5kbGVzWzddLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25fcmVzaXplX2hhbmRsZS5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIHJlc2l6ZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfcmVzaXplQnV0dG9uLmJpbmQoY29yZSkpO1xuICAgIFxuICAgICAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQocmVzaXplX2Rpdl9jb250YWluZXIpO1xuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFwcGVuZENoaWxkKHJlc2l6ZV9idXR0b24pO1xuICAgIFxuICAgICAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICAgICAgcmVzaXplX2Rpdl9jb250YWluZXIgPSBudWxsLCByZXNpemVfYnV0dG9uID0gbnVsbCwgcmVzaXplX2hhbmRsZXMgPSBudWxsO1xuICAgICAgICB9LFxuICAgIFxuICAgICAgICAvKiogcmVzaXplIGNvbnRyb2xsZXIsIGJ1dHRvbiAoaW1hZ2UsIGlmcmFtZSwgdmlkZW8pICovXG4gICAgICAgIHNldENvbnRyb2xsZXJfcmVzaXplOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzaXplX2NvbnRhaW5lciA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmVzaXplX2NvbnRhaW5lci5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1yZXNpemluZy1jb250YWluZXInO1xuICAgICAgICAgICAgcmVzaXplX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgcmVzaXplX2NvbnRhaW5lci5pbm5lckhUTUwgPSAnJyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1tb2RhbC1yZXNpemVcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXJlc2l6ZS1kb3RcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGxcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRyXCI+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJibFwiPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYnJcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImx3XCI+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aFwiPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwicndcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImJoXCI+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXJlc2l6ZS1kaXNwbGF5XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gcmVzaXplX2NvbnRhaW5lcjtcbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgc2V0Q29udHJvbGxlcl9idXR0b246IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICAgICAgY29uc3QgcmVzaXplX2J1dHRvbiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KFwiRElWXCIpO1xuICAgIFxuICAgICAgICAgICAgcmVzaXplX2J1dHRvbi5jbGFzc05hbWUgPSBcInNlLWNvbnRyb2xsZXIgc2UtY29udHJvbGxlci1yZXNpemluZ1wiO1xuICAgICAgICAgICAgcmVzaXplX2J1dHRvbi5pbm5lckhUTUwgPSAnJyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1hcnJvdyBzZS1hcnJvdy11cFwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwIF9zZV9yZXNpemluZ19idG5fZ3JvdXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cInBlcmNlbnRcIiBkYXRhLXZhbHVlPVwiMVwiIGNsYXNzPVwic2UtdG9vbHRpcCBfc2VfcGVyY2VudGFnZVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPjEwMCU8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnJlc2l6ZTEwMCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJwZXJjZW50XCIgZGF0YS12YWx1ZT1cIjAuNzVcIiBjbGFzcz1cInNlLXRvb2x0aXAgX3NlX3BlcmNlbnRhZ2VcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3Bhbj43NSU8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnJlc2l6ZTc1ICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cInBlcmNlbnRcIiBkYXRhLXZhbHVlPVwiMC41XCIgY2xhc3M9XCJzZS10b29sdGlwIF9zZV9wZXJjZW50YWdlXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4+NTAlPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZXNpemU1MCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJhdXRvXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfYXV0b19zaXplXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5hdXRvX3NpemUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5hdXRvU2l6ZSArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJyb3RhdGVcIiBkYXRhLXZhbHVlPVwiLTkwXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2Vfcm90YXRpb25cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLnJvdGF0ZV9sZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIucm90YXRlTGVmdCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJyb3RhdGVcIiBkYXRhLXZhbHVlPVwiOTBcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwIF9zZV9yb3RhdGlvblwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMucm90YXRlX3JpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIucm90YXRlUmlnaHQgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWJ0bi1ncm91cFwiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJtaXJyb3JcIiBkYXRhLXZhbHVlPVwiaFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLm1pcnJvcl9ob3Jpem9udGFsICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIubWlycm9ySG9yaXpvbnRhbCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJtaXJyb3JcIiBkYXRhLXZhbHVlPVwidlwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLm1pcnJvcl92ZXJ0aWNhbCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLm1pcnJvclZlcnRpY2FsICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cIm9uYWxpZ25cIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwIF9zZV9yZXNpemluZ19hbGlnbl9idXR0b25cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmFsaWduX2p1c3RpZnkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcudG9vbGJhci5hbGlnbiArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwLXN1YiBzdW4tZWRpdG9yLWNvbW1vbiBzZS1saXN0LWxheWVyIHNlLXJlc2l6aW5nLWFsaWduLWxpc3RcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS10b29sdGlwXCIgZGF0YS1jb21tYW5kPVwiYWxpZ25cIiBkYXRhLXZhbHVlPVwiYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmFsaWduX2p1c3RpZnkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuZGlhbG9nQm94LmJhc2ljICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3Qgc2UtdG9vbHRpcFwiIGRhdGEtY29tbWFuZD1cImFsaWduXCIgZGF0YS12YWx1ZT1cImxlZnRcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmFsaWduX2xlZnQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuZGlhbG9nQm94LmxlZnQgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPjwvbGk+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS10b29sdGlwXCIgZGF0YS1jb21tYW5kPVwiYWxpZ25cIiBkYXRhLXZhbHVlPVwiY2VudGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5hbGlnbl9jZW50ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuZGlhbG9nQm94LmNlbnRlciArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+PC9saT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0IHNlLXRvb2x0aXBcIiBkYXRhLWNvbW1hbmQ9XCJhbGlnblwiIGRhdGEtdmFsdWU9XCJyaWdodFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuYWxpZ25fcmlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuZGlhbG9nQm94LnJpZ2h0ICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjYXB0aW9uXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfcmVzaXppbmdfY2FwdGlvbl9idXR0b25cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmNhcHRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuZGlhbG9nQm94LmNhcHRpb24gKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwicmV2ZXJ0XCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMucmV2ZXJ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmRpYWxvZ0JveC5yZXZlcnRCdXR0b24gKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwidXBkYXRlXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMubW9kaWZ5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuZWRpdCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5kZWxldGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlc2l6ZV9idXR0b247XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgd2lkdGggc2l6ZVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFBsdWdpbiBjb250ZXh0IG9iamVjdCBvZiBwbHVnaW4gKGNvcmUuY29udGV4dFtwbHVnaW5dKVxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBjb3ZlciBDb3ZlciBlbGVtZW50IChGSUdVUkUpXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50IChESVYuc2UtY29tcG9uZW50KVxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgX21vZHVsZV9nZXRTaXplWDogZnVuY3Rpb24gKGNvbnRleHRQbHVnaW4sIGVsZW1lbnQsIGNvdmVyLCBjb250YWluZXIpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkgZWxlbWVudCA9IGNvbnRleHRQbHVnaW4uX2VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvdmVyKSBjb3ZlciA9IGNvbnRleHRQbHVnaW4uX2NvdmVyO1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGNvbnRleHRQbHVnaW4uX2NvbnRhaW5lcjtcbiAgICBcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuICcnO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuICEvJSQvLnRlc3QoZWxlbWVudC5zdHlsZS53aWR0aCkgPyBlbGVtZW50LnN0eWxlLndpZHRoIDogKChjb250YWluZXIgJiYgdGhpcy51dGlsLmdldE51bWJlcihjb250YWluZXIuc3R5bGUud2lkdGgsIDIpKSB8fCAxMDApICsgJyUnO1xuICAgICAgICB9LFxuICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGhlaWdodCBzaXplXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0UGx1Z2luIGNvbnRleHQgb2JqZWN0IG9mIHBsdWdpbiAoY29yZS5jb250ZXh0W3BsdWdpbl0pXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGNvdmVyIENvdmVyIGVsZW1lbnQgKEZJR1VSRSlcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXIgQ29udGFpbmVyIGVsZW1lbnQgKERJVi5zZS1jb21wb25lbnQpXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBfbW9kdWxlX2dldFNpemVZOiBmdW5jdGlvbiAoY29udGV4dFBsdWdpbiwgZWxlbWVudCwgY292ZXIsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSBlbGVtZW50ID0gY29udGV4dFBsdWdpbi5fZWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY292ZXIpIGNvdmVyID0gY29udGV4dFBsdWdpbi5fY292ZXI7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gY29udGV4dFBsdWdpbi5fY29udGFpbmVyO1xuICAgIFxuICAgICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgIWNvdmVyKSByZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5zdHlsZS5oZWlnaHQpIHx8ICcnO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXRpbC5nZXROdW1iZXIoY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSwgMCkgPiAwICYmICF0aGlzLmNvbnRleHQucmVzaXppbmcuX3JvdGF0ZVZlcnRpY2FsID8gY292ZXIuc3R5bGUuaGVpZ2h0IDogKCEvJSQvLnRlc3QoZWxlbWVudC5zdHlsZS5oZWlnaHQpIHx8ICEvJSQvLnRlc3QoZWxlbWVudC5zdHlsZS53aWR0aCkgPyBlbGVtZW50LnN0eWxlLmhlaWdodCA6ICgoY29udGFpbmVyICYmIHRoaXMudXRpbC5nZXROdW1iZXIoY29udGFpbmVyLnN0eWxlLmhlaWdodCwgMikpIHx8IDEwMCkgKyAnJScpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIGF0IHRoZSBcIm9wZW5Nb2RpZnlcIiB0byBwdXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgdGFyZ2V0IGludG8gdGhlIHNpemUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRQbHVnaW4gY29udGV4dCBvYmplY3Qgb2YgcGx1Z2luIChjb3JlLmNvbnRleHRbcGx1Z2luXSlcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBsdWdpbk9iaiBQbHVnaW4gb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBfbW9kdWxlX3NldE1vZGlmeUlucHV0U2l6ZTogZnVuY3Rpb24gKGNvbnRleHRQbHVnaW4sIHBsdWdpbk9iaikge1xuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVJvdGF0aW9uID0gY29udGV4dFBsdWdpbi5fb25seVBlcmNlbnRhZ2UgJiYgdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbDtcbiAgICAgICAgICAgIGNvbnRleHRQbHVnaW4ucHJvcG9ydGlvbi5jaGVja2VkID0gY29udGV4dFBsdWdpbi5fcHJvcG9ydGlvbkNoZWNrZWQgPSBjb250ZXh0UGx1Z2luLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9wb3J0aW9uJykgIT09ICdmYWxzZSc7XG4gICAgXG4gICAgICAgICAgICBsZXQgeCA9IHBlcmNlbnRhZ2VSb3RhdGlvbiA/ICcnIDogdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVguY2FsbCh0aGlzLCBjb250ZXh0UGx1Z2luKTtcbiAgICAgICAgICAgIGlmICh4ID09PSBjb250ZXh0UGx1Z2luLl9kZWZhdWx0U2l6ZVgpIHggPSAnJztcbiAgICAgICAgICAgIGlmIChjb250ZXh0UGx1Z2luLl9vbmx5UGVyY2VudGFnZSkgeCA9IHRoaXMudXRpbC5nZXROdW1iZXIoeCwgMik7XG4gICAgICAgICAgICBjb250ZXh0UGx1Z2luLmlucHV0WC52YWx1ZSA9IHg7XG4gICAgICAgICAgICBwbHVnaW5PYmouc2V0SW5wdXRTaXplLmNhbGwodGhpcywgJ3gnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFjb250ZXh0UGx1Z2luLl9vbmx5UGVyY2VudGFnZSkge1xuICAgICAgICAgICAgICAgIGxldCB5ID0gcGVyY2VudGFnZVJvdGF0aW9uID8gJycgOiB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGNvbnRleHRQbHVnaW4pO1xuICAgICAgICAgICAgICAgIGlmICh5ID09PSBjb250ZXh0UGx1Z2luLl9kZWZhdWx0U2l6ZVkpIHkgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFBsdWdpbi5fb25seVBlcmNlbnRhZ2UpIHkgPSB0aGlzLnV0aWwuZ2V0TnVtYmVyKHksIDIpO1xuICAgICAgICAgICAgICAgIGNvbnRleHRQbHVnaW4uaW5wdXRZLnZhbHVlID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29udGV4dFBsdWdpbi5pbnB1dFguZGlzYWJsZWQgPSBwZXJjZW50YWdlUm90YXRpb24gPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0UGx1Z2luLmlucHV0WS5kaXNhYmxlZCA9IHBlcmNlbnRhZ2VSb3RhdGlvbiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRleHRQbHVnaW4ucHJvcG9ydGlvbi5kaXNhYmxlZCA9IHBlcmNlbnRhZ2VSb3RhdGlvbiA/IHRydWUgOiBmYWxzZTtcbiAgICBcbiAgICAgICAgICAgIHBsdWdpbk9iai5zZXRSYXRpby5jYWxsKHRoaXMpO1xuICAgICAgICB9LFxuICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGNhbGxlZCBpbiBcInNldElucHV0U2l6ZVwiIChpbnB1dCB0YWcga2V5dXBFdmVudCksIFxuICAgICAgICAgKiBjaGVja3MgdGhlIHZhbHVlIGVudGVyZWQgaW4gdGhlIGlucHV0IHRhZywgXG4gICAgICAgICAqIGNhbGN1bGF0ZXMgdGhlIHJhdGlvLCBhbmQgc2V0cyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBpbiB0aGUgaW5wdXQgdGFnIG9mIHRoZSBvcHBvc2l0ZSBzaXplLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFBsdWdpbiBjb250ZXh0IG9iamVjdCBvZiBwbHVnaW4gKGNvcmUuY29udGV4dFtwbHVnaW5dKVxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30geHkgJ3gnOiB3aWR0aCwgJ3knOiBoZWlnaHRcbiAgICAgICAgICovXG4gICAgICAgIF9tb2R1bGVfc2V0SW5wdXRTaXplOiBmdW5jdGlvbiAoY29udGV4dFBsdWdpbiwgeHkpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0UGx1Z2luLl9vbmx5UGVyY2VudGFnZSkge1xuICAgICAgICAgICAgICAgIGlmICh4eSA9PT0gJ3gnICYmIGNvbnRleHRQbHVnaW4uaW5wdXRYLnZhbHVlID4gMTAwKSBjb250ZXh0UGx1Z2luLmlucHV0WC52YWx1ZSA9IDEwMDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZiAoY29udGV4dFBsdWdpbi5wcm9wb3J0aW9uLmNoZWNrZWQgJiYgY29udGV4dFBsdWdpbi5fcmF0aW8gJiYgL1xcZC8udGVzdChjb250ZXh0UGx1Z2luLmlucHV0WC52YWx1ZSkgJiYgL1xcZC8udGVzdChjb250ZXh0UGx1Z2luLmlucHV0WS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4VW5pdCA9IGNvbnRleHRQbHVnaW4uaW5wdXRYLnZhbHVlLnJlcGxhY2UoL1xcZCt8XFwuL2csICcnKSB8fCBjb250ZXh0UGx1Z2luLnNpemVVbml0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHlVbml0ID0gY29udGV4dFBsdWdpbi5pbnB1dFkudmFsdWUucmVwbGFjZSgvXFxkK3xcXC4vZywgJycpIHx8IGNvbnRleHRQbHVnaW4uc2l6ZVVuaXQ7XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKHhVbml0ICE9PSB5VW5pdCkgcmV0dXJuO1xuICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGRlYyA9IHhVbml0ID09PSAnJScgPyAyIDogMDtcbiAgICBcbiAgICAgICAgICAgICAgICBpZiAoeHkgPT09ICd4Jykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luLmlucHV0WS52YWx1ZSA9IHRoaXMudXRpbC5nZXROdW1iZXIoY29udGV4dFBsdWdpbi5fcmF0aW9ZICogdGhpcy51dGlsLmdldE51bWJlcihjb250ZXh0UGx1Z2luLmlucHV0WC52YWx1ZSwgZGVjKSwgZGVjKSArIHlVbml0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRQbHVnaW4uaW5wdXRYLnZhbHVlID0gdGhpcy51dGlsLmdldE51bWJlcihjb250ZXh0UGx1Z2luLl9yYXRpb1ggKiB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRleHRQbHVnaW4uaW5wdXRZLnZhbHVlLCBkZWMpLCBkZWMpICsgeFVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGNhbGxlZCBpbiBcInNldFJhdGlvXCIgKGlucHV0IGFuZCBwcm9wb3J0aW9uQ2hlY2sgdGFncyBjaGFuZ2VFdmVudCksIFxuICAgICAgICAgKiBjaGVja3MgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCB0YWcsIGNhbGN1bGF0ZXMgdGhlIHJhdGlvLCBhbmQgcmVzZXRzIGl0IGluIHRoZSBpbnB1dCB0YWcuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0UGx1Z2luIGNvbnRleHQgb2JqZWN0IG9mIHBsdWdpbiAoY29yZS5jb250ZXh0W3BsdWdpbl0pXG4gICAgICAgICAqL1xuICAgICAgICBfbW9kdWxlX3NldFJhdGlvOiBmdW5jdGlvbiAoY29udGV4dFBsdWdpbikge1xuICAgICAgICAgICAgY29uc3QgeFZhbHVlID0gY29udGV4dFBsdWdpbi5pbnB1dFgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB5VmFsdWUgPSBjb250ZXh0UGx1Z2luLmlucHV0WS52YWx1ZTtcbiAgICBcbiAgICAgICAgICAgIGlmIChjb250ZXh0UGx1Z2luLnByb3BvcnRpb24uY2hlY2tlZCAmJiAvXFxkKy8udGVzdCh4VmFsdWUpICYmIC9cXGQrLy50ZXN0KHlWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4VW5pdCA9IHhWYWx1ZS5yZXBsYWNlKC9cXGQrfFxcLi9nLCAnJykgfHwgY29udGV4dFBsdWdpbi5zaXplVW5pdDtcbiAgICAgICAgICAgICAgICBjb25zdCB5VW5pdCA9IHlWYWx1ZS5yZXBsYWNlKC9cXGQrfFxcLi9nLCAnJykgfHwgY29udGV4dFBsdWdpbi5zaXplVW5pdDtcbiAgICBcbiAgICAgICAgICAgICAgICBpZiAoeFVuaXQgIT09IHlVbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRQbHVnaW4uX3JhdGlvID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY29udGV4dFBsdWdpbi5fcmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMudXRpbC5nZXROdW1iZXIoeFZhbHVlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMudXRpbC5nZXROdW1iZXIoeVZhbHVlLCAwKTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFBsdWdpbi5fcmF0aW8gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luLl9yYXRpb1ggPSB4IC8geTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFBsdWdpbi5fcmF0aW9ZID0geSAvIHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luLl9yYXRpbyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldmVydCBzaXplIG9mIGVsZW1lbnQgdG8gb3JpZ2luIHNpemUgKHBsdWdpbi5fb3JpZ2luX3csIHBsdWdpbi5fb3JpZ2luX2gpXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0UGx1Z2luIGNvbnRleHQgb2JqZWN0IG9mIHBsdWdpbiAoY29yZS5jb250ZXh0W3BsdWdpbl0pXG4gICAgICAgICAqL1xuICAgICAgICBfbW9kdWxlX3NpemVSZXZlcnQ6IGZ1bmN0aW9uIChjb250ZXh0UGx1Z2luKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dFBsdWdpbi5fb25seVBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luLmlucHV0WC52YWx1ZSA9IGNvbnRleHRQbHVnaW4uX29yaWdpbl93ID4gMTAwID8gMTAwIDogY29udGV4dFBsdWdpbi5fb3JpZ2luX3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHRQbHVnaW4uaW5wdXRYLnZhbHVlID0gY29udGV4dFBsdWdpbi5fb3JpZ2luX3c7XG4gICAgICAgICAgICAgICAgY29udGV4dFBsdWdpbi5pbnB1dFkudmFsdWUgPSBjb250ZXh0UGx1Z2luLl9vcmlnaW5faDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTYXZlIHRoZSBzaXplIGRhdGEgKGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1zaXplXCIpKVxuICAgICAgICAgKiBVc2VkIGF0IHRoZSBcInNldFNpemVcIiBtZXRob2RcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRQbHVnaW4gY29udGV4dCBvYmplY3Qgb2YgcGx1Z2luIChjb3JlLmNvbnRleHRbcGx1Z2luXSlcbiAgICAgICAgICovXG4gICAgICAgIF9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplOiBmdW5jdGlvbiAoY29udGV4dFBsdWdpbikge1xuICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMucGx1Z2lucy5yZXNpemluZy5fbW9kdWxlX2dldFNpemVYLmNhbGwodGhpcywgY29udGV4dFBsdWdpbik7XG4gICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVkuY2FsbCh0aGlzLCBjb250ZXh0UGx1Z2luKTtcbiAgICAgICAgICAgIGNvbnRleHRQbHVnaW4uX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXNpemUnLCB4ICsgJywnICsgeSk7XG4gICAgICAgICAgICBpZiAoISFjb250ZXh0UGx1Z2luLl92aWRlb1JhdGlvKSBjb250ZXh0UGx1Z2luLl92aWRlb1JhdGlvID0geTtcbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsIHRoZSByZXNpemluZyBtb2R1bGVcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRFbGVtZW50IFJlc2l6aW5nIHRhcmdldCBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwbHVnaW4gUGx1Z2luIG5hbWVcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gU2l6ZSBvZiByZXNpemluZyBkaXYge3csIGgsIHQsIGx9XG4gICAgICAgICAqL1xuICAgICAgICBjYWxsX2NvbnRyb2xsZXJfcmVzaXplOiBmdW5jdGlvbiAodGFyZ2V0RWxlbWVudCwgcGx1Z2luKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0UmVzaXppbmcgPSB0aGlzLmNvbnRleHQucmVzaXppbmc7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0UGx1Z2luID0gdGhpcy5jb250ZXh0W3BsdWdpbl07XG4gICAgICAgICAgICBjb250ZXh0UmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW4gPSBwbHVnaW47XG4gICAgXG4gICAgICAgICAgICBjb25zdCByZXNpemVDb250YWluZXIgPSBjb250ZXh0UmVzaXppbmcucmVzaXplQ29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcmVzaXplRGl2ID0gY29udGV4dFJlc2l6aW5nLnJlc2l6ZURpdjtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMudXRpbC5nZXRPZmZzZXQodGFyZ2V0RWxlbWVudCwgdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSBjb250ZXh0UmVzaXppbmcuX3JvdGF0ZVZlcnRpY2FsID0gL14oOTB8MjcwKSQvLnRlc3QoTWF0aC5hYnModGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlJykpLnRvU3RyaW5nKCkpO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgdyA9IGlzVmVydGljYWwgPyB0YXJnZXRFbGVtZW50Lm9mZnNldEhlaWdodCA6IHRhcmdldEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoID0gaXNWZXJ0aWNhbCA/IHRhcmdldEVsZW1lbnQub2Zmc2V0V2lkdGggOiB0YXJnZXRFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBvZmZzZXQudG9wO1xuICAgICAgICAgICAgY29uc3QgbCA9IG9mZnNldC5sZWZ0IC0gdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnNjcm9sbExlZnQ7XG4gICAgXG4gICAgICAgICAgICByZXNpemVDb250YWluZXIuc3R5bGUudG9wID0gdCArICdweCc7XG4gICAgICAgICAgICByZXNpemVDb250YWluZXIuc3R5bGUubGVmdCA9IGwgKyAncHgnO1xuICAgICAgICAgICAgcmVzaXplQ29udGFpbmVyLnN0eWxlLndpZHRoID0gdyArICdweCc7XG4gICAgICAgICAgICByZXNpemVDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgXG4gICAgICAgICAgICByZXNpemVEaXYuc3R5bGUudG9wID0gJzBweCc7XG4gICAgICAgICAgICByZXNpemVEaXYuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgICAgICAgICAgcmVzaXplRGl2LnN0eWxlLndpZHRoID0gIHcgKyAncHgnO1xuICAgICAgICAgICAgcmVzaXplRGl2LnN0eWxlLmhlaWdodCA9ICBoICsgJ3B4JztcbiAgICBcbiAgICAgICAgICAgIGxldCBhbGlnbiA9IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWFsaWduJykgfHwgJ2Jhc2ljJztcbiAgICAgICAgICAgIGFsaWduID0gYWxpZ24gPT09ICdub25lJyA/ICdiYXNpYycgOiBhbGlnbjtcbiAgICBcbiAgICAgICAgICAgIC8vIHRleHRcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsIHRoaXMudXRpbC5pc0NvbXBvbmVudCk7XG4gICAgICAgICAgICBjb25zdCBjb3ZlciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsICdGSUdVUkUnKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlYID0gdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVguY2FsbCh0aGlzLCBjb250ZXh0UGx1Z2luLCB0YXJnZXRFbGVtZW50LCBjb3ZlciwgY29udGFpbmVyKSB8fCAnYXV0byc7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5WSA9IGNvbnRleHRQbHVnaW4uX29ubHlQZXJjZW50YWdlICYmIHBsdWdpbiA9PT0gJ2ltYWdlJyA/ICcnIDogJywgJyArICh0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGNvbnRleHRQbHVnaW4sIHRhcmdldEVsZW1lbnQsIGNvdmVyLCBjb250YWluZXIpIHx8ICdhdXRvJyk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KGNvbnRleHRSZXNpemluZy5yZXNpemVEaXNwbGF5LCB0aGlzLmxhbmcuZGlhbG9nQm94W2FsaWduXSArICcgKCcgKyBkaXNwbGF5WCArIGRpc3BsYXlZICsgJyknKTtcbiAgICBcbiAgICAgICAgICAgIC8vIHJlc2l6aW5nIGRpc3BsYXlcbiAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5yZXNpemVCdXR0b25Hcm91cC5zdHlsZS5kaXNwbGF5ID0gY29udGV4dFBsdWdpbi5fcmVzaXppbmcgPyAnJyA6ICdub25lJztcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZURvdFNob3cgPSBjb250ZXh0UGx1Z2luLl9yZXNpemluZyAmJiAhY29udGV4dFBsdWdpbi5fcmVzaXplRG90SGlkZSAmJiAhY29udGV4dFBsdWdpbi5fb25seVBlcmNlbnRhZ2UgPyAnZmxleCcgOiAnbm9uZSc7XG4gICAgICAgICAgICBjb25zdCByZXNpemVIYW5kbGVzID0gY29udGV4dFJlc2l6aW5nLnJlc2l6ZUhhbmRsZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVzaXplSGFuZGxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXNbaV0uc3R5bGUuZGlzcGxheSA9IHJlc2l6ZURvdFNob3c7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZiAoY29udGV4dFBsdWdpbi5fcmVzaXppbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGlvbnMgPSBjb250ZXh0UmVzaXppbmcucm90YXRpb25CdXR0b25zO1xuICAgICAgICAgICAgICAgIHJvdGF0aW9uc1swXS5zdHlsZS5kaXNwbGF5ID0gcm90YXRpb25zWzFdLnN0eWxlLmRpc3BsYXkgPSBjb250ZXh0UGx1Z2luLl9yb3RhdGlvbiA/ICcnIDogJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8gYWxpZ24gaWNvblxuICAgICAgICAgICAgY29uc3QgYWxpZ25MaXN0ID0gY29udGV4dFJlc2l6aW5nLmFsaWduTWVudUxpc3Q7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlRWxlbWVudChjb250ZXh0UmVzaXppbmcuYWxpZ25CdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbnRleHRSZXNpemluZy5hbGlnbkljb25zW2FsaWduXSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYWxpZ25MaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsaWduTGlzdFtpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSA9PT0gYWxpZ24pIHRoaXMudXRpbC5hZGRDbGFzcyhhbGlnbkxpc3RbaV0sICdvbicpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGFsaWduTGlzdFtpXSwgJ29uJyk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAvLyBwZXJjZW50YWdlIGFjdGl2ZVxuICAgICAgICAgICAgY29uc3QgcEJ1dHRvbnMgPSBjb250ZXh0UmVzaXppbmcucGVyY2VudGFnZUJ1dHRvbnM7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC8lJC8udGVzdCh0YXJnZXRFbGVtZW50LnN0eWxlLndpZHRoKSAmJiAvJSQvLnRlc3QoY29udGFpbmVyLnN0eWxlLndpZHRoKSA/ICh0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRhaW5lci5zdHlsZS53aWR0aCwgMCkgLyAxMDApICsgJycgOiAnJyA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcEJ1dHRvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocEJ1dHRvbnNbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhwQnV0dG9uc1tpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhwQnV0dG9uc1tpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIC8vIGNhcHRpb24gZGlzcGxheSwgYWN0aXZlXG4gICAgICAgICAgICBpZiAoIWNvbnRleHRQbHVnaW4uX2NhcHRpb25TaG93KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLmNhcHRpb25CdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLmNhcHRpb25CdXR0b24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnV0aWwuZ2V0Q2hpbGRFbGVtZW50KHRhcmdldEVsZW1lbnQucGFyZW50Tm9kZSwgJ2ZpZ2NhcHRpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGV4dFJlc2l6aW5nLmNhcHRpb25CdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFBsdWdpbi5fY2FwdGlvbkNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0UmVzaXppbmcuY2FwdGlvbkJ1dHRvbiwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luLl9jYXB0aW9uQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGlsLnNldERpc2FibGVkQnV0dG9ucyh0cnVlLCB0aGlzLnJlc2l6aW5nRGlzYWJsZWRCdXR0b25zKTtcbiAgICAgICAgICAgIHJlc2l6ZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgY29uc3QgYWRkT2Zmc2V0ID0ge2xlZnQ6IDAsIHRvcDogNTB9O1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZnJhbWUpIHtcbiAgICAgICAgICAgICAgICBhZGRPZmZzZXQubGVmdCAtPSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUucGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0O1xuICAgICAgICAgICAgICAgIGFkZE9mZnNldC50b3AgLT0gdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lLnBhcmVudEVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldENvbnRyb2xsZXJQb3NpdGlvbihjb250ZXh0UmVzaXppbmcucmVzaXplQnV0dG9uLCByZXNpemVDb250YWluZXIsICdib3R0b20nLCBhZGRPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09uKHJlc2l6ZUNvbnRhaW5lciwgY29udGV4dFJlc2l6aW5nLnJlc2l6ZUJ1dHRvbiwgdGhpcy51dGlsLnNldERpc2FibGVkQnV0dG9ucy5iaW5kKHRoaXMsIGZhbHNlLCB0aGlzLnJlc2l6aW5nRGlzYWJsZWRCdXR0b25zKSwgdGFyZ2V0RWxlbWVudCwgcGx1Z2luKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5fcmVzaXplX3cgPSB3O1xuICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLl9yZXNpemVfaCA9IGg7XG4gICAgXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5TaXplID0gKHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdvcmlnaW4tc2l6ZScpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLl9vcmlnaW5fdyA9IG9yaWdpblNpemVbMF0gfHwgdGFyZ2V0RWxlbWVudC5uYXR1cmFsV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0UmVzaXppbmcuX29yaWdpbl9oID0gb3JpZ2luU2l6ZVsxXSB8fCB0YXJnZXRFbGVtZW50Lm5hdHVyYWxIZWlnaHQ7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHc6IHcsXG4gICAgICAgICAgICAgICAgaDogaCxcbiAgICAgICAgICAgICAgICB0OiB0LFxuICAgICAgICAgICAgICAgIGw6IGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIF9jbG9zZUFsaWduTWVudTogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYWxpZ24gc3VibWVudSBvZiBtb2R1bGVcbiAgICAgICAgICovXG4gICAgICAgIG9wZW5BbGlnbk1lbnU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsaWduQnV0dG9uID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLmFsaWduQnV0dG9uO1xuICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGFsaWduQnV0dG9uLCAnb24nKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5hbGlnbk1lbnUuc3R5bGUudG9wID0gKGFsaWduQnV0dG9uLm9mZnNldFRvcCArIGFsaWduQnV0dG9uLm9mZnNldEhlaWdodCkgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc2l6aW5nLmFsaWduTWVudS5zdHlsZS5sZWZ0ID0gKGFsaWduQnV0dG9uLm9mZnNldExlZnQgLSBhbGlnbkJ1dHRvbi5vZmZzZXRXaWR0aCAvIDIpICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5hbGlnbk1lbnUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX2Nsb3NlQWxpZ25NZW51ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRleHQucmVzaXppbmcuYWxpZ25CdXR0b24sICdvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5hbGlnbk1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURvY0V2ZW50KCdjbGljaycsIHRoaXMucGx1Z2lucy5yZXNpemluZy5fY2xvc2VBbGlnbk1lbnUpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fY2xvc2VBbGlnbk1lbnUgPSBudWxsO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgIFxuICAgICAgICAgICAgdGhpcy5hZGREb2NFdmVudCgnY2xpY2snLCB0aGlzLnBsdWdpbnMucmVzaXppbmcuX2Nsb3NlQWxpZ25NZW51KTtcbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDbGljayBldmVudCBvZiByZXNpemluZyB0b29sYmFyXG4gICAgICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb24gb2YgdGhlIGNsaWNrZWQgdG9vbGJhciBidXR0b24uXG4gICAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIG9uQ2xpY2tfcmVzaXplQnV0dG9uOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpIHx8IHRhcmdldC5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgXG4gICAgICAgICAgICBpZiAoIWNvbW1hbmQpIHJldHVybjtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIHx8IHRhcmdldC5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgcGx1Z2luTmFtZSA9IHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbjtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gdGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEVsID0gY3VycmVudENvbnRleHQuX2VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TW9kdWxlID0gdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIFxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBsdWdpbnMucmVzaXppbmcuX2Nsb3NlQWxpZ25NZW51ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9jbG9zZUFsaWduTWVudSgpO1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSAnb25hbGlnbicpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcucmVzZXRUcmFuc2Zvcm0uY2FsbCh0aGlzLCBjb250ZXh0RWwpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLnNldEF1dG9TaXplLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGNvbnRleHRFbCwgcGx1Z2luTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BlcmNlbnQnOlxuICAgICAgICAgICAgICAgICAgICBsZXQgcGVyY2VudFkgPSB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGN1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBjb250ZXh0RWwuZ2V0QXR0cmlidXRlKCdkYXRhLXBlcmNlbnRhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlKSBwZXJjZW50WSA9IHBlcmNlbnRhZ2Uuc3BsaXQoJywnKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcucmVzZXRUcmFuc2Zvcm0uY2FsbCh0aGlzLCBjb250ZXh0RWwpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLnNldFBlcmNlbnRTaXplLmNhbGwodGhpcywgKHZhbHVlICogMTAwKSwgKHRoaXMudXRpbC5nZXROdW1iZXIocGVyY2VudFksIDApID09PSBudWxsIHx8ICEvJSQvLnRlc3QocGVyY2VudFkpKSA/ICcnIDogcGVyY2VudFkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChjb250ZXh0RWwsIHBsdWdpbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtaXJyb3InOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gY29udGV4dEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGUnKSB8fCAnMCc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4ID0gY29udGV4dEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGVYJykgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gY29udGV4dEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGVZJykgfHwgJyc7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID09PSAnaCcgJiYgIXRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwpIHx8ICh2YWx1ZSA9PT0gJ3YnICYmIHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0geSA/ICcnIDogJzE4MCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0geCA/ICcnIDogJzE4MCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlWCcsIHgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0RWwuc2V0QXR0cmlidXRlKCdkYXRhLXJvdGF0ZVknLCB5KTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fc2V0VHJhbnNGb3JtKGNvbnRleHRFbCwgciwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JvdGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHRSZXNpemluZyA9IHRoaXMuY29udGV4dC5yZXNpemluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2xvcGUgPSAoY29udGV4dEVsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGUnKSAqIDEpICsgKHZhbHVlICogMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZyA9IHRoaXMuX3cuTWF0aC5hYnMoc2xvcGUpID49IDM2MCA/IDAgOiBzbG9wZTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlJywgZGVnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA9IC9eKDkwfDI3MCkkLy50ZXN0KHRoaXMuX3cuTWF0aC5hYnMoZGVnKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnNldFRyYW5zZm9ybVNpemUuY2FsbCh0aGlzLCBjb250ZXh0RWwsIG51bGwsIG51bGwpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQoY29udGV4dEVsLCBwbHVnaW5OYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb25hbGlnbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5vcGVuQWxpZ25NZW51LmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlnbic6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWduVmFsdWUgPSB2YWx1ZSA9PT0gJ2Jhc2ljJyA/ICdub25lJyA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLnNldEFsaWduLmNhbGwodGhpcywgYWxpZ25WYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGNvbnRleHRFbCwgcGx1Z2luTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gIWN1cnJlbnRDb250ZXh0Ll9jYXB0aW9uQ2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZS5vcGVuTW9kaWZ5LmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0Ll9jYXB0aW9uQ2hlY2tlZCA9IGN1cnJlbnRDb250ZXh0LmNhcHRpb25DaGVja0VsLmNoZWNrZWQgPSBjYXB0aW9uO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLnVwZGF0ZV9pbWFnZS5jYWxsKHRoaXMsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdGlvblRleHQgPSB0aGlzLnV0aWwuZ2V0Q2hpbGRFbGVtZW50KGN1cnJlbnRDb250ZXh0Ll9jYXB0aW9uLCBmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Lm5vZGVUeXBlID09PSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHRpb25UZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRleHQuX2NhcHRpb24uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShjYXB0aW9uVGV4dCwgMCwgY2FwdGlvblRleHQsIGNhcHRpb25UZXh0LnRleHRDb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChjb250ZXh0RWwsIHBsdWdpbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZS5vcGVuTW9kaWZ5LmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmV2ZXJ0JzpcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZS5zZXRPcmlnaW5TaXplLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGNvbnRleHRFbCwgcGx1Z2luTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUub3Blbk1vZGlmeS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuZGVzdHJveS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSB0cmFuc2Zvcm0gc3R5bGUgKHJvdGF0aW9uKSBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRhcmdldCBlbGVtZW50XG4gICAgICAgICAqL1xuICAgICAgICByZXNldFRyYW5zZm9ybTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2l6ZScpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbicpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA9IGZhbHNlO1xuICAgIFxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gJyc7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGUnLCAnJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGVYJywgJycpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlWScsICcnKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1t0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW5dLnNldFNpemUuY2FsbCh0aGlzLCBzaXplWzBdID8gc2l6ZVswXSA6ICdhdXRvJywgc2l6ZVsxXSA/IHNpemVbMV0gOiAnJywgdHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSB0cmFuc2Zvcm0gc3R5bGUgKHJvdGF0aW9uKSBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRhcmdldCBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfG51bGx9IHdpZHRoIEVsZW1lbnQncyB3aWR0aCBzaXplXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfG51bGx9IGhlaWdodCBFbGVtZW50J3MgaGVpZ2h0IHNpemVcbiAgICAgICAgICovXG4gICAgICAgIHNldFRyYW5zZm9ybVNpemU6IGZ1bmN0aW9uIChlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgcGVyY2VudGFnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXBlcmNlbnRhZ2UnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLmNvbnRleHQucmVzaXppbmcuX3JvdGF0ZVZlcnRpY2FsO1xuICAgICAgICAgICAgY29uc3QgZGVnID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlJykgKiAxO1xuICAgICAgICAgICAgbGV0IHRyYW5zT3JpZ2luID0gJyc7XG4gICAgXG4gICAgICAgICAgICBpZiAocGVyY2VudGFnZSAmJiAhaXNWZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2VbMF0gPT09ICdhdXRvJyAmJiBwZXJjZW50YWdlWzFdID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW3RoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbl0uc2V0QXV0b1NpemUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNbdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luXS5zZXRQZXJjZW50U2l6ZS5jYWxsKHRoaXMsIHBlcmNlbnRhZ2VbMF0sIHBlcmNlbnRhZ2VbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY292ZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCAnRklHVVJFJyk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFcgPSB3aWR0aCB8fCBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEggPSBoZWlnaHQgfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdyA9IChpc1ZlcnRpY2FsID8gb2Zmc2V0SCA6IG9mZnNldFcpICsgJ3B4JztcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gKGlzVmVydGljYWwgPyBvZmZzZXRXIDogb2Zmc2V0SCkgKyAncHgnO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNbdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luXS5jYW5jZWxQZXJjZW50QXR0ci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc1t0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW5dLnNldFNpemUuY2FsbCh0aGlzLCBvZmZzZXRXICsgJ3B4Jywgb2Zmc2V0SCArICdweCcsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICBjb3Zlci5zdHlsZS53aWR0aCA9IHc7XG4gICAgICAgICAgICAgICAgY292ZXIuc3R5bGUuaGVpZ2h0ID0gKCEhdGhpcy5jb250ZXh0W3RoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbl0uX2NhcHRpb24gPyAnJyA6IGgpO1xuICAgIFxuICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFuc1cgPSAob2Zmc2V0Vy8yKSArICdweCAnICsgKG9mZnNldFcvMikgKyAncHggMCc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFuc0ggPSAob2Zmc2V0SC8yKSArICdweCAnICsgKG9mZnNldEgvMikgKyAncHggMCc7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zT3JpZ2luID0gZGVnID09PSA5MCB8fCBkZWcgPT09IC0yNzAgPyB0cmFuc0ggOiB0cmFuc1c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSB0cmFuc09yaWdpbjtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fc2V0VHJhbnNGb3JtKGVsZW1lbnQsIGRlZy50b1N0cmluZygpLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yb3RhdGVYJykgfHwgJycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdGF0ZVknKSB8fCAnJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxzZSBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gJyc7XG4gICAgXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuc2V0Q2FwdGlvblBvc2l0aW9uLmNhbGwodGhpcywgZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIF9zZXRUcmFuc0Zvcm06IGZ1bmN0aW9uIChlbGVtZW50LCByLCB4LCB5KSB7XG4gICAgICAgICAgICBsZXQgd2lkdGggPSAoZWxlbWVudC5vZmZzZXRXaWR0aCAtIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KSAqICgvLS8udGVzdChyKSA/IDEgOiAtMSk7XG4gICAgICAgICAgICBsZXQgdHJhbnNsYXRlID0gJyc7XG4gICAgXG4gICAgICAgICAgICBpZiAoL1sxLTldLy50ZXN0KHIpICYmICh4IHx8IHkpKSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlID0geCA/ICdZJyA6ICdYJztcbiAgICBcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0geCAmJiB5ID8gJ1gnIDogeSA/IHRyYW5zbGF0ZSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzI3MCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAqPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSA9IHggJiYgeSA/ICdZJyA6IHggPyB0cmFuc2xhdGUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICctOTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0geCAmJiB5ID8gJ1knIDogeCA/IHRyYW5zbGF0ZSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy0yNzAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggKj0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgPSB4ICYmIHkgPyAnWCcgOiB5ID8gdHJhbnNsYXRlIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmIChyICUgMTgwID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICdyb3RhdGUoJyArIHIgKyAnZGVnKScgKyAoeCA/ICcgcm90YXRlWCgnICsgeCArICdkZWcpJyA6ICcnKSArICh5ID8gJyByb3RhdGVZKCcgKyB5ICsgJ2RlZyknIDogJycpICsgKHRyYW5zbGF0ZSA/ICcgdHJhbnNsYXRlJyArIHRyYW5zbGF0ZSArICcoJyArIHdpZHRoICsgJ3B4KScgOiAnJyk7XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBjYXB0aW9uIGlzIHNldCBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnQgKG5vdCBjYXB0aW9uIGVsZW1lbnQpXG4gICAgICAgICAqL1xuICAgICAgICBzZXRDYXB0aW9uUG9zaXRpb246IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBmaWdjYXB0aW9uID0gdGhpcy51dGlsLmdldENoaWxkRWxlbWVudCh0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCAnRklHVVJFJyksICdGSUdDQVBUSU9OJyk7XG4gICAgICAgICAgICBpZiAoZmlnY2FwdGlvbikge1xuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwgPyBlbGVtZW50Lm9mZnNldFdpZHRoIC0gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwKSArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gTW91c2UgZG93biBldmVudCBvZiByZXNpemUgaGFuZGxlc1xuICAgICAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgRXZlbnQgb2JqZWN0IFxuICAgICAgICAgKi9cbiAgICAgICAgb25Nb3VzZURvd25fcmVzaXplX2hhbmRsZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRSZXNpemluZyA9IHRoaXMuY29udGV4dC5yZXNpemluZztcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGNvbnRleHRSZXNpemluZy5fcmVzaXplX2RpcmVjdGlvbiA9IGUudGFyZ2V0LmNsYXNzTGlzdFswXTtcbiAgICBcbiAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5fcmVzaXplQ2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5fcmVzaXplQ2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICBjb250ZXh0UmVzaXppbmcucmVzaXplQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBjb250ZXh0UmVzaXppbmcucmVzaXplRGl2LnN0eWxlLmZsb2F0ID0gL2wvLnRlc3QoZGlyZWN0aW9uKSA/ICdyaWdodCcgOiAvci8udGVzdChkaXJlY3Rpb24pID8gJ2xlZnQnIDogJ25vbmUnO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgY2xvc3VyZUZ1bmNfYmluZCA9IGZ1bmN0aW9uIGNsb3N1cmVGdW5jKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAna2V5ZG93bicgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xuICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IGNvbnRleHRSZXNpemluZy5faXNDaGFuZ2U7XG4gICAgICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLl9pc0NoYW5nZSA9IGZhbHNlO1xuICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRG9jRXZlbnQoJ21vdXNlbW92ZScsIHJlc2l6aW5nX2VsZW1lbnRfYmluZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEb2NFdmVudCgnbW91c2V1cCcsIGNsb3N1cmVGdW5jX2JpbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRG9jRXZlbnQoJ2tleWRvd24nLCBjbG9zdXJlRnVuY19iaW5kKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc1t0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW5dLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHJlc2l6ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuY2FuY2VsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwodGhpcywgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlKSB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgcmVzaXppbmdfZWxlbWVudF9iaW5kID0gdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnJlc2l6aW5nX2VsZW1lbnQuYmluZCh0aGlzLCBjb250ZXh0UmVzaXppbmcsIGRpcmVjdGlvbiwgdGhpcy5jb250ZXh0W2NvbnRleHRSZXNpemluZy5fcmVzaXplX3BsdWdpbl0pO1xuICAgICAgICAgICAgdGhpcy5hZGREb2NFdmVudCgnbW91c2Vtb3ZlJywgcmVzaXppbmdfZWxlbWVudF9iaW5kKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRG9jRXZlbnQoJ21vdXNldXAnLCBjbG9zdXJlRnVuY19iaW5kKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRG9jRXZlbnQoJ2tleWRvd24nLCBjbG9zdXJlRnVuY19iaW5kKTtcbiAgICAgICAgfSxcbiAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBNb3VzZSBtb3ZlIGV2ZW50IGFmdGVyIGNhbGwgXCJvbk1vdXNlRG93bl9yZXNpemVfaGFuZGxlXCIgb2YgcmVzaXplIGhhbmRsZXNcbiAgICAgICAgICogVGhlIHNpemUgb2YgdGhlIG1vZHVsZSdzIFwiZGl2XCIgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHRoZSBtb3VzZSBtb3ZlIGV2ZW50LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFJlc2l6aW5nIFwiY29yZS5jb250ZXh0LnJlc2l6aW5nXCIgb2JqZWN0IChiaW5kaW5nIGFyZ3VtZW50KVxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uIERpcmVjdGlvbiAoXCJ0bFwiLCBcInRyXCIsIFwiYmxcIiwgXCJiclwiLCBcImx3XCIsIFwidGhcIiwgXCJyd1wiLCBcImJoXCIpIChiaW5kaW5nIGFyZ3VtZW50KVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luIFwiY29yZS5jb250ZXh0W2N1cnJlbnRQbHVnaW5dXCIgb2JqZWN0IChiaW5kaW5nIGFyZ3VtZW50KVxuICAgICAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgRXZlbnQgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICByZXNpemluZ19lbGVtZW50OiBmdW5jdGlvbiAoY29udGV4dFJlc2l6aW5nLCBkaXJlY3Rpb24sIHBsdWdpbiwgZSkge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgXG4gICAgICAgICAgICBsZXQgcmVzdWx0VyA9IHBsdWdpbi5fZWxlbWVudF93O1xuICAgICAgICAgICAgbGV0IHJlc3VsdEggPSBwbHVnaW4uX2VsZW1lbnRfaDtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHcgPSBwbHVnaW4uX2VsZW1lbnRfdyArICgvci8udGVzdChkaXJlY3Rpb24pID8gY2xpZW50WCAtIGNvbnRleHRSZXNpemluZy5fcmVzaXplQ2xpZW50WCA6IGNvbnRleHRSZXNpemluZy5fcmVzaXplQ2xpZW50WCAtIGNsaWVudFgpO1xuICAgICAgICAgICAgY29uc3QgaCA9IHBsdWdpbi5fZWxlbWVudF9oICsgKC9iLy50ZXN0KGRpcmVjdGlvbikgPyBjbGllbnRZIC0gY29udGV4dFJlc2l6aW5nLl9yZXNpemVDbGllbnRZIDogY29udGV4dFJlc2l6aW5nLl9yZXNpemVDbGllbnRZIC0gY2xpZW50WSk7XG4gICAgICAgICAgICBjb25zdCB3aCA9ICgocGx1Z2luLl9lbGVtZW50X2ggLyBwbHVnaW4uX2VsZW1lbnRfdykgKiB3KTtcbiAgICBcbiAgICAgICAgICAgIGlmICgvdC8udGVzdChkaXJlY3Rpb24pKSBjb250ZXh0UmVzaXppbmcucmVzaXplRGl2LnN0eWxlLnRvcCA9IChwbHVnaW4uX2VsZW1lbnRfaCAtICgvaC8udGVzdChkaXJlY3Rpb24pID8gaCA6IHdoKSkgKyAncHgnO1xuICAgICAgICAgICAgaWYgKC9sLy50ZXN0KGRpcmVjdGlvbikpIGNvbnRleHRSZXNpemluZy5yZXNpemVEaXYuc3R5bGUubGVmdCA9IChwbHVnaW4uX2VsZW1lbnRfdyAtIHcpICsgJ3B4JztcbiAgICBcbiAgICAgICAgICAgIGlmICgvcnxsLy50ZXN0KGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0UmVzaXppbmcucmVzaXplRGl2LnN0eWxlLndpZHRoID0gdyArICdweCc7XG4gICAgICAgICAgICAgICAgcmVzdWx0VyA9IHc7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZiAoL14odHxiKVteaF0kLy50ZXN0KGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0UmVzaXppbmcucmVzaXplRGl2LnN0eWxlLmhlaWdodCA9IHdoICsgJ3B4JztcbiAgICAgICAgICAgICAgICByZXN1bHRIID0gd2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgvXih0fGIpaCQvLnRlc3QoZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5yZXNpemVEaXYuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgICAgICAgICAgcmVzdWx0SCA9IGg7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb250ZXh0UmVzaXppbmcuX3Jlc2l6ZV93ID0gcmVzdWx0VztcbiAgICAgICAgICAgIGNvbnRleHRSZXNpemluZy5fcmVzaXplX2ggPSByZXN1bHRIO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dChjb250ZXh0UmVzaXppbmcucmVzaXplRGlzcGxheSwgdGhpcy5fdy5NYXRoLnJvdW5kKHJlc3VsdFcpICsgJyB4ICcgKyB0aGlzLl93Lk1hdGgucm91bmQocmVzdWx0SCkpO1xuICAgICAgICAgICAgY29udGV4dFJlc2l6aW5nLl9pc0NoYW5nZSA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmVzaXplIHRoZSBlbGVtZW50IHRvIHRoZSBzaXplIG9mIHRoZSBcImRpdlwiIGFkanVzdGVkIGluIHRoZSBcInJlc2l6aW5nX2VsZW1lbnRcIiBtZXRob2QuXG4gICAgICAgICAqIENhbGxlZCBhdCB0aGUgbW91c2UtdXAgZXZlbnQgcmVnaXN0ZXJlZCBpbiBcIm9uTW91c2VEb3duX3Jlc2l6ZV9oYW5kbGVcIi5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGRpcmVjdGlvbiBEaXJlY3Rpb24gKFwidGxcIiwgXCJ0clwiLCBcImJsXCIsIFwiYnJcIiwgXCJsd1wiLCBcInRoXCIsIFwicndcIiwgXCJiaFwiKVxuICAgICAgICAgKi9cbiAgICAgICAgY2FuY2VsX2NvbnRyb2xsZXJfcmVzaXplOiBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBcbiAgICAgICAgICAgIGxldCB3ID0gdGhpcy5fdy5NYXRoLnJvdW5kKGlzVmVydGljYWwgPyB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9oIDogdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfdyk7XG4gICAgICAgICAgICBsZXQgaCA9IHRoaXMuX3cuTWF0aC5yb3VuZChpc1ZlcnRpY2FsID8gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfdyA6IHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX2gpO1xuICAgIFxuICAgICAgICAgICAgaWYgKCFpc1ZlcnRpY2FsICYmICEvJSQvLnRlc3QodykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gMTY7XG4gICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUuY2xpZW50V2lkdGggLSAocGFkZGluZyAqIDIpIC0gMjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51dGlsLmdldE51bWJlcih3LCAwKSA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGggPSB0aGlzLl93Lk1hdGgucm91bmQoKGggLyB3KSAqIGxpbWl0KTtcbiAgICAgICAgICAgICAgICAgICAgdyA9IGxpbWl0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW47XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgsIGZhbHNlLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQodGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdLl9lbGVtZW50LCBwbHVnaW5OYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG5vR2xvYmFsID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghd2luZG93LlNVTkVESVRPUl9NT0RVTEVTKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnU1VORURJVE9SX01PRFVMRVMnLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUywgJ3Jlc2l6aW5nJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogcmVzaXppbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc2l6aW5nO1xufSkpOyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cbiAgICAgICAgICAgIGZhY3RvcnkoZ2xvYmFsLCB0cnVlKSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmICghdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NVTkVESVRPUl9NT0RVTEVTIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeSh3KTtcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShnbG9iYWwpO1xuICAgIH1cbn0odHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBub0dsb2JhbCkge1xuICAgIGNvbnN0IGZpbGVNYW5hZ2VyID0ge1xuICAgICAgICBuYW1lOiAnZmlsZU1hbmFnZXInLFxuICAgICAgICBfeG1sSHR0cDogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFVwbG9hZCB0aGUgZmlsZSB0byB0aGUgc2VydmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkVXJsIFVwbG9hZCBzZXJ2ZXIgdXJsXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHVwbG9hZEhlYWRlciBSZXF1ZXN0IGhlYWRlclxuICAgICAgICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSBGb3JtRGF0YSBpbiBib2R5XG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gY2FsbEJhY2sgU3VjY2VzcyBjYWxsIGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBlcnJvckNhbGxCYWNrIEVycm9yIGNhbGwgYmFjayBmdW5jdGlvblxuICAgICAgICAgKiBAZXhhbXBsZSB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIudXBsb2FkLmNhbGwodGhpcywgaW1hZ2VVcGxvYWRVcmwsIHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZEhlYWRlciwgZm9ybURhdGEsIHRoaXMucGx1Z2lucy5pbWFnZS5jYWxsQmFja19pbWdVcGxvYWQuYmluZCh0aGlzLCBpbmZvKSwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEVycm9yKTtcbiAgICAgICAgICovXG4gICAgICAgIHVwbG9hZDogZnVuY3Rpb24gKHVwbG9hZFVybCwgdXBsb2FkSGVhZGVyLCBmb3JtRGF0YSwgY2FsbEJhY2ssIGVycm9yQ2FsbEJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQbHVnaW4gPSB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXI7XG4gICAgICAgICAgICBjb25zdCB4bWxIdHRwID0gZmlsZVBsdWdpbi5feG1sSHR0cCA9IHRoaXMudXRpbC5nZXRYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgICB4bWxIdHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZpbGVQbHVnaW4uX2NhbGxCYWNrVXBsb2FkLmJpbmQodGhpcywgeG1sSHR0cCwgY2FsbEJhY2ssIGVycm9yQ2FsbEJhY2spO1xuICAgICAgICAgICAgeG1sSHR0cC5vcGVuKCdwb3N0JywgdXBsb2FkVXJsLCB0cnVlKTtcbiAgICAgICAgICAgIGlmKHVwbG9hZEhlYWRlciAhPT0gbnVsbCAmJiB0eXBlb2YgdXBsb2FkSGVhZGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLl93Lk9iamVjdC5rZXlzKHVwbG9hZEhlYWRlcikubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgZm9yKGxldCBrZXkgaW4gdXBsb2FkSGVhZGVyKXtcbiAgICAgICAgICAgICAgICAgICAgeG1sSHR0cC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdXBsb2FkSGVhZGVyW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhtbEh0dHAuc2VuZChmb3JtRGF0YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2NhbGxCYWNrVXBsb2FkOiBmdW5jdGlvbiAoeG1sSHR0cCwgY2FsbEJhY2ssIGVycm9yQ2FsbEJhY2spIHtcbiAgICAgICAgICAgIGlmICh4bWxIdHRwLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoeG1sSHR0cC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEJhY2soeG1sSHR0cCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmZpbGVNYW5hZ2VyLnVwbG9hZC5jYWxsQmFjay5mYWlsXSBjYXVzZSA6IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGV4Y2VwdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSAheG1sSHR0cC5yZXNwb25zZVRleHQgPyB4bWxIdHRwIDogSlNPTi5wYXJzZSh4bWxIdHRwLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsQmFjayAhPT0gJ2Z1bmN0aW9uJyB8fCBlcnJvckNhbGxCYWNrKCcnLCByZXMsIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSAnW1NVTkVESVRPUi5maWxlTWFuYWdlci51cGxvYWQuc2VydmVyRXhjZXB0aW9uXSBzdGF0dXM6ICcgKyB4bWxIdHRwLnN0YXR1cyArICcsIHJlc3BvbnNlOiAnICsgKHJlcy5lcnJvck1lc3NhZ2UgfHwgeG1sSHR0cC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMubm90aWNlT3BlbihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tlIHRoZSBmaWxlJ3MgaW5mb3JtYXRpb24gYW5kIG1vZGlmeSB0aGUgdGFnIHRoYXQgZG9lcyBub3QgZml0IHRoZSBmb3JtYXQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIFBsdWdpbiBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHRhZ05hbWVzIFRhZyBhcnJheSB0byBjaGVja1xuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHVwbG9hZEV2ZW50SGFuZGxlciBFdmVudCBoYW5kbGVyIHRvIHByb2Nlc3MgdXBkYXRlZCBmaWxlIGluZm8gYWZ0ZXIgY2hlY2tpbmcgKHVzZWQgaW4gXCJzZXRJbmZvXCIpXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmeUhhbmRsZXIgQSBmdW5jdGlvbiB0byBtb2RpZnkgYSB0YWcgdGhhdCBkb2VzIG5vdCBmaXQgdGhlIGZvcm1hdCAoQXJndW1lbnQgdmFsdWU6IFRhZyBlbGVtZW50KVxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlc2l6aW5nIFRydWUgaWYgdGhlIHBsdWdpbiBpcyB1c2luZyBhIHJlc2l6aW5nIG1vZHVsZVxuICAgICAgICAgKiBAZXhhbXBsZSBcbiAgICAgICAgICogY29uc3QgbW9kaWZ5SGFuZGxlciA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICogICAgICBpbWFnZVBsdWdpbi5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCB0YWcsIG51bGwpO1xuICAgICAgICAgKiAgICAgIGltYWdlUGx1Z2luLm9wZW5Nb2RpZnkuY2FsbCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICogICAgICBpbWFnZVBsdWdpbi51cGRhdGVfaW1hZ2UuY2FsbCh0aGlzLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAqICB9LmJpbmQodGhpcyk7XG4gICAgICAgICAqICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuY2hlY2tJbmZvLmNhbGwodGhpcywgJ2ltYWdlJywgWydpbWcnXSwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZCwgbW9kaWZ5SGFuZGxlciwgdHJ1ZSk7XG4gICAgICAgICAqL1xuICAgICAgICBjaGVja0luZm86IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCB0YWdOYW1lcywgdXBsb2FkRXZlbnRIYW5kbGVyLCBtb2RpZnlIYW5kbGVyLCByZXNpemluZykge1xuICAgICAgICAgICAgbGV0IHRhZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0YWdOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRhZ3MgPSB0YWdzLmNvbmNhdChbXS5zbGljZS5jYWxsKHRoaXMuY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZXNbaV0pKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV07XG4gICAgICAgICAgICBjb25zdCBpbmZvTGlzdCA9IGNvbnRleHQuX2luZm9MaXN0O1xuICAgICAgICAgICAgY29uc3Qgc2V0RmlsZUluZm8gPSB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuc2V0SW5mby5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGFncy5sZW5ndGggPT09IGluZm9MaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHJlc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudHNJbmZvUmVzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpbGVJbmZvKHBsdWdpbk5hbWUsIHRhZ3NbaV0sIHVwbG9hZEV2ZW50SGFuZGxlciwgbnVsbCwgcmVzaXppbmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGluZm9MaXN0Lmxlbmd0aCwgaW5mbzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gaW5mb0xpc3RbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIGluZm8uc3JjID09PSB0LnNyYyAmJiBpbmZvLmluZGV4LnRvU3RyaW5nKCkgPT09IHQuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4Jyk7IH0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9VcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhc3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmZvVXBkYXRlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVja1xuICAgICAgICAgICAgY29uc3QgX3Jlc2l6ZV9wbHVnaW4gPSByZXNpemluZyA/IHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA6ICcnO1xuICAgICAgICAgICAgaWYgKHJlc2l6aW5nKSB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW4gPSBwbHVnaW5OYW1lO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRhZ3MgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGluZm9JbmRleCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGluZm9MaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5mb0luZGV4W2ldID0gaW5mb0xpc3RbaV0uaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aCwgdGFnOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWcgPSB0YWdzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGFnLCB0aGlzLnV0aWwuaXNNZWRpYUNvbXBvbmVudCkgfHwgIS9GSUdVUkUvaS50ZXN0KHRhZy5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFncy5wdXNoKGNvbnRleHQuX2luZm9JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeUhhbmRsZXIodGFnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0YWcuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JykgfHwgaW5mb0luZGV4LmluZGV4T2YodGFnLmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpICogMSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWdzLnB1c2goY29udGV4dC5faW5mb0luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGFnLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpO1xuICAgICAgICAgICAgICAgICAgICBzZXRGaWxlSW5mbyhwbHVnaW5OYW1lLCB0YWcsIHVwbG9hZEV2ZW50SGFuZGxlciwgbnVsbCwgcmVzaXppbmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWdzLnB1c2godGFnLmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpICogMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgZGF0YUluZGV4OyBpIDwgaW5mb0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBkYXRhSW5kZXggPSBpbmZvTGlzdFtpXS5pbmRleDtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhZ3MuaW5kZXhPZihkYXRhSW5kZXgpID4gLTEpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgaW5mb0xpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXBsb2FkRXZlbnRIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB1cGxvYWRFdmVudEhhbmRsZXIobnVsbCwgZGF0YUluZGV4LCAnZGVsZXRlJywgbnVsbCwgMCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzaXppbmcpIHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA9IF9yZXNpemVfcGx1Z2luO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGluZm8gb2JqZWN0IG9mIGZpbGUgYW5kIGFkZCBpdCB0byBcIl9pbmZvTGlzdFwiICh0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV0uX2luZm9MaXN0W10pXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwbHVnaW5OYW1lIFBsdWdpbiBuYW1lIFxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdXBsb2FkRXZlbnRIYW5kbGVyIEV2ZW50IGhhbmRsZXIgdG8gcHJvY2VzcyB1cGRhdGVkIGZpbGUgaW5mbyAoY3JlYXRlZCBpbiBzZXRJbmZvKVxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBmaWxlIFxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlc2l6aW5nIFRydWUgaWYgdGhlIHBsdWdpbiBpcyB1c2luZyBhIHJlc2l6aW5nIG1vZHVsZVxuICAgICAgICAgKiBAZXhhbXBsZSBcbiAgICAgICAgICogdXBsb2FkQ2FsbEJhY2sgey4uIGZpbGUgPSB7IG5hbWU6IGZpbGVMaXN0W2ldLm5hbWUsIHNpemU6IGZpbGVMaXN0W2ldLnNpemUgfTtcbiAgICAgICAgICogdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAnaW1hZ2UnLCBvSW1nLCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkLCBmaWxlLCB0cnVlKTtcbiAgICAgICAgICovXG4gICAgICAgIHNldEluZm86IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBlbGVtZW50LCB1cGxvYWRFdmVudEhhbmRsZXIsIGZpbGUsIHJlc2l6aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBfcmVzaXplX3BsdWdpbiA9IHJlc2l6aW5nID8gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luIDogJyc7XG4gICAgICAgICAgICBpZiAocmVzaXppbmcpIHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA9IHBsdWdpbk5hbWU7XG4gICAgXG4gICAgICAgICAgICBjb25zdCBwbGd1aW4gPSB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdO1xuICAgICAgICAgICAgY29uc3QgaW5mb0xpc3QgPSBjb250ZXh0Ll9pbmZvTGlzdDtcbiAgICAgICAgICAgIGxldCBkYXRhSW5kZXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpO1xuICAgICAgICAgICAgbGV0IGluZm8gPSBudWxsO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gJyc7XG5cbiAgICAgICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICduYW1lJzogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZS1uYW1lJykgfHwgKHR5cGVvZiBlbGVtZW50LnNyYyA9PT0gJ3N0cmluZycgPyBlbGVtZW50LnNyYy5zcGxpdCgnLycpLnBvcCgpIDogJycpLFxuICAgICAgICAgICAgICAgICAgICAnc2l6ZSc6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWZpbGUtc2l6ZScpIHx8IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8gY3JlYXRlXG4gICAgICAgICAgICBpZiAoIWRhdGFJbmRleCB8fCB0aGlzLl9jb21wb25lbnRzSW5mb0luaXQpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9ICdjcmVhdGUnO1xuICAgICAgICAgICAgICAgIGRhdGFJbmRleCA9IGNvbnRleHQuX2luZm9JbmRleCsrO1xuICAgIFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWluZGV4JywgZGF0YUluZGV4KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1maWxlLW5hbWUnLCBmaWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWZpbGUtc2l6ZScsIGZpbGUuc2l6ZSk7XG4gICAgXG4gICAgICAgICAgICAgICAgaW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBlbGVtZW50LnNyYyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGRhdGFJbmRleCAqIDEsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplXG4gICAgICAgICAgICAgICAgfTtcbiAgICBcbiAgICAgICAgICAgICAgICBpbmZvTGlzdC5wdXNoKGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gdXBkYXRlXG4gICAgICAgICAgICAgICAgc3RhdGUgPSAndXBkYXRlJztcbiAgICAgICAgICAgICAgICBkYXRhSW5kZXggKj0gMTtcbiAgICBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5mb0xpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFJbmRleCA9PT0gaW5mb0xpc3RbaV0uaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhSW5kZXggPSBjb250ZXh0Ll9pbmZvSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHsgaW5kZXg6IGRhdGFJbmRleCB9O1xuICAgICAgICAgICAgICAgICAgICBpbmZvTGlzdC5wdXNoKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBpbmZvLnNyYyA9IGVsZW1lbnQuc3JjO1xuICAgICAgICAgICAgICAgIGluZm8ubmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1maWxlLW5hbWVcIik7XG4gICAgICAgICAgICAgICAgaW5mby5zaXplID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWZpbGUtc2l6ZVwiKSAqIDE7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAvLyBtZXRob2QgYmluZFxuICAgICAgICAgICAgaW5mby5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIGluZm8uZGVsZXRlID0gcGxndWluLmRlc3Ryb3kuYmluZCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGluZm8uc2VsZWN0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbEludG9WaWV3KHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3cuc2V0VGltZW91dChwbGd1aW4uc2VsZWN0LmJpbmQodGhpcywgZWxlbWVudCkpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGVsZW1lbnQpO1xuICAgIFxuICAgICAgICAgICAgaWYgKHJlc2l6aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSgnb3JpZ2luLXNpemUnKSAmJiBlbGVtZW50Lm5hdHVyYWxXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnb3JpZ2luLXNpemUnLCBlbGVtZW50Lm5hdHVyYWxXaWR0aCArICcsJyArIGVsZW1lbnQubmF0dXJhbEhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgdGhpcy51dGlsLmlzTWVkaWFDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3ZlciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsICdGSUdVUkUnKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWC5jYWxsKHRoaXMsIGNvbnRleHQsIGVsZW1lbnQsIGNvdmVyLCBjb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoID0gdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfZ2V0U2l6ZVkuY2FsbCh0aGlzLCBjb250ZXh0LCBlbGVtZW50LCBjb3ZlciwgY29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luJywgdyArICcsJyArIGgpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1zaXplJywgdyArICcsJyArIGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnN0eWxlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2l6ZScpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbicpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICBwbGd1aW4ub25Nb2RpZnlNb2RlLmNhbGwodGhpcywgZWxlbWVudCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHBsZ3Vpbi5hcHBseVNpemUuY2FsbCh0aGlzLCBzaXplWzBdLCBzaXplWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA9IF9yZXNpemVfcGx1Z2luO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVwbG9hZEV2ZW50SGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykgdXBsb2FkRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGRhdGFJbmRleCwgc3RhdGUsIGluZm8sIC0tY29udGV4dC5fdXBsb2FkRmlsZUxlbmd0aCA8IDAgPyAwIDogY29udGV4dC5fdXBsb2FkRmlsZUxlbmd0aCwgdGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgaW5mbyBvYmplY3QgYXQgXCJfaW5mb0xpc3RcIlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGx1Z2luTmFtZSBQbHVnaW4gbmFtZSBcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IGluZGV4IG9mIGluZm8gb2JqZWN0ICh0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV0uX2luZm9MaXN0W10uaW5kZXgpXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdXBsb2FkRXZlbnRIYW5kbGVyIEV2ZW50IGhhbmRsZXIgdG8gcHJvY2VzcyB1cGRhdGVkIGZpbGUgaW5mbyAoY3JlYXRlZCBpbiBzZXRJbmZvKVxuICAgICAgICAgKi9cbiAgICAgICAgZGVsZXRlSW5mbzogZnVuY3Rpb24gKHBsdWdpbk5hbWUsIGluZGV4LCB1cGxvYWRFdmVudEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mb0xpc3QgPSB0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV0uX2luZm9MaXN0O1xuICAgIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpbmZvTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGluZm9MaXN0W2ldLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHVwbG9hZEV2ZW50SGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykgdXBsb2FkRXZlbnRIYW5kbGVyKG51bGwsIGluZGV4LCAnZGVsZXRlJywgbnVsbCwgMCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXNldCBpbmZvIG9iamVjdCBhbmQgXCJfaW5mb0xpc3QgPSBbXVwiLCBcIl9pbmZvSW5kZXggPSAwXCJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBsdWdpbk5hbWUgUGx1Z2luIG5hbWUgXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gdXBsb2FkRXZlbnRIYW5kbGVyIEV2ZW50IGhhbmRsZXIgdG8gcHJvY2VzcyB1cGRhdGVkIGZpbGUgaW5mbyAoY3JlYXRlZCBpbiBzZXRJbmZvKVxuICAgICAgICAgKi9cbiAgICAgICAgcmVzZXRJbmZvOiBmdW5jdGlvbiAocGx1Z2luTmFtZSwgdXBsb2FkRXZlbnRIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0W3BsdWdpbk5hbWVdO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVwbG9hZEV2ZW50SGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm9MaXN0ID0gY29udGV4dC5faW5mb0xpc3Q7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGluZm9MaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZEV2ZW50SGFuZGxlcihudWxsLCBpbmZvTGlzdFtpXS5pbmRleCwgJ2RlbGV0ZScsIG51bGwsIDAsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGV4dC5faW5mb0xpc3QgPSBbXTtcbiAgICAgICAgICAgIGNvbnRleHQuX2luZm9JbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBub0dsb2JhbCA9PT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIXdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUykge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1NVTkVESVRPUl9NT0RVTEVTJywge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuU1VORURJVE9SX01PRFVMRVMsICdmaWxlTWFuYWdlcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGZpbGVNYW5hZ2VyXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWxlTWFuYWdlcjtcbn0pKTsiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
index 4fa1a21..626b15f 100644 (file)
-<div class="modal" id="dlg_staffreportperioddays">
+<div class="modal" id="dlg_staffreportperioddays" >
   <div class="modal-content animate-top card-4">
-    <header>
+    <header style="margin-bottom: 0;">
       <span class="button toolbarbtn display-topright" onclick="document.getElementById('dlg_staffreportperioddays').style.display='none'; return false;"><span class="icon icon-remove" style="font-size: 18px;"></span></span>
       <h2 id="dlg_staffreportperioddays_title">
-        [% lbl.editday %]:&nbsp;<span id="display_date" class="xlarge">dd, DD.MM.YYYY<span>
+        <span id="display_date" class="xlarge">dd, DD.MM.YYYY<span>&nbsp;-&nbsp;<span id="display_staffname"></span>
       </h2>
     </header>
-    <div class="container">
+    <div class="display-container">
       <div id="staffreportperioddays_errmsg"></div>
       <form id="frm_staffreportperioddays" name="frm_staffreportperioddays">
         <input class="data_staffreportperioddays" id="id" name="ident_staffreportperioddays_id" type="hidden" value="">
-        <div class="container padding">
+        <div class="display-container">
           <div class="row">
-            <div class="container half">
-              <fieldset>
-                <legend style="font-weight: bold;">[% lbl.workhours %]</legend>
-                <div class="container">
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="timestart1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timestart1" name="staffreportperioddays_timestart1" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('timestart1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_timestart1">[% lbl.start %] 1</label>
-                  </div>
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="timeend1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timeend1" name="staffreportperioddays_timeend1" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('timeend1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_timeend1">[% lbl.end %] 1</label>
-                  </div>
-                  <div class="container cell">
+            <div class="display-container twothird">
+              <table class="table border" border="1">
+              <tbody>
+                <tr><th class="moduletoolbar SubHeadTitle" colspan="4">[% lbl.workhours %]</th></tr>
+                <tr class="inforow"><td class="labelcol">[% lbl.freetimebefore %]</td>
+                  <td style="font-size: 8pt!important;">
+                  &nbsp;
+                  </td>
+                  <td style="text-align: right!important;">
+                    <input class="white text-black readonly" id="infofreetimebefore" name="infofreetimebefore" style="width: 56px;font-weight: bold; display: inline; border: 0px;" type="text" value="">
+                    </td>
+                  <td  class="resultcol">&nbsp;</td>
+                </tr>
+                <tr><th class="labelcol">Zeitraum 1</th>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="white text-black readonly" id="total1" name="total1" style="width: 60px;" type="text" value=""> <label class="label" for="total1">[% lbl.total %] 1</label>
-                    </div>
-                  </div>
-                </div>
-                <div class="container">
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="timestart2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timestart2" name="staffreportperioddays_timestart2" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('timestart2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_timestart2">[% lbl.start %] 2</label>
-                  </div>
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="timeend2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timeend2" name="staffreportperioddays_timeend2" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('timeend2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_timeend2">[% lbl.end %] 2</label>
+                    <input class="timefield data_staffreportperioddays" data-column="timestart1" data-id="" style="display: inline;float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timestart1" name="staffreportperioddays_timestart1" onblur=
+                    "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                    <a class="inlinebtn" href="javascript:dataform.cleanfield('timestart1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                   </div>
-                  <div class="container cell">
+                  </td>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="white text-black readonly" id="total2" name="total2" style="width: 60px;" type="text" value=""> <label class="label" for="total2"[% lbl.total %] 2</label>
+                      <input class="timefield data_staffreportperioddays" data-column="timeend1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timeend1" name="staffreportperioddays_timeend1" onblur=
+                      "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('timeend1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                </div>
-              </fieldset>
-              <fieldset>
-                <legend>[% lbl.pauses %]</legend>
-                <div class="container">
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="pausestart1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pausestart1" name="staffreportperioddays_pausestart1" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_pausestart1">[% lbl.start %] 1</label>
-                  </div>
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="pauseend1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pauseend1" name="staffreportperioddays_pauseend1" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_timeend1">[% lbl.end %] 1</label>
-                  </div>
-                  <div class="container cell">
+                  </td>
+                  <td class="resultcol">
+                    <input class="readonly" id="total1" name="total1" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr class="inforow"><td  class="labelcol">[% lbl.cutoff %]</td>
+                    <td style="font-size: 8pt;">
+                      ([% lbl.maxcutoff %] <input class="readonlybasic" style="font-size: 8pt;width: 35px;display: inline;" id="infomaxinterruptionhours" name="infomaxinterruptionhours" type="text" value="">)
+                    </td>
+                    <td  style="text-align: right!important;">
+                    <input class="data_staffreportperioddays white text-black readonly" id="interruptionhours" name="staffreportperioddays_interruptionhours" style="width: 60px;display: inline;" type="text" value=""> </td>
+                    <td class="resultcol">&nbsp;</td>
+                </tr>
+                <tr><th class="labelcol">Zeitraum 2</th>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="white text-black readonly" id="pausetotal1" name="pausetotal1" style="width: 60px;" type="text" value=""> <label class="label" for="pausetotal1">[% lbl.totalpause %] 1</label>
+                    <input class="timefield data_staffreportperioddays" data-column="timestart2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timestart2" name="staffreportperioddays_timestart2" onblur="timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                    <a class="inlinebtn" href="javascript:dataform.cleanfield('timestart2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                </div>
-                <div class="container">
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="pausestart2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pausestart2" name="staffreportperioddays_pausestart2" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_pausestart2">[% lbl.start %] 2</label>
-                  </div>
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input class="timefield data_staffreportperioddays" data-column="pauseend2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pauseend2" name="staffreportperioddays_pauseend2" onblur=
-                        "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
-                        "font-size: 10px;"></span></a>
-                      </div>
-                      <label class="label" for="staffreportperioddays_pauseend2">[% lbl.end %] 2</label>
-                  </div>
-                  <div class="container cell">
+                  </td>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="white text-black readonly" id="pausetotal2" name="pausetotal2" style="width: 60px;" type="text" value=""> <label class="label" for="pausetotal2">[% lbl.totalpause %] 2</label>
+                      <input class="timefield data_staffreportperioddays" data-column="timeend2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="timeend2" name="staffreportperioddays_timeend2" onblur="timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('timeend2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                </div>
-                <div class="container cell">
-                  <div class="cell">
-                    <div class="cell" style="width: 40px;">
-                      <input class="check  data_staffreportperioddays " id="payedpause" name="staffreportperioddays_payedpause" data-column="payedpause"  data-table="staffreportperioddays" data-id="" value="" type="checkbox" onchange="staffperiodweeks.checkworktime();return false;" >
+                  </td>
+                  <td class="resultcol">
+                    <input class="readonly" id="total2" name="total2" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr class="inforow">
+                  <td class="labelcol">[% lbl.freetimeafter %]</td>
+                  <td style="font-size: 8pt!important;">
+                  ([% lbl.mindailyfreehours %] <input class="readonlybasic" style="font-size: 8pt;width: 35px;display: inline;" id="infomindailyrecuperation" name="infomindailyrecuperation"  type="text" value="">) 
+                  </td>
+                  <td style="text-align: right!important;">
+                    <input class="white text-black readonly" id="infofreetimeafter" name="infofreetimeafter" style="width: 60px;font-weight: bold; display: inline;" type="text" value="">
+                  </td>
+                  <td class="resultcol">&nbsp;</td>
+                </tr>
+                <tr>
+                  <th colspan="4" class="moduletoolbar">[% lbl.pauses %]</th>
+                </tr>
+                <tr>
+                  <th  class="labelcol">Zeitraum 1</th>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_staffreportperioddays" data-column="pausestart1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pausestart1" name="staffreportperioddays_pausestart1" onblur=
+                      "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                    <div class="cell">
-                      [% lbl.payedpauses %]
+                  </td>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_staffreportperioddays" data-column="pauseend1" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pauseend1" name="staffreportperioddays_pauseend1" onblur=
+                      "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend1');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                </div>
-              </fieldset>
-              <fieldset>
-              <legend>[% lbl.infoouttimes %]</legend>
-              <div class="cell" style="width: 150px;">
-                  <input class="white text-black readonly" id="infofreetimebefore" name="infofreetimebefore" style="width: 60px;font-weight: bold;" type="text" value=""> <label class="label" for="infofreetimebefore">[% lbl.freetimebefore %]</label>
-                </div>
-              <div class="cell" style="width: 150px;">
-                  <input class="white text-black readonly" id="infofreetimeafter" name="infofreetimeafter" style="width: 60px;font-weight: bold;" type="text" value=""> <label class="label" for=
-                  "infofreetimeafter">[% lbl.freetimeafter %]</label>
-                </div>
-                
-              </fieldset>
-            </div>
-            <div class="container half card_vacancy">
-              <fieldset>
-                <legend style="font-weight: bold;">[% lbl.vacancy %]</legend>
-                <div class="container cell">
+                  </td>
+                  <td class="resultcol">
+                    <input class="text-black readonly" id="pausetotal1" name="pausetotal1" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr>
+                  <th class="labelcol">Zeitraum 2</th>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="timefield data_staffreportperioddays vacdaytotal" data-column="vacancyhours" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="vacancyhours" name="staffreportperioddays_vacancyhours" onblur=
-                      "staffperiodweeks.checkdaytime();return false;" type="text" value="">
-                      <a class="inlinebtn" href="javascript:dataform.cleanfield('vacancyhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style=
+                      <input class="timefield data_staffreportperioddays" data-column="pausestart2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pausestart2" name="staffreportperioddays_pausestart2" onblur=
+                      "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
                       "font-size: 10px;"></span></a>
                     </div>
-                    <label class="label" for="staffreportperioddays_vacancyhours">[% lbl.hours %]</label>
-                </div>
-                <div class="container cell">
-                <div class="cell" style="width: 250px">
-
-                  <select class="select data_staffreportperioddays" data-column="id_vacancytype" data-id="" placeholder="00:00"  data-table="staffreportperioddays" id="id_vacancytype" name="staffreportperioddays_id_vacancytype" value="">
-                  </select> <label class="label dayvacancy" for="staffreportperioddays_id_vacancytype">[% lbl.vacancytype %]</label>
-                </div>
-                </div>
-                
-              </fieldset>
-              <fieldset>
-                <legend style="font-weight: bold;">[% lbl.recuperation %]</legend>
-                
-                <div class="container cell">
+                  </td>
+                  <td>
                     <div class="cell" style="width: 86px;">
-                      <input class="timefield data_staffreportperioddays repdaytotal" data-column="recuperationhours" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="recuperationhours" name="staffreportperioddays_recuperationhours"
-                      onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
-                      <a class="inlinebtn" href="javascript:dataform.cleanfield('recuperationhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style=
+                      <input class="timefield data_staffreportperioddays" data-column="pauseend2" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="pauseend2" name="staffreportperioddays_pauseend2" onblur=
+                      "timecalc.validateTime(this);staffperiodweeks.checkworktime();return false;" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend2');staffperiodweeks.checkworktime();" ><span class="icon icon-remove" style=
                       "font-size: 10px;"></span></a>
                     </div>
-                    <label class="label" for="staffreportperioddays_recuperationhours">[% lbl.hours %]</label>
-                </div>
-                <div class="container cell">
-                <div class="cell" style="width: 250px">
-                  <select class="select data_staffreportperioddays" data-column="id_recuperationtype" data-id="" style="float: left;" placeholder="00:00"  data-table="staffreportperioddays" id="id_recuperationtype" name="staffreportperioddays_id_recuperationtype" value="">
-                  </select> <label class="label dayrepos" for="staffreportperioddays_id_recuperationtype">[% lbl.recuperationtype %]</label>
-                </div>
-                </div>
-              </fieldset>
-              <fieldset>
-              <legend>[% lbl.infohours %]</legend>
-              <div class="cell" style="width: 86px;">
-                  <input class="white text-black readonly" id="infomaxdayhours" name="infomaxdayhours" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "infomaxdayhours">[% lbl.maxtotal %]</label>
-                </div>
-              <div class="cell" style="width: 86px;">
-                  <input class="white text-black readonly" id="infomaxinterruptionhours" name="infomaxinterruptionhours" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "infomaxinterruptionhours">[% lbl.maxcutoff %]</label>
-                </div>
-                <div class="cell" style="width: 120px;">
-                  <input class="white text-black readonly" id="infomindailyrecuperation" name="infomindailyrecuperation" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "infomindailyrecuperation">[% lbl.mindailyfreehours %]</label>
-                </div>
-                <div class="cell" style="width: 100px;">
-                  <input class="white text-black readonly" id="infomaxweekhours" name="infomaxweekhours" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "infomaxweekhours">[% lbl.maxweekhours %]</label>
-                </div>
-              </fieldset>
-              <fieldset>
-                <legend style="font-weight: bold;">[% lbl.daytotal %]</legend>
-                <div class="cell" style="width: 86px;">
-                  <input class="data_staffreportperioddays white text-black readonly" id="workhours" name="staffreportperioddays_workhours" style="width: 60px;font-weight: bold;" type="text" value=""> <label class="label" for=
-                  "staffreportperioddays_workhours" style="font-weight: bold;"[% lbl.total %] travail</label>
-                </div>
-                <div class="cell" style="width: 86px;">
-                  <input class="data_staffreportperioddays white text-black readonly" id="timepause" name="staffreportperioddays_timepause" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "staffreportperioddays_timepause">[% lbl.totalpause %]</label>
-                </div>
-                
-                <div class="cell" style="width: 86px;">
-                  <input class="data_staffreportperioddays white text-black readonly wdaytotal" id="dayhours" name="staffreportperioddays_dayhours" style="width: 60px;font-weight: bold;" type="text" value=""> <label class="label" for="staffreportperioddays_dayhours" style="font-weight: bold;">[% lbl.totalday %]</label>
-                </div>
-                <div class="cell" style="width: 86px;">
-                  <input class="data_staffreportperioddays white text-black readonly" id="interruptionhours" name="staffreportperioddays_interruptionhours" style="width: 60px;" type="text" value=""> <label class="label" for=
-                  "staffreportperioddays_interruptionhours">[% lbl.cutoff %]</label>
-                </div>
-              </fieldset>
-              
+                  </td>
+                  <td class="resultcol"><input class="readonly" id="pausetotal2" name="pausetotal2" style="text-align: right;border: 0px; background-color: #fff!important;" type="text" value=""></td>
+                </tr>
+                <tr class="resultrow">
+                  <th class="labelcol">[% lbl.totalpause %]</th>
+                  <td colspan="2">
+                    <div class="cell">
+                      <div class="cell" style="width: 40px;">
+                        <input class="check  data_staffreportperioddays " id="payedpause" name="staffreportperioddays_payedpause" style="margin-top: -7px;" data-column="payedpause"  data-table="staffreportperioddays" data-id="" value="" type="checkbox" onchange="staffperiodweeks.checkworktime();return false;" >
+                      </div>
+                      <div class="cell">[% lbl.payedpauses %]</div>
+                    </div>
+                  </td>
+                  <td class="resultcol">
+                      <input class="data_staffreportperioddays readonly" id="timepause" name="staffreportperioddays_timepause" style="text-align: right;font-weight: normal;background-color: #484848!important;border: 0px;color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr class="resultrow"><th>[% lbl.totalwork %]</th>
+                  <td colspan="2">
+                    
+                  </td>
+                  <td class="resultcol">
+                    <input class="data_staffreportperioddays readonly" id="workhours" name="staffreportperioddays_workhours" style="text-align: right;font-weight: normal;background-color: #484848!important;border: 0px;color: #fff!important;" type="text" value=""> 
+                  </td>
+                </tr>
+                <tr ><th class="moduletoolbar SubHeadTitle" colspan="4">[% lbl.vacancy %] / [% lbl.recuperation %] / [% lbl.exception %]</th></tr>
+                <tr>
+                <th class="labelcol">[% lbl.vacancy %]</th>
+                  <td colspan="2">
+                    <input type="text" class="data_staffreportperioddays" data-column="vacancycomment" placeholder="[% lbl.comment %]" data-id="" data-table="staffreportperioddays" id="vacancycomment" name="staffreportperioddays_vacancycomment" />
+                  </td>
+                  <td class="resultcol">
+                      <input class="timefield data_staffreportperioddays" data-column="vacancyhours" data-id="" style="padding-right: 18px; display: inline; width: 86px;" placeholder="00:00"  data-table="staffreportperioddays" id="vacancyhours" name="staffreportperioddays_vacancyhours" onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
+                      <a class="inlinebtn"  style="margin-top: 1px;margin-left: -26px;" href="javascript:dataform.cleanfield('vacancyhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+                  </td>
+                </tr>
+                <tr>
+                  <th class="labelcol">[% lbl.vacancyill %]</th>
+                  <td colspan="2">
+                    <input type="text" class="data_staffreportperioddays" data-column="vacillcomment" placeholder="[% lbl.comment %]" data-id="" data-table="staffreportperioddays" id="vacillcomment" name="staffreportperioddays_vacillcomment" />
+                  </td>
+                  <td class="resultcol">
+                      <input class="timefield data_staffreportperioddays" data-column="vacillhours" data-id="" style="padding-right: 18px; display: inline; width: 86px;" placeholder="00:00"  data-table="staffreportperioddays" id="vacillhours" name="staffreportperioddays_vacillhours" onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
+                      <a class="inlinebtn"  style="margin-top: 1px;margin-left: -26px;" href="javascript:dataform.cleanfield('vacillhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+                  </td>
+                </tr>
+                <tr>
+                  <th class="labelcol">[% lbl.vacancyextra %]</th>
+                  <td colspan="2">
+                    <input type="text" class="data_staffreportperioddays" data-column="vacextracomment" placeholder="[% lbl.comment %]" data-id="" data-table="staffreportperioddays" id="vacextracomment" name="staffreportperioddays_vacextracomment" list="data_vacancyextra"/>
+                  </td>
+                  <td class="resultcol">
+                      <input class="timefield data_staffreportperioddays" data-column="vacextrahours" data-id="" style="padding-right: 18px; display: inline; width: 86px;" placeholder="00:00"  data-table="staffreportperioddays" id="vacextrahours" name="staffreportperioddays_vacextrahours" onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
+                      <a class="inlinebtn" style="margin-top: 1px;margin-left: -26px;" href="javascript:dataform.cleanfield('vacextrahours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+                  </td>
+                  </tr>
+                <tr style="border-top: 1px solid black;">
+                  <th class="labelcol">[% lbl.recuperation %]</th>
+                  <td colspan="2">
+                    <input type="text" class="data_staffreportperioddays" data-column="recupcomment" placeholder="[% lbl.comment %]" data-id="" data-table="staffreportperioddays" id="recupcomment" name="staffreportperioddays_recupcomment" list="data_recuperation" />
+                  </td>
+                  <td class="resultcol">
+                      <input class="timefield data_staffreportperioddays" data-column="recuperationhours" data-id="" style="padding-right: 18px; display: inline; width: 86px;" placeholder="00:00"  data-table="staffreportperioddays" id="recuperationhours" name="staffreportperioddays_recuperationhours" onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
+                      <a class="inlinebtn" style="margin-top: 1px;margin-left: -26px;" href="javascript:dataform.cleanfield('recuperationhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+                  </td>
+                </tr>
+                <tr style="border-top: 1px solid black;">
+                  <th class="labelcol">[% lbl.partunempl %]</th>
+                  <td colspan="2">
+                    <input type="text" class="data_staffreportperioddays" data-column="partunempcomment" placeholder="[% lbl.comment %]" data-id="" data-table="staffreportperioddays" id="partunempcomment" name="staffreportperioddays_partunempcomment" />
+                  </td>
+                  <th class="resultcol">
+                      <input class="timefield data_staffreportperioddays" data-column="partunemplhours" data-id="" style="padding-right: 18px; display: inline; width: 86px;" placeholder="00:00"  data-table="staffreportperioddays" id="partunemplhours" name="staffreportperioddays_partunemplhours" onblur="staffperiodweeks.checkdaytime();return false;" type="text" value="">
+                      <a class="inlinebtn" style="margin-top: 1px;margin-left: -26px;" href="javascript:dataform.cleanfield('partunemplhours');staffperiodweeks.checkdaytime();" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+                  </th>
+                </tr>
+                <tr class="resultrow" style="border-top: 2px solid black;">
+                  <th class="labelcol">[% lbl.totalday %]</th>
+                  <td  colspan="2">([% lbl.maxtotal %]<input class="readonlybasic" style="font-size: 8pt;width: 37px;display: inline;background-color: #484848!important;color: white!important; " id="infomaxdayhours" name="infomaxdayhours"  type="text" value=""> ) ([% lbl.maxweekhours %] <input class="readonlybasic" style="font-size: 8pt;width: 37px;display: inline;background-color: #484848!important;color: white!important;" id="infomaxweekhours" name="infomaxweekhours" type="text" value="">) </td>
+                  <td class="resultcol">
+                    <input class="data_staffreportperioddays readonly wdaytotal" id="dayhours" name="staffreportperioddays_dayhours" style="text-align: right;font-weight: bold;background-color: #484848!important;border: 0px;color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+              </tbody>
+              </table>
+            </div>
+            <div class="display-container third">
+      
+              <div class="bar moduletoolbar">
+                <div class="bar-item SubHeadTitle">[% lbl.edittimetracks %]</div>
+                <button class="bar-item toolbarbtn  right" onclick="staffperiodweeks.ttadd(); return false;"><span class="icon icon-plus"><br/>[% lbl.add %]</button>
+                <button class="bar-item toolbarbtn right" onclick="staffperiodweeks.ttremove(); return false;"><span class="icon icon-trash text-red"></span>[% lbl.delete %]</button>
+              </div>
+              <div class="container" style="padding: 0; height: 400px;">
+                <div id="tbl_daytimetracker"></div>
+              </div>
+       
             </div>
           </div>
         </div>
       </form>
     </div>
-    <footer>
+    <footer style="margin-top: 0px;">
       <button class="button theme-light margin-right border" onclick="document.getElementById('dlg_staffreportperioddays').style.display='none'; return false;"><span class="icon icon-remove"></span>[% lbl.cancel %]</button> <button class=
       "button actionbtn margin-right border" id="btn_saveday" onclick="staffperiodweeks.save();return false;"><span class="icon icon-Save"></span>[% lbl.save %]</button>
     </footer>
   </div>
 </div><!-- DLG END staffreportperioddays -->
+<datalist id="data_recuperation">
+
+</datalist>
+<datalist id="data_vacancyextra">
+  
+</datalist>
\ No newline at end of file
index 97cc52d..de33cff 100644 (file)
@@ -2,7 +2,6 @@
   <div class="modal-content animate-top card-4">
     <header style="margin-bottom: 0;">
     <div class="bar moduletoolbar">
-      
       <div class="bar-item SubHeadTitle">
         [% lbl.edittimetracks %] / <span id="dlg_stafftimetracker_staffname"></span> - <span id="dlg_stafftimetracker_date"></span>
       </div>
           <button class="bar-item toolbarbtn right" onclick="staffperiodweeks.ttremove();"><span class="icon icon-trash text-red"></span>[% lbl.delete %]</button>
       </div>
     </header>
-    <div class="container" style=" padding: 0; height: 400px;">
+    <div class="container" style="padding: 0; height: 400px;">
       <div id="tbl_daytimetracker"></div>
     </div>
     <footer style="margin-top: 0px;">
-      <button class="button theme-light margin-right border" onclick="document.getElementById('dlg_stafftimetracker').style.display='none'; return false;"><span class="icon icon-remove"></span>[% lbl.cancel %]</button> <button class=
-      "button actionbtn margin-right border" id="btn_savetimetracker" onclick="staffperiodweeks.savetimetracker();return false;"><span class="icon icon-Save"></span>[% lbl.save %]</button>
+      <button class="button theme-light margin-right border" onclick="document.getElementById('dlg_stafftimetracker').style.display='none'; return false;"><span class="icon icon-remove"></span>[% lbl.cancel %]</button>
+      <button class="button actionbtn margin-right border" id="btn_savetimetracker" onclick="staffperiodweeks.savetimetracker();return false;"><span class="icon icon-Save"></span>[% lbl.save %]</button>
     </footer>
   </div>
 </div>
index 5939388..de72bf0 100644 (file)
@@ -43,6 +43,7 @@
 <link rel="stylesheet" href="[% abspath %][% staticpath %]vendors/slimselect/slimselect[% minify %].css?v=[% appversion %]">
 <link rel="stylesheet" href="[% abspath %][% staticpath %]vendors/flatpickr/flatpickr[% minify %].css?v=[% appversion %]">
 <link rel="stylesheet" href="[% abspath %][% staticpath %]vendors/flatpickr/themes/airbnb[% minify %].css?v=[% appversion %]">
+<link rel="stylesheet" href="[% abspath %][% staticpath %]vendors/suneditor/css/suneditor.min.css?v=[% appversion %]">
 </head>
 <body>
 <div class="main">
 [% INCLUDE block/dlginfo.tt %] 
   <script>
     let schemata = "[% session.sessiondata.schemata %]"; 
+    let lbl = { "datasaved":"[% lbl.datasaved %]"};
   </script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/tabulator/js/tabulator[% minify %].js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/moment/moment-with-locales[% minify %].js?v=[% appversion %]"></script>
+  <script>
+    moment.locale('[% session.lang %]');
+  </script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/slimselect/slimselect.min.js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/flatpickr/flatpickr[% minify %].js?v=[% appversion %]"></script>
-  <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/flatpickr/l10n/fr[% minify %].js?v=[% appversion %]"></script>
+  <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/flatpickr/l10n/[% session.lang %][% minify %].js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/flatpickr/plugins/weekSelect/weekSelect.js?v=[% appversion %]"></script>
+  <script type="text/javascript" src="[% abspath %][% staticpath %]vendors/suneditor/suneditor.min.js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]js/request[% minify %].js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]js/app[% minify %].js?v=[% appversion %]"></script>
   <script type="text/javascript" src="[% abspath %][% staticpath %]js/timecalc[% minify %].js?v=[% appversion %]"></script>
index 1153662..90ee1c5 100644 (file)
@@ -22,7 +22,7 @@
   "finalstatement" => "SchlussAbrechnung",\r
   "finalstatementpot" => "POT Schluss<br/>Abrechnung",\r
   "statement" => "Abrechnung",\r
-  "companyunit" => "Unternhemen / Standort",\r
+  "companyunit" => "Unternehmen / Standort",\r
   "logout" => "Logout",\r
   "modules" => "Module",\r
   "staffcount" => "Arbeitnehmer Anz.",\r
@@ -38,7 +38,7 @@
   "vacancytype" => "Urlaubs-Bezeichnung",\r
   "vacancy" => "Urlaub",\r
   "recuperationtype" => "Art des Stunden-Ausgleichs",\r
-  "recuperation" => "Stunden-Ausgleich",\r
+  "recuperation" => "Stundenausgl.",\r
   "hours" => "Stunden",\r
   "infohours" => "Stunden-info",\r
   "acceptterms" => "Ich habe die AGB gelesen und bin einverstanden",\r
@@ -52,7 +52,7 @@
   "enddate" => "End-Datum",\r
   "end" => "Ende",\r
   "total" => "Total",\r
-  "totalday" => "Total tag",\r
+  "totalday" => "Total Tag",\r
   "pausehours" => "Pausen-Zeiten",\r
   "totalpause" => "Total Pause",\r
   "cancel" => "Abbrechen",\r
   "phone" => "Telefon",\r
   "email" => "E-Mail",\r
   "contractdata" => "Vertrags-Daten",\r
-  "renewperiods" => "Perioden  aktualisieren",\r
+  "renewperiods" => "Perioden aktualisieren",\r
   "weekhours" => "Stunden / Woche",\r
   "weekhours_short" => "h/Woche",\r
   "minmaxvalues" => "Min/max Werte",\r
   "maxdayhours" => "max h/Tag",\r
-  "maxweekhours" => "max h/Woche",\r
-  "maxcutoff" => "max Unterbrechung",\r
-  "maxtotal" => "max Total",\r
-  "mindailyfreehours" => "min Stunden Ruhezeit",\r
+  "maxweekhours" => "maxWoche",\r
+  "maxcutoff" => "max.",\r
+  "maxtotal" => "max.",\r
+  "mindailyfreehours" => "min.",\r
   "mindailyouttime" => "min Stunden Ruhezeit",\r
   "mindailyouttime2" => "min Stunden<br/>Ruhezeit",\r
+  "resttime" => "tägl. Ruhezeit",\r
   "daytotal" => "Total Tag",\r
   "weekdays" => "Tage / Woche",\r
   "weekdays_short" => "t/Woche",\r
   "addstaffmember" => "neuer Arbeitnehmer",\r
-  "timetracks" => "Zeitstempel",\r
+  "timetracks" => "Stechzeiten",\r
   "clean" => "leeren",\r
   "cutoff" => "Unterbrechung",\r
-  "loginlink" => "EInlogggen",\r
+  "loginlink" => "Einlogggen",\r
   "username" => "Login",\r
   "password" => "Passwort",\r
   "clientaccess" => "Kunden-Login",\r
   "dataset" => "Datensatz",\r
   "usernamechange" => "Login ändern",\r
   "newusername" => "neuer Login",\r
-  "edittimetracks" => "Stechuhr bearbeiten",\r
+  "edittimetracks" => "Stechuhr",\r
   "infoouttimes" => "Info Ruhezeiten davor/danach",\r
   "freetimebefore" => "Ruhezeit davor",\r
   "freetimeafter" => "Ruhezeit danach",\r
   "msgdeldefworkplan" => "Der Standard Wochenplan kann nicht gelöscht werden!",\r
   "msgdelusedworkplan" => "Solange ein Plan für einen Mitarbeiter eingetragen ist, kann er nicht gelöscht werden!",\r
   "msgaddperiod" => "Sie können keine Periode mehr vor folgendem Datum hinzufügen: ",\r
-  "days" => "Tage"\r
+  "days" => "Tage",\r
+  "staffnumber" => "Nr.",\r
+  "ttpincode" => "Pin-Code",\r
+  "timetracker" => "Stechuhr",\r
+  "timetrackers" => "Stechuhren",\r
+  "cleanfp" => "Fingerabdrücke löschen",\r
+  "staffpwd" => "Kalender-Passwort",\r
+  "vacancyhours" => "Stunden/Jahr (h)",\r
+  "vacancyyears" => "Urlaubsanspruch",\r
+  "year" => "Jahr",\r
+  "fixtime" => "Minuten (+/-)",\r
+  "staffvacancy" => "Urlaub",\r
+  "vacancyill" => "Krankschreibung",\r
+  "vacancyextra" => "Sonderurlaub",\r
+  "vacancyextra2" => "Sonder-<br/>urlaub",\r
+  "partunempl" => "Kurzarbeit",\r
+  "ttentry" => "Kommen",\r
+  "ttexit" => "Gehen",\r
+  "tttotal" => "Total",\r
+  "msgworkhoursinside" => "die Pausen müssen innerhalb der Arbeitszeit liegen!",\r
+  "freeday" => "Ruhetag",\r
+  "date" => "Datum",\r
+  "vacdescription" => "Beschreibung",\r
+  "note" => "Notiz"\r
+  "exception" => "Ausnahmen",\r
+  "restriction" => "Restriktion",\r
+  "none" => "keine",\r
+  "onlyworkdays" => "nur wenn Arbeitszeit konfiguriert ist",\r
+  "flexworktime" => "flexibel konfigurierte Arbeitszeit",\r
+  "strictworktime" => "strikt konfigurierte Arbeitszeit",\r
+  "totalwork" => "Total Arbeit",\r
+  "filter" => "filtern..."\r
+  "statementtransfered3" => "trans.",\r
+  "supphourspayed2" => "bez.",\r
+  "finalstatementpot2" => "Abrechnung", \r
+  "supp44h3" => "+44h",\r
+  "suppsunwork2" => "+Sonn.",\r
+  "avgweek_short2" => "Durchschnitt", \r
+  "validated2" => "val.",\r
+  "vacancyextra3" => "Sonderurl.",\r
+  "comment" => "Bemerkung...",\r
+  "datasaved" => "Die Daten wurden gespeichert!"\r
  } %]
\ No newline at end of file
index 72c1b4d..8aff418 100644 (file)
@@ -93,6 +93,7 @@
   "mindailyfreehours" => "min heures libre quotidienne",
   "mindailyouttime" => "min repos quotidien",
   "mindailyouttime2" => "min h. libres<br/>quotidienne",
+  "resttime" => "repos quot."
   "daytotal" => "Totaux Jour",
   "weekdays" => "jours / semaine",
   "weekdays_short" => "j/semaine",
   "contractrequired" => "Tous les champs sauf sans requis (sauf \"date fin\")!",
   "contract" => "Contrat",
   "work" => "Travail",
-  "recuperation_short" => "Récup",
-  "vacancyill2" => "Congé<br/>maladie",
+  "recuperation_short" => "récup.",
+  "vacancyill2" => "maladie",
   "statementtransfered2" => "décompte<br/>reporté",
   "supphourspayed2" => "h. suppl.<br/>payés",
   "supp44h2" => "suppl.<br/>+44 h",
   "usergroup" => "Droits d'accès",
   "language" => "Langue",
   "msgdeldefworkplan" => "Le plan Standard ne peut pas être supprimé!",
-  "msgdelusedworkplan" => "Le plan ne peut pas être supprimé dès qu'il est utilisé par un salarié",
+  "msgdelusedworkplan" => "Le plan ne peut pas être supprimé dès qu`il est utilisé par un salarié",
   "msgaddperiod" => "vous ne pouvez plus ajouter des périodes avant le: ",
-   "days" => "jours"
+  "days" => "jours",
+  "staffnumber" => "No.",
+  "ttpincode" => "Code Pin",
+  "timetracker" => "Pointeuse",
+  "timetrackers" => "Pointeuses",
+  "cleanfp" => "supprimer empr. digitales",
+  "staffpwd" => "Mot de Passe Calendrier",
+  "vacancyhours" => "heures/année",
+  "vacancyyears" => "Congé annuelle",
+  "year" => "année",
+  "fixtime" => "Minuten (+/-)",
+  "staffvacancy" => "Congé",
+  "vacancyill" => "maladie",
+  "vacancyextra" => "extraordinaire",
+  "vacancyextra2" => "c. except.",
+  "partunempl" => "Chômage partielle",
+  "ttentry" => "Entrée",
+  "ttexit" => "Sortie",
+  "tttotal" => "Total",
+  "msgworkhoursinside" => "les pauses doivent être dans l`heure de travail",
+  "freeday" => "jour de repos",
+  "date" => "Date",
+  "vacdescription" => "Description",
+  "note" => "Note",
+  "exception" => "Exceptions",
+  "restriction" => "Restriction",
+  "none" => "aucune",
+  "onlyworkdays" => "seulement si heures configurées",
+  "flexworktime" => "heures de travail flexible",
+  "strictworktime" => "heures de travail stricte",
+  "totalwork" => "Total Arbeit",
+  "filter" => "filtrer...",
+   "statementtransfered3" => "trans.",
+  "supphourspayed2" => "payé",
+  "finalstatementpot2" => "Décompte", 
+  "supp44h3" => "+44h",
+  "suppsunwork2" => "+dim.",
+  "avgweek_short2" => "moyenne", 
+  "validated2" => "val.",
+  "vacancyextra3" => "c. except.",
+  "comment" => "note...",
+  "datasaved" => "Les données ont été sauvegardées!"
  } %]
\ No newline at end of file
index 7cebe79..678fffd 100644 (file)
@@ -24,7 +24,7 @@ let companies ={
     flatpickr("#reportperiodstart",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
       onClose: function(selectedDates, dateStr, instance) {
         dataform.saveschemafield(document.getElementById('reportperiodstart'),'public');
       },
index 1e85371..6fb93b0 100644 (file)
@@ -14,7 +14,7 @@ let sector ={
   inittable: function(){
     sector.initform();
     sector.tbl = new Tabulator("#tbl_sectors", {
-      headerFilterPlaceholder: "filter...",
+      headerFilterPlaceholder: "[% lbl.filter %]",
       height: "calc(100vh - 111px)",
       layout: "fitDataFill",
       selectable: 1,
index db574aa..7dcffa5 100644 (file)
@@ -51,7 +51,6 @@ let users ={
   });
   },
   gettbldata: function(){
-
       let sel= companies.tbl.getSelectedData();
       if (sel[0]){
         postData("db.cgi",{ "get":"userlist","schemata":companies.current_schemata}).then(data => {
index 43b4ec5..92d18f6 100644 (file)
@@ -5,17 +5,17 @@ let worktimes = {
     flatpickr("#startdate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
     });
     flatpickr("#enddate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
     });
   },
   inittable: function(){
     worktimes.tbl = new Tabulator("#tbl_worktimes", {
-      headerFilterPlaceholder: "filter...",
+      headerFilterPlaceholder: "[% lbl.filter %]",
       height: "calc(100vh - 111px)",
       layout: "fitDataFill",
       selectable: 1,
index 0a08775..232bc91 100644 (file)
@@ -20,7 +20,7 @@ let company = {
     flatpickr("#reportperiodstart",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
     });
     company.choices["reportperiodunit"] = new SlimSelect({
       select: "#reportperiodunit",
index a2da036..6139ac2 100644 (file)
         <label for="companies_company" class="label">[% lbl.company %]</label>
           </div>
           <div class="cell" style="width: 100px;">
-            <input type="text" class="input  data_companies readonly " id="socialtype" data-column="socialtype"  data-table="companies" data-id="" name="companies_socialtype" value=""    readonly/>
+            <input type="text" class="input  data_companies readonly " id="socialtype" data-column="socialtype"  data-table="companies" data-id="" name="companies_socialtype" value="" readonly/>
         <label for="companies_socialtype" class="label">[% lbl.companytype %]</label>
           </div>
         </div>
         <div class="row">
           <div class="cell" style="width: 120px;">
-            <input type="text" class="input  data_companies  readonly" id="comregister" data-column="comregister"  data-table="companies" data-id="" name="companies_comregister" value=""    readonly/>
+            <input type="text" class="input  data_companies  readonly" id="comregister" data-column="comregister"  data-table="companies" data-id="" name="companies_comregister" value="" readonly/>
         <label for="companies_comregister" class="label">[% lbl.rcs%]</label>
           </div>
           <div class="cell" style="width: 150px;">
-            <input type="text" class="input  data_companies readonly " id="vatnumber" data-column="vatnumber"  data-table="companies" data-id="" name="companies_vatnumber" value=""    readonly/>
+            <input type="text" class="input  data_companies readonly " id="vatnumber" data-column="vatnumber"  data-table="companies" data-id="" name="companies_vatnumber" value="" readonly/>
         <label for="companies_vatnumber" class="label">[% lbl.vatnumber %]</label>
           </div>
         </div>
         <div class="row">
           <div class="cell" style="width: 250px;">
-            <input type="text" class="input  data_companies readonly " id="email" data-column="email"  data-table="companies" data-id="" name="companies_email" value=""  readonly  />
+            <input type="text" class="input  data_companies readonly " id="email" data-column="email"  data-table="companies" data-id="" name="companies_email" value="" readonly/>
         <label for="companies_email" class="label" >E-Mail</label>
           </div>
          
@@ -87,7 +87,7 @@
         <div class="cell" style="width: 120px;">
           <select class="select data_companies readonly" id="reportperiodunit" data-column="reportperiodunit"  data-table="companies" data-id="" value="" name="companies_reportperiodunit" readonly >
         </select>
-        <label for="companies_reportperiodunit" class="label ">[% lbl.unit %]</label>
+        <label for="companies_reportperiodunit" class="label">[% lbl.unit %]</label>
         </div>
         <div class="cell container" style="width: 50px;">
           <select class="select data_companies readonly" id="payedpauses" data-column="payedpauses"  data-table="companies" data-id="" value="" name="companies_payedpauses" readonly >
     <div class="row">
       <div class="bar moduletoolbar">
         <div class="bar-item SubHeadTitle">
-          [% lbl.department %]s
+          [% lbl.department %]
         </div>
         <!--<button class="bar-item toolbarbtn right" id="btn_delete_staffgroup" onclick="staffgroups.remove(); return false;"><span class="icon icon-remove text-red" style="font-size: 12px;"></span>
         Supprimer</button> <button class="bar-item toolbarbtn right" onclick="staffgroups.edit(); return false;"><span class="icon icon-edit" style="font-size: 12px;"></span>
index 402cd87..e6fd8cd 100644 (file)
           
         </div>
       <div id="tbl_staffperiodweeks" ></div>
+      <div id="tbl_staffperiodfooter"style="border-top: 2px solid black;"></div>
       </div>
     </div>
   </div>
 </div>
     [% INCLUDE block/dlgstaffperioddays.tt %]
-    [% INCLUDE block/dlgstaffpointages.tt %]
+    [% #INCLUDE block/dlgstaffpointages.tt %]
     [% IF session.usergroup != 'teamleader' %]
 [% INCLUDE block/dlgperiodvalidation.tt %]
 [% END %]
index 38fe2dd..15b4709 100644 (file)
@@ -54,6 +54,7 @@ let reportperiod ={
         {title: '<span style="font-size: 9pt;">[% lbl.recuperation_short %]</span>',width: 65, field:"recuperationhours",hozAlign:"right",headerSort: false,formatter:periodRecupFormatter},
         {title: '<span style="font-size: 9pt;">[% lbl.vacancy %]</span>',width: 65, field:"vacancynormal",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 8pt;">[% lbl.vacancyill2 %]</span>',width:65, field:"vacancyill",hozAlign:"right",headerSort: false},
+        {title: '<span style="font-size: 8pt;">[% lbl.vacancyextra2 %]</span>',width:65, field:"vacancyextra",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;">[% lbl.total %]</span>',width: 65, field:"totalhours",hozAlign:"right",headerSort: false,formatter:periodTotalFormatter},
         {title: '<span style="font-size: 8pt;">[% lbl.statementtransfered2 %]</span>',width: 70, field:"transferedhours",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;">[% lbl.supphourspayed2 %]</span>',width: 65, field:"payedhours",hozAlign:"right",headerSort: false,headerVertical:true} ,
@@ -102,7 +103,8 @@ let reportperiod ={
   },
   gettbldata: function(){
     let fsel = reportperiod.tblfilter.getSelectedData();
-
+    let rpsel = reportperiod.tbl.getSelectedData();
+    let rpsplit = reportperiod.tblsplitted.getSelectedData();
     if (fsel[0]){
       let tblview = '';
       if (fsel[0].periodtype!="<15"){
@@ -122,10 +124,21 @@ let reportperiod ={
           console.log("grouped",data.result.data);
           reportperiod.datasums= data.result.data;
           postData("db.cgi",{ "get":  "staffperiodsplitted","schemata":schemata, "id_period":fsel[0].id}).then(data1 => {
-            reportperiod.tblsplitted.setData(data1.result.sqldata);
+            reportperiod.tblsplitted.setData(data1.result.sqldata).then(upds => {
+              // if (rpsplit[0]){
+              //   reportperiod.tbl.selectRow(rpsplit[0].id);
+              // }
+              
+            });
           });
         } else {
-          reportperiod.tbl.setData(data.result.sqldata);
+          reportperiod.tbl.setData(data.result.sqldata).then(upd => {
+            //console.log("Select length",rpsel.length);
+            // if (rpsel.length > 0){
+            //   reportperiod.tbl.selectRow(rpsel[0].id);
+              
+            // }
+          });
         }
       });
       //return false;
index 3df9728..75879a1 100644 (file)
@@ -1,6 +1,7 @@
 
 let staffperiodweeks = {
   tbl: null,
+  tblfooter: null,
   today: null,
   tbltimetracker: null,
   currentday: null,
@@ -15,30 +16,10 @@ let staffperiodweeks = {
   choices:{"id_vacancytype":null,"id_recuperationtype":null,"id_workplan":null},
   disablesave: false,
   initform: function(){
-    console.log("staffperiodweeks");
-    staffperiodweeks.choices["id_vacancytype"] = new SlimSelect({
-      select: "#id_vacancytype",
-      showSearch: false,
-      allowDeselect: true,
-      deselectLabel: '<span class="text-red">✖</span>',
-      onChange: function(){
-        staffperiodweeks.setvacancyhours();
-      }
-    });
     staffperiodweeks.choices["id_workplan"] = new SlimSelect({
       select: "#id_workplan",
       showSearch: false,
       
-    });
-    staffperiodweeks.choices["id_recuperationtype"] = new SlimSelect({
-      select: "#id_recuperationtype",
-      showSearch: false,
-      allowDeselect: true,
-      deselectLabel: '<span class="text-red">✖</span>',
-      onChange: function(){
-        staffperiodweeks.setrecuperationhours();
-      },
-
     });
     staffperiodweeks.getvacancy();
     staffperiodweeks.getrecuperation();
@@ -49,8 +30,6 @@ let staffperiodweeks = {
         tfields[i].addEventListener("change",function(){staffperiodweeks.checkdaytime();});
       } 
     }
-    document.getElementById("id_vacancytype").addEventListener('change', function(event){});
-    document.getElementById("id_recuperationtype").addEventListener('change', function(event){});
     staffperiodweeks.getwptemplates();
     document.getElementById("keepvacancy").setAttribute("checked",true);
     document.getElementById("keeprecuperation").setAttribute("checked",true);
@@ -58,7 +37,7 @@ let staffperiodweeks = {
   inittable: function(){
      
      staffperiodweeks.tbl = new Tabulator("#tbl_staffperiodweeks", {
-      height: "calc(100vh - 112px)",
+      height: "calc(100vh - 186px)",
       layout: "fitDataFill",
       selectable: true,
       selectableRangeMode:"click",
@@ -69,35 +48,59 @@ let staffperiodweeks = {
       groupHeader:[function(value, count, data){ 
         if (staffperiodweeks.weekdata && staffperiodweeks.weekdata[value]){
           return staffperiodweeks.weekdata[value].calyear + " - " + staffperiodweeks.weekdata[value].calweek + " ("+ moment(staffperiodweeks.weekdata[value].weekstart).format("DD.MM.YYYY") + " - " + moment(staffperiodweeks.weekdata[value].weekend).format("DD.MM.YYYY") +")"
-          + " ([% lbl.contract %]: "+ staffperiodweeks.weekdata[value].contracthours +"h / "+ parseInt(staffperiodweeks.weekdata[value].contractworkdays) +" [% lbl.days %]])";
+          + " ([% lbl.contract %]: "+ staffperiodweeks.weekdata[value].contracthours +"h / "+ parseInt(staffperiodweeks.weekdata[value].contractworkdays) +" [% lbl.days %])";
         } else {
           return value;
         }
       },
       ],
       columns: [
-        { title: "date",field: "daydate",hozAlign:"right",headerSort:"datetime",formatter:dateFormatter},
+        { title: "[% lbl.date %]",field: "daydate",hozAlign:"right",headerSort:"datetime",formatter:dateFormatter},
         { title: "[% lbl.weekhours2 %]",field: "dspworkdata",headerSort: false,hozAlign:"center",formatter:worktimeFormatter},
         // { title: "[% lbl.worktotal2 %]",field: "workhours",headerSort: false,hozAlign:"center",bottomCalc:staffperiodweeks.setweekworkhours},
         { title: "[% lbl.pausehours2 %]",field: "dsppausedata",headerSort: false,hozAlign:"center",formatter:sizeFormatter},
-        { title: "[% lbl.totalpause2 %]",field: "timepause",headerSort: false,hozAlign:"center"},
+        // { title: "[% lbl.totalpause2 %]",field: "timepause",headerSort: false,hozAlign:"center"},
         { title: "Coup.",field: "interruptionhours",headerSort:false,hozAlign:"center",formatter:interruptFormatter},
-        { title: "[% lbl.vacancy %]",field: "vacancyhours",headerSort: false,hozAlign:"center",formatter:vacancyformatter,bottomCalc:staffperiodweeks.setweekvacancyhours},
+        { title: "[% lbl.vacancy %]",field: "dspvacancyhours",headerSort: false,hozAlign:"center",formatter:vacancyformatter,bottomCalc:staffperiodweeks.setweekvacancyhours},
         { title: "[% lbl.recuperation_short %]",field: "recuperationhours",hozAlign:"center",headerSort: false,formatter:recupformatter,bottomCalc:staffperiodweeks.setweekrecuperationhours},
-        { title: "Total",field: "dayhours",hozAlign:"center",headerSort: false,formatter:totalFormatter,bottomCalc:staffperiodweeks.setweektotalhours,bottomCalcFormatter:"html"},
+        { title: "[% lbl.total %]",field: "dayhours",hozAlign:"center",headerSort: false,formatter:totalFormatter,bottomCalc:staffperiodweeks.setweektotalhours,bottomCalcFormatter:"html"},
         { title: "[% lbl.diffcontract %]",field:"diffhours",hozAlign:"center",formatter:nullFormatter,headerSort:false,bottomCalc:staffperiodweeks.setweekdiffhours},
         { title: "[% lbl.avgweek_short %]",field: "avgweekhours",hozAlign:"center",headerSort: false,formatter:nullFormatter,bottomCalc:staffperiodweeks.setavgweekhours},
-        { title: "heures libres<br/>après trav",field: "freehoursafter",hozAlign:"center",formatter:freetimeFormatter,headerSort: false},
-        { title: "pointages",field:"trackedtime",hozAlign:"center",formatter:timetrackFormatter,headerSort: false}
+        { title: "[% lbl.resttime %]",field: "freehoursafter",hozAlign:"center",formatter:freetimeFormatter,headerSort: false},
+        { title: "[% lbl.timetracks %]",field:"trackedtime",hozAlign:"center",formatter:timetrackFormatter,headerSort: false}
       ]
   });
+  staffperiodweeks.tblfooter = new Tabulator("#tbl_staffperiodfooter", {
+    height: "78px",
+    layout: "fitDataFill",
+    selectable: false,
+    rowContext:function(e, row){e.preventDefault();},
+    columns: [
+    
+      {title: '<span style="font-size: 9pt;">[% lbl.contract %]</span>',width: 70, field:"contracthours",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.work %]</span>',width: 65, field:"workhours",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.recuperation_short %]</span>',width: 90, field:"recuperationhours",hozAlign:"right",headerSort: false,formatter:periodRecupFormatter},
+      {title: '<span style="font-size: 9pt;">[% lbl.vacancy %]</span>',width: 65, field:"vacancynormal",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 8pt;">[% lbl.vacancyill2 %]</span>',width:65, field:"vacancyill",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 8pt;">[% lbl.vacancyextra3 %]</span>',width:90, field:"vacancyextra",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.total %]</span>',width: 65, field:"totalhours",hozAlign:"right",headerSort: false,formatter:periodTotalFormatter},
+      {title: '<span style="font-size: 8pt;">[% lbl.statementtransfered3 %]</span>',width: 80, field:"transferedhours",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.supphourspayed2 %]</span>',width: 80, field:"payedhours",hozAlign:"right",headerSort: false} ,
+      {title: '<span style="font-size: 8pt;">[% lbl.finalstatementpot2 %]</span>',width: 90, field:"hoursdiff",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.supp44h3 %]</span>',width: 70, field:"suppvacancy44hours",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 9pt;">[% lbl.suppsunwork2 %]</span>',width: 70, field:"suppvacancysunwork",hozAlign:"right",headerSort: false},
+      {title: '<span style="font-size: 8pt;">[% lbl.avgweek_short2 %]</span>',width: 100, field:"avgtotalweekhours",hozAlign:"right",headerSort: false,formatter:periodAVGFormatter},
+      {title: '<span style="font-size: 9pt;">[% lbl.validated2 %]</span>',width: 60, field:"isvalidated",hozAlign:"center",headerSort: false,formatter:"tickCross", formatterParams:{allowEmpty:true,allowTruthy: false}}
+      
+    ] 
+  });
   staffperiodweeks.initform();
   staffperiodweeks.inittimetracktable();
   },
   inittimetracktable: function(){
     staffperiodweeks.tbltimetracker = new Tabulator("#tbl_daytimetracker", {
-      height: "400px",
-      layout: "fitDataFill",
+      height: "550px",
+      layout: "DataFill",
       selectable: true,
       selectableRangeMode:"click",
       dataEdited:function(data){
@@ -105,16 +108,15 @@ let staffperiodweeks = {
       },
       rowContext:function(e, row){e.preventDefault();},
       columns: [
-        { title: "Entrée",field: "stamp_in",headerSort: false,hozAlign:"left",width: 80,editor:"input",editorParams:{mask:"99:99",elementAttributes:{maxlength: 5}}},
-        { title: "Sortie",field: "stamp_out",headerSort: false,hozAlign:"left",width: 80,editor:"input",editorParams:{mask:"99:99",elementAttributes:{maxlength: 5}}},
-        { title: "Total",field: "total",headerSort: false,hozAlign:"left",width: 90,formatter:boldFormatter,bottomCalc:staffperiodweeks.settrackdaytotal,bottomCalcFormatter:"html"}
+        { title: "[% lbl.ttentry %]",field: "stamp_in",headerSort: false,hozAlign:"left",width: 80,editor:"input",editorParams:{mask:"99:99",elementAttributes:{maxlength: 5}}},
+        { title: "[% lbl.ttexit %]",field: "stamp_out",headerSort: false,hozAlign:"left",width: 80,editor:"input",editorParams:{mask:"99:99",elementAttributes:{maxlength: 5}}},
+        { title: "[% lbl.tttotal %]",field: "total",headerSort: false,hozAlign:"left",width: 90,formatter:boldFormatter,bottomCalc:staffperiodweeks.settrackdaytotal,bottomCalcFormatter:"html"}
       ]
     });
   },
   gettbldata: function(){
     staffperiodweeks.today= moment(new Date()).format('YYYY-MM-DD');
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
-    console.log("selrp",selrp);
     let weekmonstart = moment(selrp[0].startdate).startOf('isoWeek').format("YYYY-MM-DD");
     let weeksunend = moment(selrp[0].enddate).endOf('isoWeek').format("YYYY-MM-DD");
     postData("db.cgi",{"get":"periodweeksums","schemata":schemata,"id_staff":selrp[0].id_staff,"id_period":selrp[0].id_reportperiod,"date_start":weekmonstart,"date_end":weeksunend}).then(data => {
@@ -130,16 +132,14 @@ let staffperiodweeks = {
           
         }
       });
-    })
-    
-    
+    });
   },
   loadplan: function(parenttbl){
     staffperiodweeks.selectedrow = null;
     staffperiodweeks.parenttbl = parenttbl;
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
     if (selrp[0]) {
-      /* @preserve[% IF session.usergroup == 'temleader' %] */
+      /* @preserve[% IF session.usergroup == 'teamleader' %] */
       if (selrp[0].isvalidated == "1"){
         document.getElementById("tbl_editweeks").style.display = 'none';
       } else {
@@ -151,6 +151,7 @@ let staffperiodweeks = {
       document.getElementById("periodtitle").innerHTML="&nbsp;Période " + moment(selrp[0].startdate).format('DD.MM.YYYY')  + "-" + moment(selrp[0].enddate).format('DD.MM.YYYY');
       document.getElementById("stafftitle").innerHTML= selrp[0].staffname + "(" + selrp[0].groupname + ")";
       staffperiodweeks.gettbldata();
+      staffperiodweeks.tblfooter.setData([selrp[0]]);
       app.viewpanel('staffperiodweeks');
     }
   },
@@ -190,6 +191,7 @@ let staffperiodweeks = {
   edit: function(){
     dataform.cleanform2("staffreportperioddays",staffperiodweeks.choices);
    let cday = staffperiodweeks.tbl.getSelectedData();
+   //let selrp = staffperiodweeks.parenttbl.getSelectedData();
     staffperiodweeks.dayrefdata =null;
     
     if (cday[0]){
@@ -203,8 +205,16 @@ let staffperiodweeks = {
       document.getElementById("infomindailyrecuperation").value='';
       document.getElementById("infofreetimebefore").value='';
       document.getElementById("infofreetimeafter").value='';
+      
+      // document.getElementById("vacancycomment").value='';
+      // document.getElementById("vacillcoment").value='';
+      // document.getElementById("vacextracomment").value='';
+      // document.getElementById("recupcomment").value='';
+      // document.getElementById("partunempcomment").value='';
+      
       dataform.fillformbydataclass2("staffreportperioddays",staffperiodweeks.choices,staffperiodweeks.currentday);
-      document.getElementById("display_date").innerHTML=moment(staffperiodweeks.currentday.daydate).format("dddd , DD.MM.YYY");
+      document.getElementById("display_date").innerHTML=moment(staffperiodweeks.currentday.daydate).format("dddd , DD.MM.YYYY");
+      //document.getElementById("display_staffname").innerHTML=selrp[0].staffname;
       postData("db.cgi",{"fn":"getworktimelimits","daydate":cday[0].daydate,"id_staff":cday[0].id_staff,"schemata":schemata}).then(data => {
         if (data.result){
           staffperiodweeks.dayrefdata =data.result;
@@ -214,9 +224,12 @@ let staffperiodweeks = {
           document.getElementById("infomaxweekhours").value=data.result.maxweekhours;
           document.getElementById("infofreetimebefore").value=data.result.tiembefore;
           document.getElementById("infofreetimeafter").value=data.result.timeafter;
+
+
           staffperiodweeks.calcfreetime();
           staffperiodweeks.checkworktime();
         } 
+        staffperiodweeks.edittimetracker();
         app.viewdialog('staffreportperioddays');
       }).catch(e => {console.log(e)});
       
@@ -240,31 +253,17 @@ let staffperiodweeks = {
   },
   updateWeekHours: function(){
     let selrp = staffperiodweeks.parenttbl.getSelectedData();
-
     postData("db.cgi",{"fn":"update_staff_in_period","schemata":schemata,"id_period":selrp[0].id_reportperiod,"id_staff":selrp[0].id_staff}).then( data => {
-
       staffperiodweeks.gettbldata();
+      staffperiodweeks.tblfooter.setData([data.result["0"]]);
       dataform.formsaved({});
       closedataloaddlg();
     }).catch(e => {closedataloaddlg();});
   },
   getvacancy: function(){
-    postData("db.cgi",{"get":"vacancytypes","schemata":schemata}).then(data => { 
-      dataform.fillselectlist(staffperiodweeks.choices["id_vacancytype"],data.result.sqldata,'id','vacancyname');
-      for (var v in data.result.sqldata){
-        staffperiodweeks.vacancytypes[data.result.sqldata[v].id] = data.result.sqldata[v];
-      }
-    });
-    //
-  },
 
+  },
   getrecuperation: function(){
-    postData("db.cgi",{"get":"recuperationtypes","schemata":schemata}).then(data => {
-      dataform.fillselectlist(staffperiodweeks.choices["id_recuperationtype"],data.result.sqldata,'id','vacancyname');
-      for (var r in data.result.sqldata){
-        staffperiodweeks.recuperationtypes[data.result.sqldata[r].id] = data.result.sqldata[r];
-      }
-    });
 
   },
   getdefaultdaylimits: function(){
@@ -344,11 +343,11 @@ let staffperiodweeks = {
       opt1.value=timecalc.MinutesToTime(mtp1);
       if (ps1 < s1){
         staffperiodweeks.disablesave = true;
-        msg = "les pauses doivent être dans les [% lbl.workhours %]!";
+        msg = "[% lbl.msgworkhoursinside %]!";
       }
       if (pe1 > e1){
         staffperiodweeks.disablesave = true;
-        msg = "les pauses doivent être dans les [% lbl.workhours %]!";
+        msg = "[% lbl.msgworkhoursinside %]!";
       }
     }
     if (ope2.value && ops2.value){
@@ -359,11 +358,11 @@ let staffperiodweeks = {
       opt2.value=timecalc.MinutesToTime(mtp2);
       if (ps2 < s2){
         staffperiodweeks.disablesave = true;
-        msg = "les pauses doivent être dans les [% lbl.workhours %]!";
+        msg = "[% lbl.msgworkhoursinside %]!";
       }
       if (pe2 > e2){
         staffperiodweeks.disablesave = true;
-        msg = "les pauses doivent être dans les [% lbl.workhours %]!";
+        msg = "[% lbl.msgworkhoursinside %]!";
       }
     }
     if (staffperiodweeks.disablesave === true){
@@ -392,15 +391,9 @@ let staffperiodweeks = {
     console.log(mt1 + " + " + mt2);
     if ((ppy.checked) && (ppy.checked === true)){
       let mtall = mt1+mt2;
-      // console.log("pause payed!");
-      // console.log("minutes: " + mtall);
-      // console.log(mt1 + " + " + mt2);
       owkh.value= timecalc.MinutesToTime(mtall);
     } else {
       let mtall = mt1+mt2-mtp;
-      // console.log("pause not payed!");
-      // console.log("minutes: " + mtall);
-      // console.log(mt1 + " + " + mt2 + " - " + mtp);
       owkh.value= timecalc.MinutesToTime(mtall);
       
     }
@@ -412,23 +405,24 @@ let staffperiodweeks = {
       timecalc.validateTime(obj.value);
     }
     let wktime = 0;
-    let vactime = 0;
+    let vactime = 0;let villtime = 0; let vextratime = 0;
     let reptime = 0;
+    let unempltime = 0;
     let owkh = document.getElementById("workhours");
     let ovach = document.getElementById("vacancyhours");
+    let ovill = document.getElementById("vacillhours");
+    let ovextra = document.getElementById("vacextrahours");
+    let opartunempl = document.getElementById("partunemplhours");
     let orech = document.getElementById("recuperationhours");
     let odyh =document.getElementById("dayhours");
     let oirupt = document.getElementById("interruptionhours");
-    if (owkh.value){
-      wktime = timecalc.TimeToMinutes(owkh.value);
-    }
-    if (ovach.value){
-      vactime = timecalc.TimeToMinutes(ovach.value);
-    }
-    if (orech.value){
-      reptime = timecalc.TimeToMinutes(orech.value);
-    }
-    let fulldaytime =  wktime+vactime+reptime;
+    if (owkh.value){wktime = timecalc.TimeToMinutes(owkh.value);}
+    if (ovach.value){ vactime = timecalc.TimeToMinutes(ovach.value);}
+    if (ovill.value){villtime = timecalc.TimeToMinutes(ovill.value);}
+    if (ovextra.value){vextratime = timecalc.TimeToMinutes(ovextra.value);}
+    if (opartunempl.value){unempltime = timecalc.TimeToMinutes(opartunempl.value);}
+    if (orech.value){reptime = timecalc.TimeToMinutes(orech.value);}
+    let fulldaytime =  wktime+vactime+reptime+villtime+vextratime+unempltime;
     odyh.value= timecalc.MinutesToTime(fulldaytime);
     if (fulldaytime > timecalc.TimeToMinutes(staffperiodweeks.dayrefdata.maxdayhours)){
       odyh.classList.remove("text-black");
@@ -512,7 +506,6 @@ let staffperiodweeks = {
   },
   getwptemplates: function(){
     postData("db.cgi",{"get":"workplanlist","schemata":schemata}).then(data => {
-      console.log(data.result);
       dataform.fillselectlist(staffperiodweeks.choices["id_workplan"],data.result.sqldata,'id','dspworkplandetail');
       
     }).catch(e => {console.log(e)});
@@ -563,19 +556,13 @@ let staffperiodweeks = {
     });
   },
   edittimetracker: function(){
-    
     staffperiodweeks.inittimetracktable();
     let sel = staffperiodweeks.tbl.getSelectedData();
-    let selrp = staffperiodweeks.parenttbl.getSelectedData();
     if (sel.length > 0 && sel[0].daydate < staffperiodweeks.today){
       staffperiodweeks.selectedid = sel[0].id;
       postData("db.cgi",{"get":"gettrackday","schemata":schemata,"id_staff":sel[0].id_staff,"daydate":sel[0].daydate}).then(data => {
         staffperiodweeks.tbltimetracker.setData(data.result.sqldata);
-        document.getElementById("dlg_stafftimetracker_staffname").innerHTML = selrp[0].staffname;
-        document.getElementById("dlg_stafftimetracker_date").innerHTML = moment(sel[0].daydate).format("DD.MM.YYYY");
-        document.getElementById('dlg_stafftimetracker').style.display='block';
       });
-      
     }
   },
   ttadd: function(){
@@ -665,24 +652,10 @@ let freetimeFormatter = function(cell, formatterParams){
 };
 
 let vacancyformatter = function(cell, formatterParams){
-  if (cell.getValue() > "00:00") {
-    //console.log("vac",cell._cell.row.data.id_vacancytype);
-    //console.log("vac",staffperiodweeks.vacancytypes);
-    if (staffperiodweeks.vacancytypes[cell._cell.row.data.id_vacancytype]){
-      cell.getElement().style.backgroundColor=staffperiodweeks.vacancytypes[cell._cell.row.data.id_vacancytype].color;
-      return  cell.getValue() + "<br/>"+ staffperiodweeks.vacancytypes[cell._cell.row.data.id_vacancytype].vacancyname;
-    }  
-  }
   return cell.getValue();
 };
 
 let recupformatter = function(cell, formatterParams){
-  if (cell.getValue() > "00:00") {
-    if (staffperiodweeks.recuperationtypes[cell._cell.row.data.id_recuperationtype]){
-      cell.getElement().style.backgroundColor=staffperiodweeks.recuperationtypes[cell._cell.row.data.id_recuperationtype].color;
-      return  cell.getValue() + "<br/>"+ staffperiodweeks.recuperationtypes[cell._cell.row.data.id_recuperationtype].vacancyname;
-    }
-  }
   return cell.getValue();
 };
 
index 4aaf37c..5f3d4c2 100644 (file)
@@ -1,4 +1,4 @@
-<button class="bar-item toolbarbtn right" onclick="staffperiodweeks.edittimetracker(); return false;"><span class="icon icon-usertime"></span>[% lbl.timetracks %]</button>
+<!-- <button class="bar-item toolbarbtn right" onclick="staffperiodweeks.edittimetracker(); return false;"><span class="icon icon-usertime"></span>[% lbl.timetracks %]</button> -->
 <span id="tbl_editweeks">
 <button class="bar-item toolbarbtn right" onclick="staffperiodweeks.edit(); return false;"><span class="icon icon-edit"></span>[% lbl.edit %]</button>
 <button class="bar-item toolbarbtn right" onclick="staffperiodweeks.copy(); return false;"><span class="icon icon-copy"></span>[% lbl.copy %]</button>
index 098af96..b0b5673 100644 (file)
@@ -5,6 +5,7 @@
     <div class="bar-item PageHeadTitle">[% lbl.staff %]</div>
     <button class="bar-item toolbarbtn" onclick="staff.setview('basedata');"><span class="icon icon-staff"></span>[% lbl.basedata %]</button>
     <button class="bar-item toolbarbtn" onclick="staff.setview('periods');"><span class="icon icon-calendar"></span>[% lbl.periods %]</button>
+    <button class="bar-item toolbarbtn" onclick="staff.setview('staffvacancy');"><span class="icon icon-vacancydays"></span>[% lbl.staffvacancy %]</button>
     [% IF session.usergroup != 'teamleader' %]
     <div class="toolbar paneltoolbar" id="tlb_basedata">
       <button class="bar-item toolbarbtn  right" onclick="staff.remove();"><span class="icon icon-remove text-red"></span>[% lbl.delete %]</button>
         </div>
   <div id="tbl_staffperiodweeks" ></div>
 </div>
+<div id="pnl_staffvacancy" class="panel" style="display: none;">
+  <div class="bar moduletoolbar">
+          <div class="bar-item SubHeadTitle">[% lbl.staffvacancy %]</div>
+          <!-- <button class="bar-item toolbarbtn right" onclick="staffvacancy.confirmDelete();"><span class="icon icon-remove text-red"></span>[% lbl.delete %]</button> -->
+          <!-- <button class="bar-item toolbarbtn right" onclick="staffvacancy.add(); return false;"><span class="icon icon-plus"><br/>[% lbl.add %]</button> -->
+          <!-- <button class="bar-item toolbarbtn right" onclick="staffperiods.edit(); return false;"><span class="icon icon-edit"><br/>[% lbl.edit %]</button> -->
+
+          <!-- <button class="bar-item toolbarbtn right" onclick="staffperiods.generatereport();"><span class="icon icon-pdf"></span>[% lbl.pdf %]</button> -->
+        </div>
+  <div id="tbl_staffvacancy" ></div>
+  
+</div>
 </div>
 
 </div>
 
 [% INCLUDE module/staff/dlg_staffcontract.tt %]
 [% INCLUDE module/staff/dlg_addstaff.tt %]
+[% INCLUDE module/staff/dlg_addvacancyyears.tt %]
 [% INCLUDE block/dlgstaffperioddays.tt %]
-[% INCLUDE block/dlgstaffpointages.tt %]
+[% #INCLUDE block/dlgstaffpointages.tt %]
 [% INCLUDE block/dlg_replacestaffdayworkplan.tt %]
 <script type="text/javascript" src="staff/staff[% minify%].js?v=[% appversion %]"></script>
 <script type="text/javascript" src="staff/staffcontract[% minify%].js?v=[% appversion %]"></script>
 <script type="text/javascript" src="staff/staffperiods[% minify%].js?v=[% appversion %]"></script>
 <script type="text/javascript" src="periods/staffperiodweeks[% minify%].js?v=[% appversion %]"></script>
+<script type="text/javascript" src="staff/staffvacancy[% minify%].js?v=[% appversion %]"></script>
\ No newline at end of file
diff --git a/app/tmpl/module/staff/dlg_addvacancyyears.tt b/app/tmpl/module/staff/dlg_addvacancyyears.tt
new file mode 100644 (file)
index 0000000..39cb118
--- /dev/null
@@ -0,0 +1,27 @@
+<div id="dlg_staffvacancyyear" class="modal">
+  <div class="modal-content animate-top card-4">
+    <header> 
+      <span onclick="document.getElementById('dlg_staffvacancyyear').style.display='none'; return false;" 
+       class="button toolbarbtn display-topright" ><span class="icon icon-remove" style="font-size: 18px;"></span></span>
+      <h3 id="dlgstaffvacancyyear_title">[% lbl.vacancyyears %]</h3>
+    </header>
+    <div class="container">
+        <form id="frm_staffvacancyyear">
+           <input type="hidden" class="data_staffvacancyyear" id="ident_id_staffvacancyyear" name="ident_staffvacancyyear_id_staffvacancyyear" value="">
+        <div class="row">
+          <div class="container cell">
+          <div class="cell" style="width: 100px;">
+          <label for="staffvacancyyear_vachours" class="label">[% lbl.vacancyhours %] </label>
+              <input class="data_staffvacancyyear intervalfield" id="vachours" name="staffvacancyyear_vachours" onblur="timecalc.validateInterval(this);return false;"  placeholder="0:00" style="float: left;" type="text" value=""> <a class="inlinebtn" href="javascript:dataform.cleanfield('vachours');return false;"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
+          </div>
+        </div>
+        
+        </div>
+       </form>  
+    </div>
+    <footer>
+    <button class="button theme-light margin-right border" onclick="document.getElementById('dlg_staffvacancyyear').style.display='none'; return false;"><span class="icon icon-remove"></span>&nbsp;[% lbl.cancel %]</button>
+    <button class="button actionbtn margin-right border" onclick="staffvacancy.saveyear();"><span class="icon icon-Save"></span>&nbsp;[% lbl.save %]</button>  
+    </footer>
+  </div>
+</div>
\ No newline at end of file
index fd22af9..fddb50f 100644 (file)
 <div class="panel" id="pnl_basedata" style="display: none;">
+  <form id="frm_staff">
+    <input type="hidden" class="data_staff" id="id" name="ident_staff_id" value="">
+  <div class="row">
+    <div class="twothird">
+      <div class="bar moduletoolbar" style="border-right: 1px solid #c6c6c6;">
+        <div class="bar-item SubHeadTitle">[% lbl.basedata %]</div>
+        <!-- <button class="bar-item toolbarbtn right" onclick="staff.setcalendarpassword(); return false;"><span class="icon icon-calendar"></span>[% lbl.staffpwd %]</button> -->
+      </div>
+      <div class="row" style="margin-top: 5px; margin-bottom: 5px;border-right: 1px solid #c6c6c6;">
+        <div class="container half" >
+          <div class="row">
+            <div class="container fifth">
+            <label for="staff_staffnumber" class="label">[% lbl.staffnumber %]</label>
+              <input type="text" class="input  data_staff  " id="staffnumber" data-column="staffnumber"  data-table="staff" data-id="" name="staff_staffnumber" value=""   onblur="dataform.savefield(this,null);return false;"/>
       
-        <div class="bar moduletoolbar">
-          <div class="bar-item SubHeadTitle">[% lbl.basedata %]</div>
-        </div>
-        <form id="frm_staff">
-          <input type="hidden" class="data_staff" id="id" name="ident_staff_id" value="">
-        <div class="row" style="margin-top: 5px; margin-bottom: 5px;">
-          <div class="cell container">
+            </div>
+            <div class="container twofifth">
+            <label for="staff_matricule" class="label">[% lbl.matricule %]</label>
+              <input type="text" class="input  data_staff  " id="matricule" data-column="matricule"  data-table="staff" data-id="" name="staff_matricule" value=""   onblur="dataform.savefield(this,null);"/>
+      
+            </div>
+            <div class="container twofifth">
+            <label for="staff_birthdate" class="label">[% lbl.birthdate %]</label>
+              <input type="text" class="input data_staff datefield" id="birthdate" name="staff_birthdate" data-column="birthdate"  data-table="staff" data-id=""   value="" onblur="dataform.savefield(this,null);"/>
+     
+            </div>
+            </div>
             <div class="row">
-              <div class="cell container" style="width: 80px;">
-              <label for="staff_staffnumber" class="label">No.</label>
-                <input type="text" class="input  data_staff  " id="staffnumber" data-column="staffnumber"  data-table="staff" data-id="" name="staff_staffnumber" value=""   onblur="dataform.savefield(this,null);return false;"/>
-        
-              </div>
-              <div class="cell container" style="width: 150px;">
-              <label for="staff_matricule" class="label"[% lbl.matricule %]</label>
-                <input type="text" class="input  data_staff  " id="matricule" data-column="matricule"  data-table="staff" data-id="" name="staff_matricule" value=""   onblur="dataform.savefield(this,null);"/>
-        
-              </div>
-              <div class="cell container" style="width: 170px;">
-              <label for="staff_birthdate" class="label">[% lbl.birthdate %]</label>
-                <input type="text" class="input data_staff datefield" id="birthdate" name="staff_birthdate" data-column="birthdate"  data-table="staff" data-id=""   value="" onblur="dataform.savefield(this,null);"/>
-       
-              </div>
-              </div>
-              <div class="row">
-                <div class="cell container" style="width: 200px;">
-                <label for="staff_surname" class="label">[% lbl.name %]</label>
-                  <input type="text" class="input  data_staff  " id="surname" data-column="surname"  data-table="staff" data-id="" name="staff_surname" value=""   onblur="dataform.savefield(this,staff.gettbldata);"/>
-        
-                </div>
-                <div class="cell container" style="width: 200px;">
-                <label for="staff_prename" class="label">[% lbl.prename %]</label>
-                   <input type="text" class="input  data_staff  " id="prename" data-column="prename"  data-table="staff" data-id="" name="staff_prename" value=""   onblur="dataform.savefield(this,staff.gettbldata);"/>
-        
-                </div>
-              </div>
-              <div class="row">
-                <div class="cell container" style="width: 400px;">
-                <label for="staff_job" class="label">[% lbl.job %]</label>
-                  <input type="text" class="input  data_staff  " id="job" data-column="job"  data-table="staff" data-id="" name="staff_job" value=""   onblur="dataform.savefield(this,null);"/>
-        
-                </div>
-              </div>
-              <div class="row">
-                <div class="cell container" style="width: 200px;">
-                <label for="staff_id_staffgroup" class="label ">[% lbl.department %]</label>
-                  <select class="select data_staff " id="id_staffgroup" data-column="id_staffgroup"  data-table="staff" data-id="" value="" name="staff_id_staffgroup"  >
-        </select>
-        
-                </div>
-                <div class="cell container" style="width: 200px;">
-                <label for="staff_istimetrackenabled" class="label ">[% lbl.timetracker %]</label>
-                  <select class="select data_staff " id="istimetrackenabled" data-column="istimetrackenabled"  data-table="staff" data-id="" value="" name="staff_istimetrackenabled">
-                  <option value="">[% lbl.no %]</option>
-                  <option value="1">[% lbl.yes %]</option>
-                  </select>
-                </div>
+              <div class="container half">
+              <label for="staff_surname" class="label">[% lbl.name %]</label>
+                <input type="text" class="input  data_staff  " id="surname" data-column="surname"  data-table="staff" data-id="" name="staff_surname" value=""   onblur="dataform.savefield(this,staff.gettbldata);"/>
+      
               </div>
-          </div>
-          <div class="cell container">
-            <div class="row">
-              <div class="cell container" style="width: 400px;">
-              <label for="staff_address" class="label">[% lbl.address %]</label>
-                <input type="text" class="input  data_staff  " id="address" data-column="address"  data-table="staff" data-id="" name="staff_address" value=""   onblur="dataform.savefield(this,null);"/>
-        
+              <div class="container half">
+              <label for="staff_prename" class="label">[% lbl.prename %]</label>
+                 <input type="text" class="input  data_staff  " id="prename" data-column="prename"  data-table="staff" data-id="" name="staff_prename" value=""   onblur="dataform.savefield(this,staff.gettbldata);"/>
+      
               </div>
             </div>
             <div class="row">
-              <div class="cell container" style="width: 70px;">
-              <label for="staff_zip" class="label">[% lbl.zip %]</label>
-                <input type="text" class="input  data_staff  " id="zip" data-column="zip"  data-table="staff" data-id="" name="staff_zip" value=""   onblur="dataform.savefield(this,null);"/>
-        
+              <div class="container half">
+              <label for="staff_id_staffgroup" class="label ">[% lbl.department %]</label>
+                <select class="select data_staff " id="id_staffgroup" data-column="id_staffgroup"  data-table="staff" data-id="" value="" name="staff_id_staffgroup"></select>
               </div>
-              <div class="cell container" style="width: 170px;">
-              <label for="staff_city" class="label">[% lbl.city %]</label>
-                <input type="text" class="input  data_staff  " id="city" data-column="city"  data-table="staff" data-id="" name="staff_city" value=""   onblur="dataform.savefield(this,null);"/>
-        
-              </div>
-              <div class="cell container" style="width: 160px;">
-              <label for="staff_country" class="label">[% lbl.country %]</label>
-                <input type="text" class="input  data_staff  " id="country" data-column="country"  data-table="staff" data-id="" name="staff_country" value=""   onblur="dataform.savefield(this,null);"/>
-        
+              <div class="container half">
+              <label for="staff_job" class="label">[% lbl.job %]</label>
+                <input type="text" class="input  data_staff  " id="job" data-column="job"  data-table="staff" data-id="" name="staff_job" value=""   onblur="dataform.savefield(this,null);"/>
               </div>
             </div>
-            <div class="row">
-              <div class="cell container" style="width: 400px;">
-              <label for="staff_phone" class="label">[% lbl.phone %]</label>
-                <input type="text" class="input  data_staff  " id="phone" data-column="phone"  data-table="staff" data-id="" name="staff_phone" value=""   onblur="dataform.savefield(this,null);"/>
-        
-              </div>
+
+            
+        </div>
+        <div class="container half">
+          <div class="row">
+            <div class="container" >
+            <label for="staff_address" class="label">[% lbl.address %]</label>
+              <input type="text" class="input  data_staff" id="address" data-column="address"  data-table="staff" data-id="" name="staff_address" value=""   onblur="dataform.savefield(this,null);"/>
+      
             </div>
-            <div class="row">
-              <div class="cell container" style="width: 400px;">
-              <label for="staff_email" class="label">[% lbl.email %]</label>
-                <input type="text" class="input  data_staff  " id="email" data-column="email"  data-table="staff" data-id="" name="staff_email" value=""   onblur="dataform.savefield(this,null);"/>
-        
-              </div>
+          </div>
+          <div class="row">
+            <div class="container-left fifth">
+            <label for="staff_zip" class="label">[% lbl.zip %]</label>
+              <input type="text" class="input  data_staff  " id="zip" data-column="zip"  data-table="staff" data-id="" name="staff_zip" value=""   onblur="dataform.savefield(this,null);"/>
+            </div>
+            <div class="container twofifth">
+            <label for="staff_city" class="label">[% lbl.city %]</label>
+              <input type="text" class="input  data_staff  " id="city" data-column="city"  data-table="staff" data-id="" name="staff_city" value=""   onblur="dataform.savefield(this,null);"/>
+            </div>
+            <div class="container-right twofifth">
+            <label for="staff_country" class="label">[% lbl.country %]</label>
+              <input type="text" class="input  data_staff  " id="country" data-column="country"  data-table="staff" data-id="" name="staff_country" value=""   onblur="dataform.savefield(this,null);"/>
+            </div>
+          </div>
+          <div class="row">
+            <div class="container half">
+            <label for="staff_phone" class="label">[% lbl.phone %]</label>
+              <input type="text" class="input  data_staff  " id="phone" data-column="phone"  data-table="staff" data-id="" name="staff_phone" value=""   onblur="dataform.savefield(this,null);"/>
+            </div>
+            <div class="container half">
+            <label for="staff_email" class="label">[% lbl.email %]</label>
+              <input type="text" class="input  data_staff  " id="email" data-column="email"  data-table="staff" data-id="" name="staff_email" value=""   onblur="dataform.savefield(this,null);"/>
+            </div>
+          </div>
+        </div>
+        <div class="container">
+          <label class="label" for="staff_note">[% lbl.note %]</label>
+          <textarea class="input border data_staff richeditarea" style="height: 100px;"  data-id="" data-column="note" data-table="staff"  id="note" name="staff_note" ></textarea>
+        </div>
+      </div>
+    </div>
+    <div class="third" id="timetrackerconfig" style="display: none;">
+      <div class="bar moduletoolbar" >
+        <div class="bar-item SubHeadTitle">[% lbl.timetracker %]</div>
+        <button class="bar-item toolbarbtn right" onclick="staff.cleanfingerprints(); return false;"><span class="icon icon-fingerprint-remove"></span>[% lbl.cleanfp %]</button>
+      </div>
+      <div class="row" style="margin-top: 5px; margin-bottom: 5px;">
+          
+        <div class="container">
+          <div class="row">
+          <div class="fifth container">
+            <label for="staff_istimetrackenabled" class="label ">[% lbl.timetracker %]</label>
+              <select class="select data_staff " id="istimetrackenabled" data-column="istimetrackenabled"  data-table="staff" data-id="" value="" name="staff_istimetrackenabled">
+              <option value="">[% lbl.no %]</option>
+              <option value="1">[% lbl.yes %]</option>
+              </select>
+            </div>
+            <div class="container fifth">
+              <label for="staff_timetrackerpin" class="label">[% lbl.ttpincode %]</label>
+              <input type="number" class="input data_staff" id="timetrackerpin" data-column="timetrackerpin" data-table="staff" data-id="" name="staff_timetrackerpin" value="" onblur="dataform.savefield(this,null);"/>
+            </div>
+            <div class="container quarter">
+              <label for="staff_timetrackerlang" class="label">[% lbl.language %]</label>
+              <select class="select data_staff" id="timetrackerlang" data-column="timetrackerlang"  data-table="staff" data-id="" value="" name="staff_timetrackerlang">
+                <option value="fr">français</option>
+                <option value="de">deutsch</option>
+              </select>
+            </div>
+            
+          </div>
+          <div class="row">
+            <div class="container threequarter">
+              <label for="staff_timetrackerlang" class="label">[% lbl.restriction %]</label>
+              <select class="select data_staff" id="timetrackerrestriction" data-column="timetrackerrestriction"  data-table="staff" data-id="" value="" name="staff_timetrackerrestriction">
+                <option value="">[% lbl.none %]</option>
+                <option value="onlyworkdays">[% lbl.onlyworkdays %]</option>
+                <option value="flexworktime">[% lbl.flexworktime %]</option>
+                <option value="strictworktime">[% lbl.strictworktime %]</option>
+              </select>
+            </div>
+            <div class="container quarter">
+              <label for="staff_timetrackerpin" class="label">[% lbl.fixtime %]</label>
+              <input type="number" class="input data_staff right-align" id="timetrackerfixtime" data-column="timetrackerfixtime" data-table="staff" data-id="" name="staff_timetrackerfixtime" value="" onblur="dataform.savefield(this,null);"/>
+            </div>
+          </div>
+          <div class="row">
+            <div class="container">
+              <label for="staff_timetrackers" class="label">[% lbl.timetrackers %]</label>
+              <select class="select data_staff" id="timetrackers" data-selected=""  data-column="timetrackers"  data-table="staff" data-id="" multiple value="" name="staff_timetrackers"></select>
             </div>
           </div>
           
         </div>
-        </form>
-<div class="bar moduletoolbar">
-    <div class="bar-item SubHeadTitle">[% lbl.contractdata %]</div>
-    [% IF session.usergroup != 'teamleader' %]
-      <button class="bar-item toolbarbtn right" id="btn_delete_staffcontract" onclick="staffcontract.remove(); return false;"><span class="icon icon-remove text-red"></span>[% lbl.delete %]</button>
-      <button class="bar-item toolbarbtn  right" onclick="staffcontract.edit(); return false;"><span class="icon icon-edit"></span>[% lbl.edit %]</button>
-      <button class="bar-item toolbarbtn right"  onclick="staffcontract.add(); return false;"><span class="icon icon-plus"></span>[% lbl.add %]</button> 
-      
-      [% END %]
-      <button class="bar-item toolbarbtn right"  onclick="staffcontract.updateStaffContractDays(); return false;"><span class="icon icon-week"></span>[% lbl.renewperiods %]</button> 
       </div>
-     
-        <div id="tbl_staffcontract" ></div>
+    </div>
+  </div>
+ </form>
+<div class="row">
+  <div class="half" style="border-right: 1px solid #c6c6c6;">
+    <div class="bar moduletoolbar">
+      <div class="bar-item SubHeadTitle">[% lbl.contractdata %]</div>
+        <button class="bar-item toolbarbtn right" id="btn_delete_staffcontract" onclick="staffcontract.remove(); return false;"><span class="icon icon-remove text-red"></span>[% lbl.delete %]</button>
+        <button class="bar-item toolbarbtn right" onclick="staffcontract.edit(); return false;"><span class="icon icon-edit"></span>[% lbl.edit %]</button>
+        <button class="bar-item toolbarbtn right"  onclick="staffcontract.add(); return false;"><span class="icon icon-plus"></span>[% lbl.add %]</button>
+        <button class="bar-item toolbarbtn right"  onclick="staffcontract.updateStaffContractDays(); return false;"><span class="icon icon-week"></span>[% lbl.renewperiods %]</button> 
+   </div>
+    <div id="tbl_staffcontract" ></div>
+  </div>
+  <div class="half">
+    <div class="bar moduletoolbar">
+      <div class="bar-item SubHeadTitle">[% lbl.vacancyyears %]</div>
+        <!-- <button class="bar-item toolbarbtn right" id="btn_delete_staffvacancy" onclick="staffvacancy.remove(); return false;"><span class="icon icon-remove text-red"></span>[% lbl.delete %]</button> -->
+        <button class="bar-item toolbarbtn right" onclick="staffvacancy.edityear(); return false;"><span class="icon icon-edit"></span>[% lbl.edit %]</button>
+        <!-- <button class="bar-item toolbarbtn right" onclick="staffvacancy.add(); return false;"><span class="icon icon-plus"></span>[% lbl.add %]</button>  -->
+   </div>
+    <div id="tbl_staffvacancyyears" ></div>
+  </div>
+</div>
+
 </div>
\ No newline at end of file
index 8d1913b..8ef64f8 100644 (file)
@@ -5,6 +5,7 @@ function initpage(){
   staffcontract.inittable();
   staffperiods.inittable();
   staffperiodweeks.inittable();
+  staffvacancy.inittable();
 }
 
 let staff ={
@@ -14,25 +15,42 @@ let staff ={
   current_id: null,
   current_view: 'basedata',
   staff_defaultgroup:null,
-  choices:{"id_staffgroup":null,"addstaff_id_staffgroup":null,"istimetrackenabled":null},
+  choices:{"id_staffgroup":null,"addstaff_id_staffgroup":null,"istimetrackenabled":null,"timetrackers":null,"timetrackerlang":null,"note":null,"timetrackerrestriction":null},
   initform: function(){
     flatpickr("#birthdate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
       onClose: function(selectedDates, dateStr, instance) {
         dataform.savefield(document.getElementById('birthdate'),null);
       },
     });
+    staff.choices["note"] = SUNEDITOR.create('note', {
+      defaultTag: "div",
+      mode: 'inline',
+      display: 'block',
+      width: '100%',
+      height: '100',
+      popupDisplay: 'full',
+      buttonList: [
+          ['bold', 'underline','italic','strike','fontSize','fontColor']
+      ],
+      placeholder: '[% lbl.notemsg %]'
+  });
+    staff.choices["note"].onBlur = function(e,core){
+      let notedata = staff.choices["note"].getContents(true);
+      console.log("Staff Note Contents",notedata);
+      dataform.savefielddata(document.getElementById('note'),staff.choices["note"].getContents(true),null);
+    }
     flatpickr("#addstaff_startdate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr"
+      "locale": "[% session.lang %]"
     });
     flatpickr("#addstaff_enddate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr"
+      "locale": "[% session.lang %]"
     });
     staff.choices["id_staffgroup"] = new SlimSelect({
       select: "#id_staffgroup",
@@ -47,6 +65,30 @@ let staff ={
       select: "#addstaff_id_staffgroup",
       showSearch: false,
     });
+    staff.choices["timetrackerrestriction"] = new SlimSelect({
+      select: "#timetrackerrestriction",
+      showSearch: false,
+      afterClose: function(){
+        //console.log("set timetrack");
+        dataform.savefield(document.getElementById('timetrackerrestriction'),null);
+      }
+    });
+    
+    staff.choices["timetrackers"] = new SlimSelect({
+      select: "#timetrackers",
+      showSearch: false,
+      afterClose: function(){
+        dataform.savefielddata(document.getElementById('timetrackers'),staff.choices["timetrackers"].selected(),null);
+      }
+    });
+    staff.choices["timetrackerlang"] = new SlimSelect({
+      select: "#timetrackerlang",
+      showSearch: false,
+      afterClose: function(){
+        //console.log("set timetrack");
+        dataform.savefield(document.getElementById('timetrackerlang'),null);
+      }
+    });
     staff.choices["istimetrackenabled"] = new SlimSelect({
       select: "#istimetrackenabled",
       showSearch: false,
@@ -66,12 +108,13 @@ let staff ={
     
   /* @preserve[% END %]*/
     staff.getstaffgroups();
+    staff.getTimeTrackers();
   },
   inittable: function(){
     staff.initform();
     staff.tbl = new Tabulator("#tbl_staff", {
       height: "calc(100vh - 56px)",
-      layout: "fitColumn",
+      layout: "fitDataStretch",
       selectable: 1,
       groupBy:["groupname"],
       groupStartOpen:[true],
@@ -134,7 +177,13 @@ let staff ={
   edit: function(){
     let udata = staff.tbl.getSelectedData();
     if (udata[0]) {
+      
       console.log("selstaff",udata[0]);
+      if (udata[0].istimetrackerenabled == "1"){
+        document.getElementById("timetrackerconfig").style.display="block";
+      } else {
+        document.getElementById("timetrackerconfig").style.display="none";
+      }
       if (udata[0].periodtypes == '<15'){
         document.getElementById("btnstaffeditperiod").style.display = "none";
       }else {
@@ -146,6 +195,8 @@ let staff ={
         dataform.fillformbydataclass2("staff",staff.choices,data.result.data,'dataform.savefield(this,null);');
         staffcontract.gettbldata();
         staffperiods.gettbldata();
+        staffvacancy.gettblyeardata();
+        staffvacancy.gettbldata();
         staff.setview(staff.current_view);
       });
     } else {
@@ -160,7 +211,6 @@ let staff ={
       flds["id"] = udata[0].id;
       flds["schemata"] = schemata;
       showinfodlg("[% lbl.delete %]","[% lbl.qdeletestaff %]",staff.removedata,flds,"<span class=\"icon-Save\"></span>[% lbl.delete %]","<span class=\"icon-remove\"></span>[% lbl.cancel %]");
-     
     }
   },
   removedata: function(data){
@@ -198,6 +248,11 @@ let staff ={
     });
     
   },
+  getTimeTrackers: function(){
+    postData("db.cgi",{"get":"getTimeTrackerList","schemata":schemata}).then(data => {
+      dataform.fillselectlist(staff.choices["timetrackers"],data.result.sqldata,'id','trackername');
+    });
+  },
   fillstaffgroups: function(data){
     dataform.fillselectlist(staff.choices["id_staffgroup"],data.sqldata,'id','groupname');
   },
@@ -212,5 +267,8 @@ let staff ={
     }
     app.viewpanel(viewname);
    }
+  },
+  cleanfingerprints: function(){
+    alert("Noch nicht aktiviert!\nPas activé pour l'instant!")
   }
 }
index 2a68c6f..bd95eba 100644 (file)
@@ -7,14 +7,13 @@ let staffcontract = {
     flatpickr("#startdate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
-      weekNumbers: true,
-      
+      "locale": "[% session.lang %]",
+      weekNumbers: true
     });
     flatpickr("#enddate",{altInput: true,
       altFormat: "d.m.Y",
       dateFormat: "Y-m-d",
-      "locale": "fr",
+      "locale": "[% session.lang %]",
       weekNumbers: true
     });
     
@@ -23,8 +22,8 @@ let staffcontract = {
     staffcontract.initform();
     
     staffcontract.tbl = new Tabulator("#tbl_staffcontract", {
-    headerFilterPlaceholder: "filter...",
-    height: "calc(100vh - 380px)",
+    headerFilterPlaceholder: "[% lbl.filter %]",
+    height: "calc(100vh - 435px)",
     layout: "fitDataFill",
     selectable: 1,
     rowContext:function(e, row){ e.preventDefault();},
@@ -34,7 +33,7 @@ let staffcontract = {
       {title: "[% lbl.weekhours_short %]",field: "weekhours",hozAlign: "right",headerSort: false},
       {title: "[% lbl.weekdays_short %]",field: "weekdays",hozAlign: "right", headerSort: false,formatter:"money",formatterParams:{decimal:",",thousand:".",symbol:" ",symbolAfter:"",precision:0}},
     ]
-});
+    });
 
   },
   gettbldata: function(){
@@ -69,7 +68,6 @@ let staffcontract = {
     }
     return false;
   },
-
   remove: function(){
     let udata = staffcontract.tbl.getSelectedData();
     if (udata[0]) {
@@ -83,8 +81,10 @@ let staffcontract = {
   removedata: function(data){
       postData("db.cgi",data).then(data => {
         staffcontract.gettbldata();
+        staffvacancy.gettblyeardata();
       }).catch(e => { console.log(e)});
       staffcontract.gettbldata();
+      staffvacancy.gettblyeardata();
   },
   save: function(){
     let flds=dataform.getformcontent('staffcontract',null);
@@ -102,6 +102,7 @@ let staffcontract = {
 
     postData("db.cgi",flds).then(data => {
       staffcontract.gettbldata();
+      staffvacancy.gettblyeardata();
       document.getElementById('dlg_staffcontract').style.display='none';
     }).catch(e => {document.getElementById('dlg_staffcontract').style.display='none';});
    
@@ -110,13 +111,16 @@ let staffcontract = {
   updateStaffContractDays(){
     showdataloaddlg('','<div class="xxlarge">[% lbl.waitmsg %]</div>');
     postData("db.cgi",{"fn":"setstaffcontractdays","schemata":schemata,"id_staff":staff.current_id}).then(data => {
+      staffvacancy.gettblyeardata();
       closedataloaddlg();
     }).catch(e => {
+      staffvacancy.gettblyeardata();
       closedataloaddlg();
     });
   },
   afterdeletecallback: function(){
     staffcontract.gettbldata();
-  },
+    staffvacancy.gettblyeardata();
+  }
 
 }
\ No newline at end of file
index 4b0e3ba..5a665d8 100644 (file)
@@ -16,15 +16,16 @@ let staffperiods = {
         {title: '<span style="font-size: 9pt;">[% lbl.start %]</span>',field: "startdate",headerSort:"datetime",formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""} },
         {title: '<span style="font-size: 9pt;">[% lbl.end %]</span>',field: "enddate",headerSort:"datetime",formatter:"datetime",formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""} },
         {title: '<span style="font-size: 9pt;">[% lbl.contract %]</span>', field:"contracthours",hozAlign:"right", headerSort: false},
-        {title: '<span style="font-size: 9pt;"[% lbl.work %]</span>', field:"workhours",hozAlign:"right",headerSort: false},
+        {title: '<span style="font-size: 9pt;">[% lbl.work %]</span>', field:"workhours",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;">[% lbl.recuperation_short %]</span>', field:"recuperationhours",hozAlign:"right",headerSort: false,formatter:periodRecupFormatter},
         {title: '<span style="font-size: 9pt;">[% lbl.vacancy %]</span>', field:"vacancynormal",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;">[% lbl.vacancyill2 %]</span>', field:"vacancyill",hozAlign:"right",headerSort: false},
+        {title: '<span style="font-size: 8pt;">[% lbl.vacancyextra2 %]</span>',width:65, field:"vacancyextra",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;"></span>[% lbl.total %]</span>', field:"totalhours",hozAlign:"right",headerSort: false,formatter:periodTotalFormatter},
         {title: '<span style="font-size: 9pt;">[% lbl.statementtransfered2 %]</span>', field:"transferedhours",hozAlign:"right",headerSort: false},
         {title: '<span style="font-size: 9pt;">[% lbl.supphourspayed2 %]</span>', field:"payedhours",hozAlign:"right",headerSort: false,headerVertical:true} ,
         {title: '<span style="font-size: 9pt;">[% lbl.finalstatementpot %]</span>', field:"hoursdiff",headerSort: false,hozAlign:"right"},
-        {title: '<span style="font-size: 9pt;">[% lbl.supp44h %]</span>', field:"suppvacancy44hours",hozAlign:"right",headerSort: false,headerVertical:true},
+        {title: '<span style="font-size: 9pt;">[% lbl.supp44h2 %]</span>', field:"suppvacancy44hours",hozAlign:"right",headerSort: false,headerVertical:true},
         {title: '<span style="font-size: 9pt;">[% lbl.suppsunwork %]</span>', field:"suppvacancysunwork",hozAlign:"right",headerSort: false,headerVertical:true},
         {title: '<span style="font-size: 9pt;">[% lbl.avgweek_short %]</span>', field:"avgtotalweekhours",hozAlign:"right",headerSort: false,formatter:periodAVGFormatter},
         {title: '<span style="font-size: 9pt;">[% lbl.validated %]</span>', field:"isvalidated",hozAlign:"center",headerSort: false,formatter:"tickCross", formatterParams:{allowEmpty:true,allowTruthy: false}}
diff --git a/app/tmpl/module/staff/staffvacancy.js b/app/tmpl/module/staff/staffvacancy.js
new file mode 100644 (file)
index 0000000..0d58ba4
--- /dev/null
@@ -0,0 +1,88 @@
+let staffvacancy = {
+  tblyears: null,
+  tbl: null,
+  inittable: function(){
+    staffvacancy.tblyears=new Tabulator("#tbl_staffvacancyyears", {
+      headerFilterPlaceholder: "[% lbl.filter %]",
+      height: "calc(100vh - 435px)",
+      layout: "fitDataFill",
+      selectable: 1,
+      rowContext:function(e, row){ e.preventDefault();},
+      columns: [
+        {title: "[% lbl.year %]",field: "vacyear",headerSort: false, width: 100},
+        {title: "[% lbl.vacancyhours %]", field: "vachours",headerSort: false}
+        
+      ]
+  });
+  staffvacancy.tbl=new Tabulator("#tbl_staffvacancy", {
+    headerFilterPlaceholder: "[% lbl.filter %]",
+    height: "calc(100vh - 90px)",
+    layout: "fitDataFill",
+    selectable: 1,
+    rowContext:function(e, row){ e.preventDefault();},
+    columns: [
+      {title: "[% lbl.year %]",field: "vacyear",headerFilter:"input",headerSort: true, width: 100},
+      {title: "[% lbl.date %]", field: "daydate",headerFilter:"input",hozAlign:"right",headerSort: true, width: 140,headerSort:"datetime",formatter:vacdateFormatter},
+      {title: "[% lbl.vacancy %]",field:"vacancyhours",hozAlign:"center",headerSort: false,formatter:vacformatter,bottomCalc:staffvacancy.getSumVacancy},
+      {title: "[% lbl.vacancyill %]",field:"vacillhours",hozAlign:"center",headerSort: false,formatter:vacformatter,bottomCalc:staffvacancy.getSumVacancy},
+      {title: "[% lbl.vacancyextra %]",field:"vacextrahours",hozAlign:"center",headerSort: false,formatter:vacformatter,bottomCalc:staffvacancy.getSumVacancy},
+      {title: "[% lbl.vacdescription %]",field:"description",formatter:"html"}
+    ]
+  });
+    
+  },
+  getSumVacancy: function(values, data, calcParams){
+    let mts = 0;
+    for (let m in values){
+      mts += timecalc.IntervalToMinutes(values[m]);
+    } 
+    return timecalc.MinutesToInterval(mts);
+  },
+  initform: function(){
+
+  },
+  gettblyeardata: function(){
+    postData("db.cgi", { "get": "getStaffVacancyYears","schemata":schemata,"id":staff.current_id}).then(data => {
+      if (data && data.result.sqldata) { 
+        staffvacancy.tblyears.setData(data.result.sqldata);
+      }
+    });    
+  },
+  gettbldata: function(){
+    postData("db.cgi", { "get": "getStaffVacancy","schemata":schemata,"id":staff.current_id}).then(data => {
+      if (data && data.result.sqldata) { 
+        staffvacancy.tbl.setData(data.result.sqldata);
+      }
+    });    
+  },
+  edityear: function(){
+    let udata = staffvacancy.tblyears.getSelectedData();
+    if (udata[0]) {
+      dataform.fillformbydataclass2("staffvacancyyear",{},{"ident_id_staffvacancyyear":udata[0].id,"vachours":udata[0].vachours});
+      app.viewdialog("staffvacancyyear");
+    }
+  },
+  saveyear: function(){
+    let flds=dataform.getformcontent('staffvacancyyear',null);
+    flds["ident_staffvacancyyear_id"] = flds["ident_staffvacancyyear_id_staffvacancyyear"];
+    delete flds["ident_staffvacancyyear_id_staffvacancyyear"];
+    //delete flds["null"];
+    
+    flds["fn"] ="saveform";flds["table"]="staffvacancyyear";
+    flds["schemata"]=schemata;
+    console.log("staffvacancyyear",flds);
+    postData("db.cgi",flds).then(data => {
+      staffvacancy.gettblyeardata();
+    document.getElementById('dlg_staffvacancyyear').style.display='none';
+    }).catch(e => {document.getElementById('dlg_staffvacancyyear').style.display='none';});
+   
+    return false;
+  }
+}
+
+let vacformatter = function(cell, formatterParams){
+  return cell.getValue();
+};
+let vacdateFormatter = function(cell, formatterParams){
+  return moment(cell.getValue()).format('dd, DD.MM.YYYY');
+};
index 47c27b1..67bcfe1 100644 (file)
 <!-- DLG BEGIN workplanday -->
     <div id="dlg_workplanday" class="modal">
       <div class="modal-content animate-top card-4">
-        <header>
+        <header style="margin-bottom: 0;">
           <span onclick="document.getElementById('dlg_workplanday').style.display='none'; return false;" class="button toolbarbtn display-topright" ><span class="icon icon-remove" style="font-size: 18px;"></span></span>
           <h2 id="dlg_workplanday_title">[% lbl.editday %] : <span class="xlarge" id="display_date"></span></h2>
         </header>
-        <div class="container">
+        <div class="display-container">
         <div id="workplanday_errmsg"></div>
         <!--<div id="workplanday_infomsg"></div>-->
         <form id="frm_workplandays">
           <input type="hidden" class="data_workplandays" id="id" name="ident_workplandays_id" value="">
-          <div class="container padding">
-            
-            <div class="row">
-              <div class="col half">
-              <fieldset>
-                <legend>[% lbl.workhours %]</legend>
-                <div class="container">
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input type="text" class="timefield data_workplandays" id="start1" name="workplandays_start1"  data-column="start1"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('start1');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                      </div>
-                      
-                    <label for="workplandays_start1" class="label">[% lbl.start %] 1</label>
+          <div class="display-container">
+            <table class="table border" border="1">
+              <tbody>
+                <tr><th class="moduletoolbar SubHeadTitle" colspan="4">[% lbl.workhours %]</th></tr>
+                <tr><th class="labelcol">Zeitraum 1</th>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                    <input class="timefield data_workplandays" data-column="start1" data-id="" style="display: inline;float: left;" placeholder="00:00"  data-table="workplandays" id="start1" name="workplandays_start1"  type="text" value="">
+                    <a class="inlinebtn" href="javascript:dataform.cleanfield('start1');" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                   </div>
-                  <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input type="text" class="timefield data_workplandays" id="end1" name="workplandays_end1"  data-column="end1"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                        <a class="inlinebtn" href="javascript:dataform.cleanfield('end1');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                      </div>
-                    <label for="workplandays_end1" class="label">[% lbl.end %] 1</label>
-                  </div>
-                  <div class="container cell">
-                  <div class="cell" style="width: 86px;">
-                    <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="total1" name="workplandays_total1" value="" disabled/>
-                     <label for="total1" class="label"[% lbl.total %] 1</label>
-                  </div>
-                  </div>
-                </div>
-                <div class="container">
-                  <div class="container cell" style="padding-left: 70px;">
-                            <div class="cell" style="width: 86px;">
-                              <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="interruptionhours" name="workplandays_interruptionhours" value="" disabled/>
-                              <label for="workplandays_interruptionhours" class="label"  style="font-weight: bold;">[% lbl.cutoff %]</label>
-                            </div>
-
-                  </div>
-                </div>
-                <div class="container">
-                    <div class="container cell">
-                        <div class="cell" style="width: 86px;">
-                          <input type="text" class="timefield data_workplandays" id="start2" name="workplandays_start2"  data-column="start2"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                          <a class="inlinebtn" href="javascript:dataform.cleanfield('start2');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                        </div>
-                      <label for="workplandays_start2" class="label">[% lbl.start %] 2</label>
+                  </td>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="end1" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="end1" name="workplandays_end1" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('end1');" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                    <div class="container cell">
-                        <div class="cell" style="width: 86px;">
-                          <input type="text" class="timefield data_workplandays" id="end2" name="workplandays_end2"  data-column="end2"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                          <a class="inlinebtn" href="javascript:dataform.cleanfield('end2');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                        </div>
-                      <label for="workplandays_end2" class="label">[% lbl.end %] 2</label>
+                  </td>
+                  <td class="resultcol">
+                    <input class="readonly" id="total1" name="total1" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr class="inforow"><td  class="labelcol">[% lbl.cutoff %]</td>
+                    <td style="font-size: 8pt;">
+                     &nbsp;
+                    </td>
+                    <td  style="text-align: right!important;">
+                    <input class="data_workplandays white text-black readonly" id="interruptionhours" name="workplandays_interruptionhours" style="width: 60px;display: inline;" type="text" value=""> </td>
+                    <td class="resultcol">&nbsp;</td>
+                </tr>
+                <tr><th class="labelcol">Zeitraum 2</th>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                    <input class="timefield data_workplandays" data-column="start2" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="start2" name="workplandays_start2" type="text" value="">
+                    <a class="inlinebtn" href="javascript:dataform.cleanfield('start2');" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                    <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="total2" name="workplandays_total2" value="" disabled/>
-                        <label for="total2" class="label"[% lbl.total %] 2</label>
-                      </div>
+                  </td>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="end2" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="end2" name="workplandays_end2"  type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('end2');" ><span class="icon icon-remove" style="font-size: 10px;"></span></a>
                     </div>
-                </div>
-                <div class="container">
-                  <div class="container cell" style="padding-left: 204px;">
-                    <div class="container cell">
-                          <div class="cell" style="width: 86px;">
-                              <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="dayhours" name="workplandays_dayhours" value="" disabled/>
-                              <label for="workplandays_dayhours" class="label" style="font-weight: bold;">[% lbl.totalday %]</label>
-                            </div>
-                        </div>
-
-                  </div>
-                </div>
-              </fieldset><!---->
-              </div>
-              <div class="col half">
-                <fieldset>
-                  <legend>[% lbl.pausehours %]</legend>
-                  <div class="container">
-                    <div class="container cell">
-                        <div class="cell" style="width: 86px;">
-                          <input type="text" class="timefield data_workplandays" id="pausestart1" name="workplandays_pausestart1"  data-column="pausestart1"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                          <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart1');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                        </div>
-                      <label for="workplandays_start1" class="label">[% lbl.start %] 1</label>
+                  </td>
+                  <td class="resultcol">
+                    <input class="readonly" id="total2" name="total2" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                
+                <tr>
+                  <th colspan="4" class="moduletoolbar">[% lbl.pauses %]</th>
+                </tr>
+                <tr>
+                  <th  class="labelcol">Zeitraum 1</th>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="pausestart1" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="pausestart1" name="workplandays_pausestart1" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart1');" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                    <div class="container cell">
-                        <div class="cell" style="width: 86px;">
-                          <input type="text" class="timefield data_workplandays" id="pauseend1" name="workplandays_pauseend1"  data-column="pauseend1"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                          <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend1');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                        </div>
-                      <label for="workplandays_end1" class="label">[% lbl.end %] 1</label>
+                  </td>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="pauseend1" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="pauseend1" name="workplandays_pauseend1" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend1');" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                    <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="pausetotal1" name="workplandays_pausetotal1" value="" disabled/>
-                        <label for="pausetotal2" class="label"[% lbl.total %] 1</label>
-                      </div>
+                  </td>
+                  <td class="resultcol">
+                    <input class="text-black readonly" id="pausetotal1" name="pausetotal1" style="text-align: right!important;border: 0px;background-color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr>
+                  <th class="labelcol">Zeitraum 2</th>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="pausestart2" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="pausestart2" name="workplandays_pausestart2"  type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart2');" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                  <div class="container">
-                      <div class="container cell">
-                          <div class="cell" style="width: 86px;">
-                            <input type="text" class="timefield data_workplandays" id="pausestart2" name="workplandays_pausestart2"  data-column="pausestart2"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                            <a class="inlinebtn" href="javascript:dataform.cleanfield('pausestart2');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                          </div>
-                        <label for="workplandays_start2" class="label">[% lbl.start %] 2</label>
-                      </div>
-                      <div class="container cell">
-                          <div class="cell" style="width: 86px;">
-                            <input type="text" class="timefield data_workplandays" id="pauseend2" name="workplandays_pauseend2"  data-column="pauseend2"  data-table="workplandays" data-id="" style="float: left;" placeholder="00:00" value="" />
-                            <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend2');"><span class="icon icon-remove" style="font-size: 10px;"></span></a>
-                          </div>
-                        <label for="workplandays_end2" class="label">[% lbl.end %] 2</label>
-                      </div>
-                      <div class="container cell">
-                      <div class="cell" style="width: 86px;">
-                        <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="pausetotal2" name="workplandays_pausetotal2" value="" disabled/>
-                        <label for="pausetotal2" class="label"[% lbl.total %] 2</label>
-                      </div>
+                  </td>
+                  <td>
+                    <div class="cell" style="width: 86px;">
+                      <input class="timefield data_workplandays" data-column="pauseend2" data-id="" style="float: left;" placeholder="00:00"  data-table="workplandays" id="pauseend2" name="workplandays_pauseend2" type="text" value="">
+                      <a class="inlinebtn" href="javascript:dataform.cleanfield('pauseend2');" ><span class="icon icon-remove" style=
+                      "font-size: 10px;"></span></a>
                     </div>
-                  </div>
-                  <div class="container">
-                  <div class="container cell" style="padding-left: 204px;">
-                    <div class="container cell">
-                          <div class="cell" style="width: 86px;">
-                            <input type="text" class="data_workplandays white text-black readonly " style="width: 60px;" id="pause" name="workplandays_pause" value="" disabled/>
-                            <label for="workplandays_pause" class="label"  style="font-weight: bold;">[% lbl.totalpause %]</label>
-                          </div>
-                        </div>
-
-                  </div>
-                </div>
-                </fieldset><!---->
-                </div>
-              </div>
-             
+                  </td>
+                  <td class="resultcol"><input class="readonly" id="pausetotal2" name="pausetotal2" style="text-align: right;border: 0px; background-color: #fff!important;" type="text" value=""></td>
+                </tr>
+                <tr class="resultrow">
+                  <th class="labelcol">[% lbl.totalpause %]</th>
+                  <td colspan="2">&nbsp;
+                  </td>
+                  <td class="resultcol">
+                      <input class="data_workplandays readonly" id="pause" name="workplandays_pause" style="text-align: right;font-weight: normal;background-color: #484848!important;border: 0px;color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+                <tr class="resultrow" style="border-top: 2px solid black;">
+                  <th class="labelcol">[% lbl.totalwork %]</th>
+                  <td  colspan="2">&nbsp;</td>
+                  <td class="resultcol">
+                    <input class="data_workplandays readonly wdaytotal" id="dayhours" name="workplandays_dayhours" style="text-align: right;font-weight: bold;background-color: #484848!important;border: 0px;color: #fff!important;" type="text" value="">
+                  </td>
+                </tr>
+              </tbody>
+              </table>
           </div>
         </form>
       </div>
-      <footer>
+      <footer style="margin-top: 0px;">
         <button class="button theme-light margin-right border" onclick="document.getElementById('dlg_workplanday').style.display='none'; return false;"><span class="icon icon-remove"></span>[% lbl.cancel %]</button>
         <button class="button actionbtn margin-right border" id="btn_saveday" onclick="workplans.save();return false;"><span class="icon icon-Save"></span>[% lbl.save %]</button>
       </footer>
index f765367..c7f36cc 100644 (file)
@@ -20,7 +20,7 @@ let workplans ={
   },
   inittable: function(){
     workplans.tblfilter = new Tabulator("#tbl_workplans", {
-      headerFilterPlaceholder: "filter...",
+      headerFilterPlaceholder: "[% lbl.filter %]",
       height: "calc(100vh - 56px)",
       layout: "fitDataFill",
       selectable: 1,
@@ -39,7 +39,7 @@ let workplans ={
       ]
   });
     workplans.tbl = new Tabulator("#tbl_workplandata", {
-      headerFilterPlaceholder: "filter...",
+      headerFilterPlaceholder: "[% lbl.filter %]",
       height: "calc(100vh - 111px)",
       layout: "fitDataFill",
       selectable: 1,
diff --git a/ipad/Import.log b/ipad/Import.log
deleted file mode 100644 (file)
index 288d484..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Timestamp   Filename        Error   Message\r
-2021-01-11 19:49:30.488 +0100  POT.fmp12       0       Import of script steps from clipboard started\r
-2021-01-11 19:49:30.504 +0100  Startup 0       script steps imported : 1\r
-2021-01-11 19:49:30.504 +0100  POT.fmp12       0       Import completed\r
diff --git a/ipad/POT.fmp12 b/ipad/POT.fmp12
deleted file mode 100644 (file)
index 7de0d74..0000000
Binary files a/ipad/POT.fmp12 and /dev/null differ